5

Sto usando il formato video m3u8 per lo streaming del video e ora ho bisogno di visualizzare i sottotitoli per lo stesso.Sottotitoli per AVPlayer/MPMoviePlayerController

Ho cercato nella documentazione Apple e ho scoperto che posso ottenere questo risultato utilizzando la proprietà closedCaptionDisplayEnabled di AVPlayer.

Sono interessato a sapere quale dovrebbe essere il formato dei sottotitoli? Il formato .srt funzionerà?

Inoltre, è possibile ottenere lo stesso utilizzando MPMoviePlayerController?

Qualsiasi aiuto è apprezzato.

+0

Vedi http://stackoverflow.com/questions/11312118/show-subtitles-with-an-avfoundation-avplayer-on-os-x e http://stackoverflow.com/questions/5662635/show -subtitles-in-a-mpmovieplayerviewcontroller-by-default – Till

+0

La documentazione di Apple ha un testo esatto su questo punto. Dice solo che 'closedCaptionDisplayEnabled'" [i] indica se il giocatore usa i sottotitoli ". Non dice nulla sui sottotitoli. Nel mio test (su OS X), quella proprietà non ha alcun effetto sui sottotitoli; solo * funziona su sottotitoli. (Puoi testare questo te stesso registrando la televisione dei sottotitoli utilizzando EyeTV, quindi esportandola nei formati muxed di iPhone e MPEG-2, quindi convertendo quest'ultima con HandBrake. L'esportazione EyeTV-to-iPhone avrà una traccia CC; avrà una traccia di sottotitoli.) –

risposta

2

Sia AVPlayer che MPMoviePlayerController possono visualizzare i sottotitoli.

La differenza sembra essere che con AVPlayer, si controlla se i sottotitoli vengono visualizzati o meno utilizzando la proprietà closedCaptionDisplayEnabled.

Con MPMoviePlayerController, l'utente controlla se i sottotitoli vengono visualizzati o meno utilizzando un interruttore nell'app Impostazioni. Non hai controllo programmatico di questo nell'app.

+2

'closedCaptionDisplayEnabled' attiva o disattiva i sottotitoli. Sono due cose diverse, e quella proprietà non ha alcun effetto sui sottotitoli. (Un avvertimento: ho provato solo su OS X, non iOS.) –

0

L'app iOS WWDC 2013 utilizza file WebVTT per i relativi sottotitoli (credit to Nicholas Riley for discovering this). Per qualsiasi ragione, ci sono circa 50 (il numero esatto varia) per ogni sessione.

Non ho idea se WebVTT è supportato a livello AVFoundation o MPMoviePlayer o se l'app scarica e analizza i file dei sottotitoli.

Una rapida ricerca per “webvtt M3U8” alzato un riferimento a this HTTP Live Streaming Draft, il che suggerisce che si potrebbe essere in grado di fare questo lavoro, semplicemente riferimento ai file WebVTT nella playlist M3U8. Non ho un esempio per te, dato che non ero in grado di indovinare banalmente l'URL di m3u8 per una sessione WWDC.

10

Sembra che il riferimento ai file WebVTT nella descrizione dello streaming m3u8 sia il modo ufficialmente supportato. Aggiungerli "dopo il fatto" sembra non essere ufficialmente supportato (vedi this statement by an Apple engineer (bottom of the page)).

Questo - tuttavia - non significa che non puoi farlo funzionare ;-). Con l'aiuto di this great presentation e sample project (ZIP) di Chris Adamson, this post on the Apple Developer Forums e this Ray Wenderlich tutorial by Abdul Azeem, sono riuscito a farlo funzionare. Questa è una versione modificata del codice di esempio di Abdul Azeem e del progetto di esempio di Chris.

Nota come è necessario utilizzare AVMediaTypeText anziché AVMediaTypeSubtitle. Questo sembra essere un bug in iOS.

// 1 - Load video asset 
AVAsset *videoAsset = [AVURLAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"video" withExtension:@"mp4"]]; 

// 2 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances. 
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; 

// 3 - Video track 
AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                    preferredTrackID:kCMPersistentTrackID_Invalid]; 
[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
        ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
        atTime:kCMTimeZero error:nil]; 

// 4 - Subtitle track 
AVURLAsset *subtitleAsset = [AVURLAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"subtitles" withExtension:@"vtt"]]; 

AVMutableCompositionTrack *subtitleTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeText 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 

[subtitleTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
         ofTrack:[[subtitleAsset tracksWithMediaType:AVMediaTypeText] objectAtIndex:0] 
         atTime:kCMTimeZero error:nil]; 

// 5 - Set up player 
AVPlayer *player = [AVPlayer playerWithPlayerItem: [AVPlayerItem playerItemWithAsset:mixComposition]]; 
+0

Grazie mille per il post superbo. Puoi per favore menzionare come possiamo impostare i metadati. diamo titleMetadataItem = AVMutableMetadataItem() titleMetadataItem.locale = NSLocale.current titleMetadataItem.key = AVMetadataCommonKeyTitle come (NSCopying & NSObjectProtocol)? titleMetadataItem.keySpace = AVMetadataKeySpaceCommon titleMetadataItem.value = self.assetObject.title as (NSCopying & NSObjectProtocol)? –

+0

@Johannes Fahrenkrug: questa soluzione funziona con streaming HLS reale dalla playlist m3u8 remota, per favore? Sto cercando di farlo a Swift senza fortuna. Potete controllare il mio post: http://stackoverflow.com/questions/43161124/how-to-add-external-webvtt-subtitles-into-http-live-stream-on-ios-client. Grazie! –

+0

@MartinKoles Penso che dovrebbe funzionare. Il modo migliore per scoprirlo è solo per provarlo :) Forse puoi pubblicare i tuoi risultati qui! –