2014-09-30 86 views
1

我正在寻找在我的iOS应用程序中播放视频文件的最佳方式。我的应用程序目前正在开发中,将会有大约50个视频(每个30秒长)和简短的教程。如果可能的话,我希望它们都是本地的,所以用户可以在没有互联网连接的情况下观看视频。我无法找到堆栈溢出的类似问题(也许我在错误的部分查找,请纠正我,如果我错了)。在iOS应用程序中使用本地视频文件(xcode)

所以我在想2个不同的选择:从商店

  • 用户下载的应用程序,包括视频
  • 用户下载的应用程序没有视频,必须先下载视频使用的应用程序时,第一次保存 本地(永久)

如果有更好的选择,我也想知道它们!所以如果有人有这方面的经验,我真的很感谢一些帮助!谢谢

+0

让我知道如果下来的答案不是你在找什么。 将很乐意改变或删除。 – 2014-10-05 14:24:32

+0

@ rahul_send89非常感谢您的回答!我会尝试在我的应用中实现这一点,看看这是否真的是我正在寻找的,如果是的话,我会接受你的答案。 – colin 2014-10-06 07:17:47

回答

3

根据用户的观点,人们更喜欢离线模式。并希望从AppStore下载应用程序时应用程序的大小尽可能低。 所以我的建议是建立既具有选项流文件,而用户在线播放和下载离线或缓存文件,视频播放器..

一个办法是:

使用一个Web服务器

简单的Java服务器的例子:
https://github.com/mooncatventures-group/StreamX
检查:http://www.onlinevideo.net/2011/05/streaming-vs-progressive-download-vs-adaptive-streaming/

它更好地建立一个应用程序,让应用程序从应用程序商店下载后,用户可以下载和存储应用程序内容 。 应用程序应该可以选择删除应用程序下载的视频或清除缓存。

down是一个可以同时播放离线和在线视频的视频播放器的例子。

创建自定义的电影播放..


//CustomMoviePlayerViewController.h File 
#import <UIKit/UIKit.h> 
#import <MediaPlayer/MediaPlayer.h> 

@interface CustomMoviePlayerViewController : UIViewController 
{ 
    MPMoviePlayerController *mp; 
    NSURL *movieURL; 
} 

- (id)initWithPath:(NSString *)moviePath; 
- (id)initWithURL:(NSString *)moviePath; 
- (void)readyPlayer; 

@end 

CustomMoviePlayerViewController.m文件

#import "CustomMoviePlayerViewController.h" 

#pragma mark - 
#pragma mark Compiler Directives & Static Variables 

@implementation CustomMoviePlayerViewController 

/*--------------------------------------------------------------------------- 
* 
*--------------------------------------------------------------------------*/ 
- (id)initWithPath:(NSString *)moviePath 
{ 
    // Initialize and create movie URL 
    if (self = [super init]) 
    { 
     movieURL = [NSURL fileURLWithPath:moviePath];  
    [movieURL retain]; 
    } 
    return self; 
} 
- (id)initWithURL:(NSString *)moviePath{ 
    // Initialize and create movie URL 
    if (self = [super init]) 
    { 
     movieURL = [NSURL URLWithString:moviePath];  
     [movieURL retain]; 
    } 
    return self; 

} 

/*--------------------------------------------------------------------------- 
* For 3.2 and 4.x devices 
* For 3.1.x devices see moviePreloadDidFinish: 
*--------------------------------------------------------------------------*/ 
- (void) moviePlayerLoadStateChanged:(NSNotification*)notification 
{ 
    // Unless state is unknown, start playback 
    if ([mp loadState] != MPMovieLoadStateUnknown) 
    { 
    // Remove observer 
    [[NSNotificationCenter defaultCenter] 
                removeObserver:self 
           name:MPMoviePlayerLoadStateDidChangeNotification 
           object:nil]; 

    // When tapping movie, status bar will appear, it shows up 
    // in portrait mode by default. Set orientation to landscape 
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; 

     // Rotate the view for landscape playback 
     [[self view] setBounds:CGRectMake(0, 0, 480, 320)]; 
     [[self view] setCenter:CGPointMake(160, 240)]; 
     [[self view] setTransform:CGAffineTransformMakeRotation(M_PI/2)]; 

     // Set frame of movieplayer 
     [[mp view] setFrame:CGRectMake(0, 0, 480, 320)]; 

    // Add movie player as subview 
     [[self view] addSubview:[mp view]]; 

     // Play the movie 
     [mp play]; 
    } 
} 

