m3u8文件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和所有主要的video扩展URL,但不适用于m3u8。 任何想法??

你的问题只是预料之中。 .m3u8文件不是实际的资产文件,而是更类似于播放列表。 它们用于HTTP Live Streaming,并基于可用带宽提供“Segments”的位置。

这里是一个.m3u8文件的例子( 苹果的例子.m3u8文件 )

 #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 

不幸的是,您无法创buildAVAsset或AVURLAsset来表示HTTP Livestream中的媒体。 参考资料: 苹果参考资料加载/播放的例子

您将无法使用AVAssetImageGenerator获取静态图像。 相反,你可以使用

AVPlayerItemVideoOutput

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

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

但请注意,“在iOS8.X和iOS9.X上只能这样”,但在iOS10.X上失败。

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