首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法导出AVPlayerItem

无法导出AVPlayerItem
EN

Stack Overflow用户
提问于 2014-04-02 20:44:07
回答 1查看 1.3K关注 0票数 1

我正在使用AVQueuePlayer来播放我们应用程序中的视频列表。我正在尝试缓存AVQueuePlayer播放的视频,这样视频就不必每次下载。

所以,在视频播放完毕后,我尝试将AVPlayerItem保存到磁盘中,以便下次使用本地URL初始化它。

我试图通过两种方法来实现这一点:

  1. 使用AVAssetExportSession
  2. 使用AVAssetReader和AVAssetWriter。

1) AVAssetExportSession方法

这种方法的工作方式如下:

  1. 观察AVPlayerItem何时使用AVPlayerItemDidPlayToEndTimeNotification完成播放。
  2. 当收到上面的通知(视频播放完毕,所以它被完全下载)时,使用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; } }

该代码在控制台中的结果是:

代码语言:javascript
复制
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'' ***

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 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指向视频的本地缓冲副本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22822643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档