17

我正在使用 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 Code=-11800“操作无法完成”UserInfo=0x7fb4e30cbfa0 {NSUnderlyingError=0x7fb4e0e28530“操作无法完成。(OSStatus错误-12782。)”,NSLocalizedFailureReason=发生未知错误(-12782 ), NSLocalizedDescription=操作无法完成}

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

4

3 回答 3

10

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

这是 .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

不幸的是,您不能创建 AVAsset 或 AVURLAsset 来表示 HTTP 实时流中的媒体。参考:Apple 的 Asset Loading/playing 参考示例

于 2015-08-26T15:05:07.513 回答
7

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

AVPlayerItemVideoOutput

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

于 2015-10-12T06:42:28.163 回答
0

我们的发现是,如果您播放具有“仅 I-Frame 播放列表”的 HLS 流,例如流“<a href="https://tungsten.aaplimg.com/VOD/bipbop_adv_example_v2/master.m3u8" rel= "nofollow noreferrer">https://tungsten.aaplimg.com/VOD/bibpbop_adv_example_v2/master.m3u8”(有I-frame only playlist), AVAssetImageGenerator 可以一张一张生成请求的图片。

但请注意“仅在iOS8.X 和iOS9.X 上正常”,但在iOS10.X 上失败。

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

于 2017-01-13T03:40:26.617 回答