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.
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"? –