6

Ok Quindi ho un live streaming da un URL utilizzando MPMoviePlayerController.Ottenere MetaData da MPMoviePlayerController

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

Ora il flusso fornisce Meta Data (credo che sia quello che tutti chiamano). Per esempio. Nome della traccia ecc.

Desidero ottenere queste informazioni e visualizzarle su un'etichetta.

mi hanno alcuna idea di come farlo, non posso cambiare da MPMoviePlayerController e dopo aver cercato per ore ho trovato MPTimedMetadata riferimento classe, ma so come usare per ottenere queste informazioni.

Ottimo se si può menzionare come utilizzare la notifica anche per attivare ogni volta che questi dati cambiano.

risposta

14

Supponendo che tu sappia già che tipo di metadati vengono inviati dallo streaming (se non lo fai, usa un lettore multimediale come VLC per vedere), devi prima registrare una notifica per ottenere i metadati a intervalli regolari e quindi un metodo per elaborarli.

A partire dalla notifica, basta

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

dopo l'assegnazione MPMoviePlayerController.

Poi sul metodo MetadataUpdate

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

dove streamAudioplayer è il tuo MPMoviePlayerController e metadataInfo un NSString per memorizzare il valore. Quanto sopra otterrà le informazioni su Artista e Traccia della canzone attualmente in riproduzione.

Questo è il caso per i metadata standard inviati da un flusso di shoutcast o icecast. (non posso dire per gli altri perché non li ho provati)

Si noti che ogni flusso può gestire e inviare metadati diversi. Dal [streamAudioPlayer timedMetadata] è un NSArray si può

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

Utilizzare quindi la console di debug per visualizzare il contenuto dei metadati utilizzando le proprietà chiave, spazio delle chiavi, data e ora, di valore.

Tutto questo è solo un esempio. Non esiste un unico modo per gestire i metadati. Informazioni dettagliate sono disponibili all'indirizzo

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

per il riferimento di classe MPTimedMetadata e da lì ... codice!

+0

Incredibile !!! Grazie! – Genevios

+0

Ciao ... quattro anni dopo, ma ancora, posso chiedere ... c'è qualche caso in cui il metodo 'timedMetadata' restituisce una matrice con più di un'istanza' MPTimedMetadata'? In questo momento sto usando un ciclo 'for-in' per averli tutti, ma mi chiedo se sia davvero necessario invece di usare solo il primo elemento dell'array. Grazie! –

+0

Tecnicamente parlando ... Potrebbe. Ciò richiederebbe una versione di Icecast compilata su misura o una nuova versione di Shoucast/Icecast che lo modifichi. In casi speciali, * potrebbe * restituire un secondo oggetto con * probabilmente * l'indirizzo web della stazione.Nella mia esperienza, sono sicuro al 100% che i server standard di Shoutcast/Icecast avranno i metadati sul primo oggetto (indice 0). – Pericles

Problemi correlati