6

Ok Así que tengo una transmisión en vivo desde una URL usando MPMoviePlayerController.Obtener metadatos de MPMoviePlayerController

Player = [[MPMoviePlayerController alloc] 
       initWithContentURL:[NSURL URLWithString:@"MY_URL_HERE_I_REMOVED"]]; 
Player.movieSourceType = MPMovieSourceTypeStreaming 

Ahora La transmisión da metadatos (creo que eso es lo que todos llaman). P.ej. Nombre de la pista, etc.

Deseo obtener esta información y mostrarla en una etiqueta.

que no tienen idea de cómo conseguirlo, no puedo cambiar de MPMoviePlayerController y después de buscar durante horas me encontré MPTimedMetadata referencia de clase, pero dunno cómo utilizar para obtener esta información.

Genial si puede mencionar cómo usar la notificación también para activar cada vez que estos datos cambien.

Respuesta

14

Suponiendo que ya sabe qué tipo de metadatos se envía desde la transmisión (si no lo hace, use un reproductor multimedia como VLC), primero debe registrar una notificación para obtener los metadatos en intervalos de tiempo y luego un método para procesarlos.

A partir de la notificación, solo

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(MetadataUpdate:) 
               name:MPMoviePlayerTimedMetadataUpdatedNotification 
              object:nil]; 

después de la asignación MPMoviePlayerController.

A continuación, en el método metaDataUpdate

- (void)MetadataUpdate:(NSNotification*)notification 
{ 
    if ([streamAudioPlayer timedMetadata]!=nil && [[streamAudioPlayer timedMetadata] count] > 0) { 
     MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0]; 
     metadataInfo = firstMeta.value; 
    } 
} 

donde streamAudioplayer es su MPMoviePlayerController y metadataInfo un NSString para almacenar el valor. Lo anterior obtendrá la información del artista y la pista de la canción que se está reproduciendo actualmente.

Este es el caso del envío de metadatos estándar por una transmisión shoutcast o icecast. (no se puede decir para otros porque no los he probado)

Tenga en cuenta que cada flujo puede manejar y enviar metadatos diferentes. Desde [streamAudioPlayer timedMetadata] es un NSArray que pueda

NSArray *metaArray = [streamAudioPlayer timedMetadata]; 
NSLog (@"%i", [metaArray count]); //to see how many elements in the array 
MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0]; 

Uso entonces la consola de depuración para mostrar el contenido de los metadatos utilizando las propiedades clave, espacio de claves, fecha y hora, valor.

Todo lo anterior es solo un ejemplo. No hay una sola forma de manejar los metadatos. La información detallada se puede encontrar en

https://developer.apple.com/library/ios/#DOCUMENTATION/MediaPlayer/Reference/MPTimedMetadata_Class/Reference/Reference.html

para la referencia de clase MPTimedMetadata y desde allí ... en el código!

+0

¡Increíble! ¡Gracias! – Genevios

+0

Hola ... cuatro años después, pero aún así, ¿puedo preguntar ... hay algún caso en el que el método 'timedMetadata' devuelva una matriz con más de una instancia' MPTimedMetadata'? En este momento estoy usando un bucle 'for-in' para obtener todos ellos, pero me pregunto si eso es realmente necesario en lugar de simplemente usar el primer elemento de la matriz. ¡Gracias! –

+0

Técnicamente hablando ... Podría. Esto requeriría una versión de Icecast compilada a medida o una nueva versión de Shoucast/Icecast que lo modifique. En casos especiales, * podría * devolver un segundo objeto con * probablemente * la dirección web de la estación.En mi experiencia, estoy 100% seguro de que los servidores estándar de Shoutcast/Icecast tendrán los metadatos en el primer objeto (índice 0). – Pericles

Cuestiones relacionadas