使用 MPMoviePlayerViewController 来自文档目录的视频

Posted

技术标签:

【中文标题】使用 MPMoviePlayerViewController 来自文档目录的视频【英文标题】:video from document directory using MPMoviePlayerViewController 【发布时间】:2017-11-09 07:45:40 【问题描述】:

我正在尝试将视频保存到文档目录并再次播放。当我可以离线保存视频并离线播放时,我正在做类似 youtube 或 hotstar 之类的应用程序。

第 1 步:我从 api 获取视频 url,并将其转换为数据并使用此代码将其保存到文档目录。

-(void)downloadVideoAndSave :(NSString*)videoUrl videoname:(NSString *)name
 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    NSLog(@"Downloading Started");
    NSString *urlToDownload =videoUrl;
    NSURL  *url = [NSURL URLWithString:urlToDownload];
    NSData *urlData = [NSData dataWithContentsOfURL:url];
    if ( urlData )
    
        NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat:@"%@/%@%@", documentsDirectory,name,@".mp4"];

        //saving is done on main thread
        dispatch_async(dispatch_get_main_queue(), ^
            [urlData writeToFile:filePath atomically:YES];
            NSLog(@"File Saved !");
        );
    

);

2.现在,当用户处于脱机状态时,我从文档目录中获取该视频,我正在尝试使用 MPMoviePlayerViewController 播放它们。但它没有解决。我正在使用下面的代码来做到这一点

-(void)playVideo:(UIButton*)sender 

NSURL *vedioURL;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
NSLog(@"files array %@", filePathsArray);

NSString *fullpath;
Store *info=[savedData objectAtIndex:sender.tag];

 NSString *videonamestr= info.videoname;
NSString *videofillname=[NSString stringWithFormat:@"/%@.mp4",videonamestr];
NSString  *filePath = [NSString stringWithFormat:@"%@/%@%@", documentsDirectory,videonamestr,@".mp4"];
 //fullpath = [documentsDirectory stringByAppendingPathComponent:videofillname];
// vedioURL =[NSURL fileURLWithPath:fullpath];
NSFileManager *fileManager = [NSFileManager defaultManager];

if ([fileManager fileExistsAtPath: fullpath]) //4

    NSLog(@"videoexists");
    //NSString *bundle = [[NSBundle mainBundle] pathForResource:filename ofType:@"plist"]; //5

    //[fileManager copyItemAtPath:bundle toPath:path error:&error]; //6

//    for ( NSString *apath in filePathsArray )
//    
//        fullpath = [documentsDirectory stringByAppendingPathComponent:apath];
//        vedioURL =[NSURL fileURLWithPath:fullpath];
//    
NSLog(@"vurl %@",filePath);

//    for (Store *items in savedData) 
//        [self downloadVideoAndSave:items.videopath];

//        NSLog(@"\n mobile data  %@\n",items.videopath);
//        
    UIStoryboard *story=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
    PlayerViewController *playerVC=[story instantiateViewControllerWithIdentifier:@"playerViewController"];
    playerVC.comingString = filePath;
    [self presentViewController:playerVC animated:NO completion:nil];

 // 


 

3.在下一个vc mpmoviewolayer

NSURL *fileUrl = [NSURL URLWithString:self.comingString];

self.moviePlayerViewController = [[MPMoviePlayerViewController alloc]initWithContentURL:fileUrl];

self.moviePlayerViewController.moviePlayer.fullscreen = NO;
[self.moviePlayerViewController.moviePlayer play];
self.moviePlayerViewController.moviePlayer.repeatMode = NO;
self.moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;

[self.view addSubview:self.moviePlayerViewController.view];
[self presentViewController:self.moviePlayerViewController animated:NO completion:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

请帮我解决这个问题以及我在哪里犯了错误。请不要在这种情况下标记,请回答。感谢您的快速响应。

【问题讨论】:

这行if ([fileManager fileExistsAtPath: fullpath])不应该是if ([fileManager fileExistsAtPath: filepath])吗?你知道mp4确实存在吗 【参考方案1】:

在你的 playerVC 这行...

NSURL *fileUrl = [NSURL URLWithString:self.comingString];

应该是

[NSURL fileURLWithPath:self.comingString];

【讨论】:

谢谢 flexcioder 是否有任何其他存储视频的方式,您可以在其中暂停重新下载和视频进度百分比。 @SatheeshkumarNaidu 这回答了你的问题吗?如果是这样,请将其标记为已回答,以便其他搜索者可以看到。您的评论听起来像是另一个问题,应该单独提出

以上是关于使用 MPMoviePlayerViewController 来自文档目录的视频的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份