Erreur de file m3u8 AVAssetImageGenerator

J'utilise AVPlayer pour lire le file .m3u8. Utiliser AVAssetImageGenerator pour extraire l'image en utilisant le code suivant:

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

Ça me donne toujours l'erreur:

Error Domain = AVFoundationErrorDomain Code = -11800 "L'opération n'a pas pu être terminée" UserInfo = 0x7fb4e30cbfa0 {NSUnderlyingError = 0x7fb4e0e28530 "L'opération n'a pas pu aboutir. (OSStatus error -12782.)", NSLocalizedFailureReason = Une erreur inconnue s'est produite (-12782 ), NSLocalizedDescription = L'opération n'a pas pu être terminée}

Cela fonctionne pour mp4, mov et toutes les principales URL d'extensions video, mais pas pour m3u8. Une idée??

Votre problème est seulement à prévoir. Les files .m3u8 ne sont pas des files actifs, mais plutôt une playlist. Ils sont utilisés dans HTTP Live Streaming et fournissent un location pour les "segments" en fonction de la bande passante disponible.

Voici un exemple de file .m3u8 (exemple de file .m3u8 d' Apple )

 #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 

Malheureusement, vous ne pouvez pas créer un AVAsset ou un AVURLAsset pour représenter le média dans un stream HTTP Live. Référence: Exemple de reference d'Apple de chargement / de jeu d'actifs

Vous ne pourrez pas get des images fixes pour un stream en direct en utilisant AVAssetImageGenerator. Au lieu de cela, vous pouvez utiliser

AVPlayerItemVideoOutput

Avec AVPlayerItemVideoOutput vous pouvez get une image qui est appropriée pour afficher à un moment donné pour un stream .m3u8 donné en utilisant la méthode suivante: - (CVPixelBufferRef)copyPixelBufferForItemTime:(CMTime)itemTime itemTimeForDisplay:(CMTime *)outItemTimeForDisplay Ensuite, vous pouvez convertir le returnné CVPixelBufferRef dans une image (ou autre) pour l'affichage.

notre constatation est que, si vous jouez un stream HLS qui a "playlist I-Frame seulement", par exemple le stream " https://tungsten.aaplimg.com/VOD/bipbop_adv_example_v2/master.m3u8 " (a I-frame seulement playlist ), AVAssetImageGenerator pourrait générer l'image demandée un par un.

Mais s'il vous plaît notez que "c'est seulement bien sur iOS8.X et iOS9.X", mais a échoué à iOS10.X.

J'ai envoyé un rapport de bogue à Apple Bug Reporter.