我正在使用AVQueuePlayer来播放我们应用程序中的视频列表。我正在尝试缓存AVQueuePlayer播放的视频,这样视频就不必每次下载。
所以,在视频播放完毕后,我尝试将AVPlayerItem保存到磁盘中,以便下次使用本地URL初始化它。
我试图通过两种方法来实现这一点:
1) AVAssetExportSession方法
这种方法的工作方式如下:
AVPlayerItem何时使用AVPlayerItemDidPlayToEndTimeNotification完成播放。AVAssetExportSession将视频导出到磁盘中的文件中。守则:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
然后
- (void)videoDidFinishPlaying:(NSNotification*)note { AVPlayerItem *itemToSave = [note object]; AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:itemToSave.asset presetName:AVAssetExportPresetHighestQuality]; exportSession.outputFileType = AVFileTypeMPEG4; exportSession.outputURL = [NSURL fileURLWithPath:@"/path/to/Documents/video.mp4"]; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch(exportSession.status){ case AVAssetExportSessionStatusExporting: NSLog(@"Exporting..."); break; case AVAssetExportSessionStatusCompleted: NSLog(@"Export completed, wohooo!!"); break; case AVAssetExportSessionStatusWaiting: NSLog(@"Waiting..."); break; case AVAssetExportSessionStatusFailed: NSLog(@"Failed with error: %@", exportSession.error); break; } }
该代码在控制台中的结果是:
Failed with error: Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x98916a0 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x99ddd10 "The operation couldn’t be completed. (OSStatus error -12109.)", NSLocalizedFailureReason=An unknown error occurred (-12109)}2) AVAssetReader、AVAssetWriter方法
守则:
- (void)savePlayerItem:(AVPlayerItem*)item { NSError *assetReaderError = nil; AVAssetReader *assetReader = [[AVAssetReader alloc] initWithAsset:assetToCache error:&assetReaderError]; //(algorithm continues) }
当试图使用以下信息分配/init AVAssetReader时,该代码将引发异常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of AVAssetReader with an asset at non-local URL 'https://someserver.com/video1.mp4'' ***
任何帮助都是非常感谢的。
发布于 2017-10-21 06:03:34
我最后是如何设法做到这一点的,就是创建通常为AVPlayer > AVPlayerItem > AVURLAsset的数组。同时,在AVExportSession完全从远程URL加载视频之前,立即创建一个AVPlayer。
实际上,当AVExportSession试图预缓冲AVPlayer时,AVPlayer将缓慢地导出。这与用户是否开始播放AVPlayer无关。但是,直到整个URL被预缓冲之后,输出文件才会真正完成。此时,AVExportSession将在完成时回调。这也完全独立于用户是否正在播放,或是否已完成播放视频。
因此,通过早期创建AVPlayer/AVExportSession组合,它成为了我的预缓冲机制。
- 2018-01-10 --
要在部署了上述机制之后添加该机制。我们遇到了一个很大的警告,我认为值得提一下。
内存中不可能有太多的视频管道(带有AVPlayerItem/AVAsset的AVPlayer)。AVFoundation将拒绝参加比赛。因此,请使用上述机制进行预缓冲。但是,一旦视频被下载到一个文件中,如果用户没有观看该视频,请取消AVPlayer/AVAsset。当用户决定再次播放视频时,重新分配一个AVPlayer,这次AVURLAsset指向视频的本地缓冲副本。
https://stackoverflow.com/questions/22822643
复制相似问题