2011-02-23 8 views
12

He estado teniendo un momento difícil extrayendo información ID3 de un MP3 transmitido por Live HTTP Streaming (usando el servidor multimedia Wowza, si alguien tiene curiosidad). Sé que las etiquetas (ahora la etiqueta del álbum y la etiqueta de la portada del álbum) se incrustan correctamente en cada uno de los segmentos del archivo porque cuando los descargo de forma manual puedo verlos en cada segmento como aparece en el archivo de índice .m3u generado por el servidor.Extrayendo etiquetas ID3 de MP3 a través de HTTP Transmisión en vivo

estoy usando los AVFoundation clases para hacer esto, y lo tengo configurado como tales:

- (void)initializeAudioStream { 
    NSURL *streamUrl = [NSURL URLWithString:self.urlField.text]; 
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamUrl]; 
    self.musicPlayer = [AVPlayer playerWithPlayerItem:playerItem]; 
    self.musicPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
    [self.musicPlayer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:NULL]; 
} 

Una vez activada mi método MVA, puedo empezar a jugar self.musicPlayer y llamo addPeriodicTimeObserverForInterval sobre ella por cada 1/4 segundos. Es en este método que trato de extraer los metadatos ID3.

He intentado todo lo que ocurre en el lado de IOS de cosas para lograr esto, incluyendo impresión de

self.musicPlayer.currentItem.asset.commonMetadata 

, así como la iteración sobre cada uno de los AVAssetTrack casos e imprimir sus metadatos.

for (AVAssetTrack *track in self.musicPlayer.currentItem.asset.tracks) { 
    NSLog(@"Media type of track: %@", track.mediaType); 
    NSLog(@"Track metadata: %@", track.commonMetadata); 
} 

Lo interesante es que el activo siempre dice que tiene 2 pistas. Cuando imprimo su propiedad mediaType obtengo "soun" para el primero y "tmet" para el segundo. Mi suposición es que la primera pista son los datos de audio en sí y la segunda pista son los metadatos. Sin embargo, solo veo una matriz vacía en commonMetadata.

También compruebo el estado de las propiedades usando statusOfValueForKey:error en las pistas, y la clave commonMetadata siempre vuelve como AVKeyValueStatusLoaded.

¿Alguna idea? Estoy en una pérdida completa aquí.

Además, actualmente estoy ejecutando esto a través del simulador de iPhone 4 con iOS 4.2.1. Todavía no puedo ponerlo en un dispositivo ya que Apple sigue aprobando la cuenta de desarrollador de mi empresa.

+0

Se puede suministrar el código fuente del módulo para enviar metadatos utilizando la biblioteca ID3 wowza? En el lado del cliente, atrapó los metadatos usando "timedMetadata"? –

Respuesta

9

En lugar de utilizar commonMetadata es posible que desee probar el uso de timedMetadata en el AVPlayerItem:

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL]; 
+0

¡Lo había intentado también! Pero el código de muestra de Wowza en el sitio era incorrecto y una vez que el grupo de soporte lo solucionó, olvidé ejecutar mi prueba con 'timedMetadata'. ¡Pero funcionó! ¡Gracias! –

0

Una sola idea: ¿usar fiddler/othersniffer para oler el contenido de solicitud http para ver si hay metadatos?

+0

Utilicé Wireshark para hacer eso además de descargar manualmente los segmentos de medios. Los metadatos están presentes. –

+0

¿Obtuvo alguna solución? –

0

Debe registrarse una subclase de NSURLProtocol en el método AppDelegate didFinishLaunchingWithOptions.

continuación se puede ver la respuesta de la solicitud hecha por el reproductor de vídeo

Cuestiones relacionadas