2015-08-20 2 views
11

Я использую AVPlayer для воспроизведения файла .m3u8. Использование AVAssetImageGenerator для извлечения изображения из него, используя следующий код:m3u8 файл AVAssetImageGenerator error

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]; 

Он всегда дает мне ошибку:

Error Domain = AVFoundationErrorDomain Код = -11800 "Операция не может быть завершена" UserInfo = 0x7fb4e30cbfa0 {NSUnderlyingError = 0x7fb4e0e28530 "операция не может быть завершена. (OSStatus ошибка -12782.)", NSLocalizedFailureReason = произошла неизвестная ошибка (-12782), NSLocalizedDescription = операция не может быть завершена}

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

+0

mp не имеет значения null? можете ли вы поделиться активом? –

+0

и чуть больше вашего кода ... –

+1

См. Http://stackoverflow.com/questions/29404060/how-can-i-capture-an-image-when-avplayer-playing-m3u8-stream – aergistal

ответ

4

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

AVPlayerItemVideoOutput

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

4

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

вот пример .m3u8 файла (Apple's sample .m3u8 file)

#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's reference example of Asset Loading/playing

+1

Согласитесь, но что делать, если мне нужен скриншот? вы знаете какой-либо другой способ? – objectivecdeveloper

0

наш вывод состоит в том, что если вы играете в потоке 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.