Подтвердить что ты не робот

M3u8 файл AVAssetImageGenerator error

Я использую 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. Любая идея?

4b9b3361

Ответ 1

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

AVPlayerItemVideoOutput

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

Ответ 2

Ваша проблема должна только ожидаться..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 по загрузке/воспроизведению активов

Ответ 3

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

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

Я сделал сообщение об ошибке для Apple Bug Reporter.