5

Estoy usando el formato de video m3u8 para transmitir el video y ahora necesito mostrar los subtítulos para el mismo.Subtítulos para AVPlayer/MPMoviePlayerController

He buscado en la documentación de Apple y encontré que puedo lograrlo utilizando la propiedad closedCaptionDisplayEnabled de AVPlayer.

Me gustaría saber cuál debería ser el formato de los subtítulos? ¿Lo hará el formato .srt?

También puedo lograr lo mismo usando MPMoviePlayerController?

Cualquier ayuda es apreciada.

+0

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

+0

La documentación de Apple adolece de una redacción exacta sobre este punto. Solo dice que 'closedCaptionDisplayEnabled'" [i] indica si el jugador usa subtítulos ". No dice nada sobre los subtítulos. En mi prueba (en OS X), esa propiedad no tiene ningún efecto sobre los subtítulos; it * only * funciona en subtítulos. (Puede probarlo usted mismo grabando un televisor con subtítulos ocultos usando EyeTV, luego exportándolo a formatos muxed de iPhone y MPEG-2, luego conviértalo con HandBrake. La exportación EyeTV-to-iPhone tendrá una pista CC; el rasgado HandBrake tendrá una pista de subtítulos.) –

Respuesta

2

Tanto AVPlayer como MPMoviePlayerController pueden mostrar subtítulos.

La diferencia parece ser que con AVPlayer, usted controla si los subtítulos se muestran usando la propiedad closedCaptionDisplayEnabled.

Con MPMoviePlayerController, el usuario controla si los subtítulos se muestran o no con un interruptor en la aplicación Configuración. No tienes control programático de esto en la aplicación.

+2

'closedCaptionDisplayEnabled' alterna los subtítulos, no los subtítulos. Son dos cosas diferentes, y esa propiedad no tiene ningún efecto sobre los subtítulos. (Una advertencia: solo he intentado esto en OS X, no en iOS.) –

0

La aplicación WWDC 2013 iOS utiliza archivos WebVTT para sus subtítulos (credit to Nicholas Riley for discovering this). Por alguna razón, hay aproximadamente 50 (el número exacto varía) para cada sesión.

No tengo idea si WebVTT es compatible con AVFoundation o MPMoviePlayer, o si la aplicación descarga y analiza los archivos de subtítulos.

Una búsqueda rápida de “M3U8 WebVTT” da como resultado una referencia a this HTTP Live Streaming Draft, lo que sugiere que usted puede ser capaz de hacer este trabajo simplemente referencia a los archivos WebVTT en su lista de reproducción M3U8. Sin embargo, no tengo un ejemplo para ti, ya que no pude adivinar trivialmente la URL m3u8 para una sesión WWDC.

10

Parece que la referencia a los archivos WebVTT en su descripción de transmisión m3u8 es la que se admite oficialmente. Agregarlos "después del hecho" parece no ser compatible oficialmente (Ver this statement by an Apple engineer (bottom of the page)).

Eso, sin embargo, no significa que no pueda hacer que funcione ;-). Con la ayuda de this great presentation y sample project (ZIP) por Chris Adamson, this post on the Apple Developer Forums y this Ray Wenderlich tutorial by Abdul Azeem, pude hacerlo funcionar. Esta es una versión modificada del código de muestra de Abdul Azeem y el proyecto de muestra de Chris.

Tenga en cuenta cómo debe usar AVMediaTypeText en lugar de AVMediaTypeSubtitle. Esto parece ser un error en 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

Muchas gracias por su magnífica publicación. ¿Puedes mencionar cómo podemos establecer los metadatos? vamos titleMetadataItem = AVMutableMetadataItem() titleMetadataItem.locale = NSLocale.current titleMetadataItem.key = AVMetadataCommonKeyTitle como (NSCopying y NSObjectProtocol)? titleMetadataItem.keySpace = AVMetadataKeySpaceCommon titleMetadataItem.value = self.assetObject.title as (NSCopying y NSObjectProtocol)? –

+0

@Johannes Fahrenkrug: ¿Está funcionando esta solución con la transmisión HLS real desde la lista de reproducción remota m3u8, por favor? Estoy tratando de hacerlo en Swift sin suerte. ¿Puedes verificar mi publicación? Http://stackoverflow.com/questions/43161124/how-to-add-external-webvtt-subtitles-into-http-live-stream-on-ios-client. ¡Gracias! –

+0

@MartinKoles Creo que debería funcionar. La mejor forma de averiguarlo es intentarlo :) ¡Tal vez puedas publicar tus resultados aquí! –

Cuestiones relacionadas