6

Ok Więc mam strumień na żywo z adresu URL przy użyciu MPMoviePlayerController.Uzyskiwanie metadanych z MPMoviePlayerController

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

Teraz Strumień daje dane meta (uważam, że to, co wszyscy nazywają). Na przykład. Nazwa utworu itp.

Chcę uzyskać te informacje i wyświetlić je na etykiecie.

nie mam pojęcia jak je zdobyć, nie mogę zmienić z MPMoviePlayerController i po poszukiwaniach w godzinach znalazłem MPTimedMetadata odniesienie klasy, ale nie wiem jak użyć, aby uzyskać te informacje.

Świetne, jeśli możesz wspomnieć, jak używać powiadomienia, aby wywołać za każdym razem, gdy dane ulegną zmianie.

Odpowiedz

14

Zakładając, że już wiesz, jakie rodzaje metadanych są wysyłane ze strumienia (jeśli nie, użyj odtwarzacza multimedialnego, takiego jak VLC, aby zobaczyć), musisz najpierw zarejestrować powiadomienie, aby uzyskać metadane w określonych odstępach czasu i to metoda ich przetwarzania.

Począwszy od zgłoszenia, tylko

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

po alokacji MPMoviePlayerController.

Następnie na metodzie MetadataUpdate

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

gdzie streamAudioplayer jest Twój MPMoviePlayerController i metadataInfo NSString do przechowywania wartości. Powyższe spowoduje wyświetlenie informacji o wykonawcy i ścieżce aktualnie odtwarzanej piosenki.

Dotyczy to standardowych wysyłanych metadanych w strumieniu wiadomości lub wiadomości. (nie mogę powiedzieć o innych, ponieważ ich nie próbowałem)

Należy pamiętać, że każdy strumień może obsługiwać i wysyłać różne metadane. Od [streamAudioPlayer timedMetadata] jest NSArray możesz

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

Zastosowanie wówczas konsola debugowania, aby pokazać zawartości metadanych za pomocą właściwości klucz, KEYSPACE, datownika, wartości.

Wszystkie powyższe to tylko przykład. Nie ma jednej metody radzenia sobie z metadanymi. Szczegółowe informacje można znaleźć na stronie

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

na odniesienie klasy MPTimedMetadata a stamtąd ... na kod!

+0

Niesamowite !!! Dzięki! – Genevios

+0

Cześć ... cztery lata później, ale czy mogę zapytać ... czy istnieje przypadek, w którym metoda 'timedMetadata' zwraca tablicę z więcej niż jedną instancją' MPTimedMetadata'? W tej chwili używam pętli 'for-in', aby uzyskać wszystkie z nich, ale zastanawiam się, czy to naprawdę konieczne, zamiast używać tylko pierwszego elementu tablicy. Dzięki! –

+0

Technicznie rzecz biorąc ... Mogłoby. Wymagałoby to albo skompilowanej na zamówienie wersji Icecast albo nowej wersji Shoucast/Icecast, która to zmienia. W szczególnych przypadkach może * zwrócić * drugi obiekt z * prawdopodobnie * adresem sieci stacji.Z mojego doświadczenia wynika, że ​​jestem w 100% pewna, że ​​standardowe serwery Shoutcast/Icecast będą miały metadane na pierwszym obiekcie (indeks 0). – Pericles

Powiązane problemy