2015-08-20 13 views
11

Sto utilizzando AVPlayer per riprodurre il file .m3u8. Utilizzando AVAssetImageGenerator per estrarre immagini da esso utilizzando il codice seguente:file m3u8 Errore 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]; 

Mi dà sempre errore:

errore di dominio = Codice AVFoundationErrorDomain = -11.800 "L'operazione non potrebbe essere completata" UserInfo = 0x7fb4e30cbfa0 {NSUnderlyingError = 0x7fb4e0e28530 "L'operazione non può essere completata. (OSStatus errore -12.782.)", NSLocalizedFailureReason = si è verificato un errore sconosciuto (-12.782), NSLocalizedDescription = L'operazione non ha potuto essere completato}

Funziona con mp4, mov e tutti i principali URL di estensioni video ma non per m3u8. Qualche idea??

+0

mp non è nullo? puoi condividere il bene? –

+0

e un po 'di più del codice ... –

+1

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

risposta

4

Non sarà possibile ottenere immagini fisse per un flusso live utilizzando AVAssetImageGenerator. Invece, è possibile utilizzare

AVPlayerItemVideoOutput

Con AVPlayerItemVideoOutput è possibile ottenere un'immagine che è appropriato per visualizzare in un momento specifico per un determinato flusso .m3u8 utilizzando il seguente metodo: - (CVPixelBufferRef)copyPixelBufferForItemTime:(CMTime)itemTime itemTimeForDisplay:(CMTime *)outItemTimeForDisplay Quindi, è possibile convertire il CVPixelBufferRef restituito in un'immagine (o altro) per la visualizzazione.

4

Il tuo problema è solo prevedibile. .m3u8 I file non sono veri e propri file di asset, anzi, sono più simili a una playlist. Vengono utilizzati in HTTP Live Streaming e forniscono una posizione per "segmenti" in base alla larghezza di banda disponibile.

Ecco un esempio di un file .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 

Purtroppo, non è possibile creare un AVAsset o AVURLAsset per rappresentare la media in un flusso HTTP Live. Riferimento: Apple's reference example of Asset Loading/playing

+1

D'accordo, ma cosa succede se ho bisogno di uno screenshot? conosci qualche altro modo? – objectivecdeveloper

0

la nostra scoperta è che, se si riproduce un flusso HLS che ha "playlist I-Frame only", ad esempio stream "https://tungsten.aaplimg.com/VOD/bipbop_adv_example_v2/master.m3u8" (ha solo playlist I-frame), AVAssetImageGenerator potrebbe generare l'immagine richiesta uno per uno.

Ma si prega di notare che "va bene solo su iOS8.X e iOS9.X", ma non è riuscito su iOS10.X.

Ho inoltrato una segnalazione di bug a Apple Bug Reporter.