6

私はMPMoviePlayerControllerを使用してURLからライブストリームを取得しています。MPMoviePlayerControllerからMetaDataを取得する

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

ストリームはメタデータを与えます(誰もがそれを呼んでいると思います)。例えば。トラック名など

この情報を取得してラベルに表示したいと考えています。

私はMPMoviePlayerControllerから変更することはできません。何時間も検索した後、MPTimedMetadataクラス参照がこの情報を取得する方法を知っていません。

通知を使用してこのデータが変更されるたびにトリガーする方法については、説明していただければ幸いです。

答えて

14

ストリームから送信されているメタデータの種類がわかっている場合(VLCなどのメディアプレーヤーを使用していない場合)、まずメタデータを取得するための通知を時間間隔で登録する必要があります。それらを処理する方法。

だけ

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

MPMoviePlayerController割り当てた後、通知から開始。 streamAudioplayerは、値を格納するためにあなたのMPMoviePlayerControllerとmetadataInfo NSStringのであるMetadataUpdate方法

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

に続いて

。上記は、現在再生中の曲のアーティスト情報とトラック情報を取得します。

これは、shoutcastストリームまたはicecastストリームによって送信される標準メタデータの場合です。 (私はそれらを試していないので他人のために言うことはできません)

各ストリームは異なるメタデータを処理し、送信することがあります。 [streamAudioPlayer timedMetadata]以来 あなたは

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

キー、キースペース、タイムスタンプ、値プロパティを使用してメタデータの内容を表示するには、その後、デバッグコンソールを使用することができNSArrayのです。

上記はすべて単なる例です。メタデータを扱う方法は1つではありません。 詳細な情報は、上のコード... MPTimedMetadataクラス参照のために、そこから

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

で見つけることができます!

+0

素晴らしい!ありがとう! – Genevios

+0

こんにちは... 4年後、まだ、私は尋ねるかもしれません... 'timedMetadata'メソッドが複数の' MPTimedMetadata'インスタンスを持つ配列を返す場合はありますか?今私はそれらのすべてを取得するために 'for-in'ループを使用していますが、本当に配列の最初の要素を使うのではなく、本当に必要かどうかは疑問です。ありがとう! –

+0

技術的に言えば...可能です。これには、カスタムコンパイルされたIcecastバージョンまたはこれを変更する新しいShoucast/Icecastリリースが必要です。特殊な場合には、ステーションのウェブアドレスを*おそらく*持つ2番目のオブジェクトを返すかもしれません。私の経験では、標準のShoutcast/Icecastサーバーが最初の(インデックス0)オブジェクトにメタデータを持つことを100%確信しています。 – Pericles

関連する問題