2011-01-14 4 views

答えて

0

しかし、それは簡単ではありません。 Matt Gallagherは、ストリーミングオーディオについてnice post on his blogです。件名で彼を引用する:

最も簡単なメタデータソースは、HTTPヘッダーから です。 eventTypeを:: 方法、CFReadStreamRefから kCFStreamPropertyHTTPResponseHeader プロパティをコピーするCFReadStreamCopyProperty を使用し、 あなたは 応答のうち、 コピーにヘッダフィールドを CFHTTPMessageCopyAllHeaderFieldsを使用することができます handleReadFromStreamインサイド。多くのストリーミングオーディオ サーバーの場合、ストリーム名は のいずれかのフィールドです。

メタデータのかなり難しい原因はID3タグです。 ID3v1は常にファイル末尾の です(ストリーミング時には は役に立たない)。 ID3v2は開始時に にありますので、 にアクセスできる可能性があります。

私はID3タグを読み取ることがありませんが、私は、あなたがどこかにファイル の最初の 数百キロバイトをキャッシュする場合、それはロードとそのキャッシュAudioFileOpenWithCallbacksと と が、その後AudioFileGetPropertyでkAudioFilePropertyID3Tag を読むことを開いた疑い

あなたは がID3のデータを読むことができるかもしれません( がある場合)。私が言ったように:私は を実際に行ったことがないので、私は が動作することを確かに知っていません。

+0

は、私に知らせて:

PlayerItem.addObserver(self, forKeyPath: "timedMetadata", options: NSKeyValueObservingOptions.New, context: nil) 

は、このメソッドを追加します。 – Moshe

+0

ええ、iTunesで.m3uファイルがストリーミングされているときに、曲とアーティスト情報が自動的に更新されます。あなたが言ったように、おそらくID3v2が各トラックの始めに流されます。多分、それはメタデータを待っているイベントリスナーの問題です。私は見守っていきます。 – miketucker

+0

@mike yep。Mattのコードを見てください。最新バージョンはGitHubにあります。素晴らしいヒントを提供するはずです。 – Moshe

20

この質問はまだ著者のために実際であるが、それは誰かを助けるかもしれないかもしれません。 2日間の痛みの後、私はそれが非常に簡単であることを調査しました。

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:<here your http stream url>]]; 

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil]; 

AVPlayer* player = [[AVPlayer playerWithPlayerItem:playerItem] retain]; 
[player play]; 

、その後:

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object 
         change:(NSDictionary*)change context:(void*)context { 

    if ([keyPath isEqualToString:@"timedMetadata"]) 
    { 
     AVPlayerItem* playerItem = object; 

     for (AVMetadataItem* metadata in playerItem.timedMetadata) 
     { 
     NSLog(@"\nkey: %@\nkeySpace: %@\ncommonKey: %@\nvalue: %@", [metadata.key description], metadata.keySpace, metadata.commonKey, metadata.stringValue); 
     } 
    } 
} 

それだここで私のために動作するコードです。私は実際のストリーミングオーディオの重要な機能であるストリームのアクセス "タイトル"のために、AppleがAVPlayerItemのためのドキュメントでこのサンプルを提供しなかった理由を知らない。 「AV Foundation Frameworkリファレンス」では、必要な場所では「timedMetadata」について説明していません。 Mattのサンプルはすべてのストリームでは機能しません(ただしAVPlayerは動作します)。 SWIFT 2.0取得メタデータ情報の音楽ストリーミングで

+0

これが正解としてマークされたのはなぜか分かりませんが、本当にマークする必要があります。ラジオアプリの連続ストリームでは、現在のオーディオファイルが再生された後でメタデータを取得し、新しいオーディオファイルが再生されると、何ができるのでしょうか? – user717452

+0

上記のコードは、 'timedMetadata'値が変更されたときに呼び出されます。したがって、(インターネットラジオのような)ウェブストリームを再生するとき、 'observeValueForKeyPath:ofObject:change:context:'が変更時にトリガされます。 – rckoenes

+0

上記はなぜ正しい答えとして選ばれるべきなのかはわかりませんが、それは私には大いに役立ちます。どうもありがとうございました。 –

3

:あなたはこの作業を取得した場合は

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    //Atualiza Nome Musica 
    if keyPath == "timedMetadata" { 
     if let meta = PlayerItem.timedMetadata { 
      print("Novo Metadata \(meta)") 
      for metadata in meta { 
       if let nomemusica = metadata.valueForKey("value") as? String{ 
        LB_NomeMusica.text = nomemusica 
        if NSClassFromString("MPNowPlayingInfoCenter") != nil { 
         let image:UIImage = UIImage(named: "logo.gif")! 
         let albumArt = MPMediaItemArtwork(image: image) 
         var songInfo: [String:AnyObject] = [ 
          MPMediaItemPropertyTitle: nomemusica, 
          MPMediaItemPropertyArtist: "Ao Vivo", 
          MPMediaItemPropertyArtwork: albumArt 
         ] 
         MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo 
        } 
       } 
      } 
     } 
    } 


} 
関連する問題