Ошибка файла 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.