/*--------------------------------------------------------------------------- 
* For 3.1.x devices 
* For 3.2 and 4.x see moviePlayerLoadStateChanged: 
*--------------------------------------------------------------------------*/ 
- (void) moviePreloadDidFinish:(NSNotification*)notification 
{ 
    // Remove observer 
    [[NSNotificationCenter defaultCenter] 
                removeObserver:self 
          name:MPMoviePlayerContentPreloadDidFinishNotification 
          object:nil]; 

    // Play the movie 
    [mp play]; 
} 

/*--------------------------------------------------------------------------- 
* 
*--------------------------------------------------------------------------*/ 
- (void) moviePlayBackDidFinish:(NSNotification*)notification 
{  
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 

    // Remove observer 
    [[NSNotificationCenter defaultCenter] 
               removeObserver:self 
          name:MPMoviePlayerPlaybackDidFinishNotification 
          object:nil]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

/*--------------------------------------------------------------------------- 
* 
*--------------------------------------------------------------------------*/ 
- (void) readyPlayer 
{ 
    mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 

    if ([mp respondsToSelector:@selector(loadState)]) 
    { 
    [mp setMovieSourceType:MPMovieSourceTypeFile]; 
    // Set movie player layout 
    [mp setControlStyle:MPMovieControlStyleFullscreen]; 
    [mp setFullscreen:YES]; 

     // May help to reduce latency 
     [mp prepareToPlay]; 

     // Register that the load state changed (movie is ready) 
     [[NSNotificationCenter defaultCenter] addObserver:self 
         selector:@selector(moviePlayerLoadStateChanged:) 
         name:MPMoviePlayerLoadStateDidChangeNotification 
         object:nil]; 
    } 
    else 
    { 
    // Register to receive a notification when the movie is in memory and ready to play. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
         selector:@selector(moviePreloadDidFinish:) 
         name:MPMoviePlayerContentPreloadDidFinishNotification 
         object:nil]; 
    } 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
         selector:@selector(moviePlayBackDidFinish:) 
         name:MPMoviePlayerPlaybackDidFinishNotification 
         object:nil]; 
} 

/*--------------------------------------------------------------------------- 
* 
*--------------------------------------------------------------------------*/ 
- (void) loadView 
{ 
    [self setView:[[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]]; 
    [[self view] setBackgroundColor:[UIColor blackColor]]; 
} 

/*--------------------------------------------------------------------------- 
* 
*--------------------------------------------------------------------------*/ 
- (void)dealloc 
{ 
    [mp release]; 
    [movieURL release]; 
    [super dealloc]; 
} 

@end 

让您的播放器查看可见当u点击TableListView细胞。

//- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *filePath = [NSString stringWithFormat:@"%@",[documentsDirectory stringByAppendingPathComponent:[item valueForKey:@"URL"]]]; 
     bool b=[[NSFileManager defaultManager] fileExistsAtPath:filePath]; 

CustomMoviePlayerViewController *moviePlayer; 

if (b) { 
    moviePlayer = [[[CustomMoviePlayerViewController alloc] initWithPath:filePath] autorelease]; 
    [self presentModalViewController:moviePlayer animated:YES]; 
    [moviePlayer readyPlayer]; 
}else{ 
    NSDictionary *item = [tableData objectAtIndex:[indexPath row]]; 
    NSString *strURL = [NSString stringWithFormat:[item valueForKey:@"URL"]]; 
    moviePlayer = [[[CustomMoviePlayerViewController alloc] initWithURL:strURL] autorelease]; 
    [self presentModalViewController:moviePlayer animated:YES]; 
    [moviePlayer readyPlayer]; 
} 

制作URL下载器。保存文件。

https://github.com/AFNetworking/AFNetworking

-(void)downloadFile:(NSString *)UrlAddress 
{ 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:UrlAddress]]; 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
NSString *fileName = UrlAddress; 

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Successfully downloaded file to %@", path); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 

    NSLog(@"Download = %f", (float)totalBytesRead/totalBytesExpectedToRead); 

}]; 
[operation start]; 
} 

因此,这将允许你保存文件并播放+播放预加载的文件,这已经是你的应用程序中存在。

相关问题