Ошибка файла AVAssetImageGenerator в файле m3u8

Я использую 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 Code=-11800 "Операция не может быть завершена" UserInfo=0x7fb4e30cbfa0 {NSUnderlyingError=0x7fb4e0e28530 "Операция не может быть завершена. (Ошибка OSStatus -12782.)", Произошла NSLocalizedFailureReason= причина-ошибка-NS2), NSLocalizedDescription= Операция не может быть завершена}

Он работает для mp4,mov и всех основных URL расширений видео, но не для m3u8. Любая идея??

3 ответа

Решение

Вы не сможете получить неподвижные изображения для прямой трансляции с помощью AVAssetImageGenerator. Вместо этого вы можете использовать

AVPlayerItemVideoOutput

С AVPlayerItemVideoOutput вы можете получить изображение, которое подходит для отображения в указанное время для данного потока.m3u8, используя следующий метод: - (CVPixelBufferRef)copyPixelBufferForItemTime:(CMTime)itemTime itemTimeForDisplay:(CMTime *)outItemTimeForDisplay Затем вы можете преобразовать возвращенный CVPixelBufferRef в изображение (или другое) для отображения.

Ваша проблема только ожидается. Файлы.m3u8 - это не настоящие файлы активов, скорее, они больше похожи на плейлист. Они используются в HTTP Live Streaming и предоставляют местоположение для "сегментов" в зависимости от доступной пропускной способности.

Вот пример файла.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 Live. Ссылка: справочный пример Apple по загрузке / воспроизведению активов

Наш вывод заключается в том, что если вы воспроизводите поток HLS, который имеет "список воспроизведения только I-кадра", например поток " https://tungsten.aaplimg.com/VOD/bipbop_adv_example_v2/master.m3u8" (имеет список воспроизведения только I-кадра), AVAssetImageGenerator может генерировать запрошенное изображение по одному.

Но, пожалуйста, обратите внимание, что "это нормально только на iOS8.X и iOS9.X", но не получилось на iOS10.X.

Я отправил отчет об ошибке в Apple Bug Reporter.

Другие вопросы по тегам