gpt4 book ai didi

iphone - 使用 AVPlayer 和 AVAssetExportSession 进行缓存

转载 作者:技术小花猫 更新时间:2023-10-29 11:21:16 38 4
gpt4 key购买 nike

我想使用 AVPlayer 缓存渐进式下载视频。如何将 AVPlayer 的项目保存到磁盘?我正在尝试在播放器的 currentItem(已满载)上使用 AVAssetExportSession。这段代码给我“AVAssetExportSessionStatusFailed(操作无法完成)”:

    AVAsset *mediaAsset = self.player.currentItem.asset;

AVAssetExportSession *es = [[AVAssetExportSession alloc] initWithAsset:mediaAsset presetName:AVAssetExportPresetLowQuality];

NSString *outPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"out.mp4"];

NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:outPath error:NULL];

es.outputFileType = @"com.apple.quicktime-movie";
es.outputURL = [[[NSURL alloc] initFileURLWithPath:outPath] autorelease];
NSLog(@"exporting to %@",outPath);
[es exportAsynchronouslyWithCompletionHandler:^{
NSString *status = @"";

if( es.status == AVAssetExportSessionStatusUnknown ) status = @"AVAssetExportSessionStatusUnknown";
else if( es.status == AVAssetExportSessionStatusWaiting ) status = @"AVAssetExportSessionStatusWaiting";
else if( es.status == AVAssetExportSessionStatusExporting ) status = @"AVAssetExportSessionStatusExporting";
else if( es.status == AVAssetExportSessionStatusCompleted ) status = @"AVAssetExportSessionStatusCompleted";
else if( es.status == AVAssetExportSessionStatusFailed ) status = @"AVAssetExportSessionStatusFailed";
else if( es.status == AVAssetExportSessionStatusCancelled ) status = @"AVAssetExportSessionStatusCancelled";

NSLog(@"done exporting to %@ status %d = %@ (%@)",outPath,es.status, status,[[es error] localizedDescription]);
}];

如何导出成功?我正在考虑将 mediaAsset 复制到 AVMutableComposition 中,但也不太顺利。

谢谢!

PS:以下是试图完成同样事情的人提出的一些问题(但使用 MPMoviePlayerController):

最佳答案

我还没有使用 iOS 4.3 SDK,但我很想知道 mediaAsset.exportable 在 4.3 下的值(value),如下所述:

http://developer.apple.com/library/ios/#releasenotes/AudioVideo/RN-AVFoundation/_index.html#//apple_ref/doc/uid/TP40010717-CH1-SW4

我已尝试对您的代码进行一些修改,例如从可用列表中获取预设名称和文件类型,但我遇到了与您相同的错误。

所以,我决定尝试一个较低级别的框架,因为文档指出您可以连接一个 AVAssetReader 和一个 AVAssetWriter 以获得与 AVAssetExportSession 相同的效果,除了更多的控制。但是,下面的代码:

NSError *readerError = nil;
AVAssetReader *reader =
[AVAssetReader assetReaderWithAsset:mediaAsset error:&readerError];
if (readerError) NSLog(@"Error instantiating asset reader: %@",
[readerError localizedDescription]);

给出以下输出:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of
AVAssetReader with an asset at non-local URL 'http://example.com/test.mp3''

请注意,我使用有效的 URL 对此进行了测试,但已将其替换为上面的假网址。在我看来,iOS 不支持我们正在寻找的功能。据我所知,AVAssetExportSession 在底层使用了一个 AVAssetReader,并且在它失败时只报告一个描述性要低得多的错误。如果他们只是这样记录它肯定会很好。 AVAssetExportSession 的文档没有提及任何关于 Assets 需要是本地的:

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAssetExportSession_Class/Reference/Reference.html#//apple_ref/occ/cl/AVAssetExportSession

我知道这不是一个很好的答案,但它会稍微插入调查。我仍然真的希望有某种方法可以做到这一点,因为显然我们并不是唯一需要该功能的人。

关于iphone - 使用 AVPlayer 和 AVAssetExportSession 进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259095/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com