m3u8文件AVAssetImageGenerator错误

obj*_*per 15 avfoundation ios 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];
Run Code Online (Sandbox Code Playgroud)

它总是给我错误:

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

它适用于mp4,mov和所有主要视频扩展URL但不适用于m3u8.任何的想法??

MDB*_*983 8

你的问题只是预料之中的..m3u8文件不是实际的资产文件,而是更类似于播放列表.它们用于HTTP实时流媒体,并根据可用带宽为"分段"提供位置.

这是.m3u8文件的示例(Apple的示例.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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,您无法创建AVAsset或AVURLAsset来表示HTTP Live流中的媒体.参考:Apple的资产加载/播放的参考示例

  • 同意,但如果我需要屏幕截图怎么办?你知道其他方法吗? (3认同)

obj*_*per 7

您将无法使用AVAssetImageGenerator获取实时流的静止图像.相反,你可以使用

AVPlayerItemVideoOutput

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