m3u8文件AVAssetImageGenerator错误

时间:2015-08-20 07:36:23

标签: ios avfoundation avplayer avassetimagegenerator

我正在使用AVPlayer播放.m3u8文件。 使用AVAssetImageGenerator使用以下代码从中提取图像:

AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:mp.contentURL options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
img = [[UIImage alloc] initWithCGImage:oneRef];

它总是给我错误:

  

错误域= AVFoundationErrorDomain代码= -11800"操作无法完成" UserInfo = 0x7fb4e30cbfa0 {NSUnderlyingError = 0x7fb4e0e28530"操作无法完成。 (OSStatus错误-12782。)",NSLocalizedFailureReason =发生未知错误(-12782),NSLocalizedDescription =操作无法完成}

适用于mp4,mov和所有主要视频扩展程序网址,但不适用于m3u8。有什么想法??

3 个答案:

答案 0 :(得分:8)

您的问题只是预料之中。 .m3u8文件不是实际的资产文件,而是更类似于播放列表。它们用于HTTP直播流,并为"段和#34;提供位置。基于可用带宽。

这是一个.m3u8文件(Apple's sample .m3u8 file

的示例
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
gear1/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
gear2/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
gear3/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
gear4/prog_index.m3u8

不幸的是,您无法创建AVAsset或AVURLAsset来表示HTTP Live流中的媒体。参考:Apple's reference example of Asset Loading/playing

答案 1 :(得分:7)

您无法使用AVAssetImageGenerator获取实时流的静态图像。相反,您可以使用

  

AVPlayerItemVideoOutput

使用AVPlayerItemVideoOutput,您可以使用以下方法获取适合在给定.m3u8流的指定时间显示的图像:- (CVPixelBufferRef)copyPixelBufferForItemTime:(CMTime)itemTime itemTimeForDisplay:(CMTime *)outItemTimeForDisplay然后,您可以将返回的CVPixelBufferRef转换为图像(或其他)用于显示。

答案 2 :(得分:0)

我们的发现是,如果您播放的HLS流具有" I-Frame仅播放列表",例如流“https://tungsten.aaplimg.com/VOD/bipbop_adv_example_v2/master.m3u8”(仅具有I帧播放列表),AVAssetImageGenerator可以逐个生成请求的图像。

但是请注意"它只适用于iOS8.X和iOS9.X",但在iOS10.X上失败。

我已向Apple Bug Reporter提交了错误报告。