我正在使用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];它总是给我带来错误:
错误Domain=AVFoundationErrorDomain代码=-11800“操作无法完成”UserInfo=0x7fb4e30cbfa0 {NSUnderlyingError=0x7fb4e0e28530“操作无法完成。(OSStatus错误-12782.)",发生NSLocalizedFailureReason=An未知错误(-12782),NSLocalizedDescription=The操作无法完成}
它适用于mp4、mov和所有主要的视频扩展URL,但不适用于m3u8。知道吗??
发布于 2015-10-12 06:42:28
您将无法使用AVAssetImageGenerator获取活动流的静态图像。相反,您可以使用
AVPlayerItemVideoOutput
使用AVPlayerItemVideoOutput,您可以使用以下方法获得适合在指定时间为给定.m3u8流显示的图像:然后,可以将返回的CVPixelBufferRef转换为图像(或其他图像)以供显示。
发布于 2015-08-26 15:05:07
你的问题是意料之中的。.m3u8文件不是实际的资产文件,而是更类似于播放列表。它们用于HTTP流,并根据可用带宽为“段”提供位置。
下面是一个.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不幸的是,您不能创建一个AVAsset或AVURLAsset来表示HTTP流中的媒体。参考资料:Apple的资产加载/播放参考示例
发布于 2017-01-13 03:40:26
我们的发现是,如果您播放具有“i帧只播放列表”的HLS流,例如流“v2/master.m3u8 .m3u8”(只有i帧播放列表),AVAssetImageGenerator可以逐个生成请求的图像。
但请注意,“仅在iOS8.X和iOS9.X上没有问题”,但在iOS10.X上失败了。
我已经向苹果bug记者提交了一份Bug报告。
https://stackoverflow.com/questions/32112205
复制相似问题