2011-01-14 7 views

답변

0

그래도 쉽지 않습니다. Matt Gallagher는 스트리밍 오디오에 대해 nice post on his blog입니다. 주제에 대해 다음과 같이 인용하십시오.

가장 쉬운 메타 데이터 소스는 HTTP 헤더에서 입니다. 이벤트 유형 : 다음 handleReadFromStream 내부 방법, 은 응답에서 헤더 필드를 복사하려면 은 다음 CFHTTPMessageCopyAllHeaderFields를 사용할 수 있으며, CFReadStreamRef에서 kCFStreamPropertyHTTPResponseHeader 속성을 복사 할 CFReadStreamCopyProperty 를 사용합니다. 많은 스트리밍 오디오 서버의 경우 스트림 이름은 이 필드 중 하나입니다.

메타 데이터의 상당히 더 어려운 출처는 ID3 태그입니다. ID3v1은 파일 끝에 항상 입니다 (따라서 스트리밍 할 때 쓸데없는 입니다). ID3v2는 처음에 이므로 에 액세스 할 수 있습니다.

I했습니다 적이없는 ID3 태그를 읽을 수 있지만 난 당신이 파일이로드 어딘가로 의 첫 번째 몇 백 킬로바이트 캐시 경우, AudioFileGetProperty으로 kAudioFilePropertyID3Tag 을 AudioFileOpenWithCallbacks와 캐쉬 를 열고 다음 읽어 의심 ID3 데이터를 읽을 수있는 일 수 있습니다 ( 이있는 경우). 내가 말했듯이 : 나는 을 실제로 그렇게하지 않았으므로 나는 그렇지 않다. 그것이 작동 할 것이라고 확신한다.

+0

이 알려 :

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

이 방법을 추가 할 수 있습니다. – Moshe

+0

예, iTunes에서 .m3u 파일이 스트리밍 중일 때 노래 및 아티스트 정보가 자동으로 업데이트됩니다. 아마도 ID3v2가 처음부터 끝까지 스트리밍됩니다. 아마 메타 데이터를 기다리는 이벤트 리스너의 문제 일 수도 있습니다. 나는 계속 찾아 볼 것입니다. – miketucker

+0

@mike 예.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); 
     } 
    } 
} 

여기에 나를 위해 작동 코드입니다. 나는 왜 애플이 AVPlayerItem에 대한 문서를 제공하지 않았는지 알지 못한다.이 샘플은 실제 스트리밍 오디오의 핵심 기능인 스트림의 "제목"에 대한 접근이다. "AV Foundation Framework Reference"에서 필요한 경우 "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 
        } 
       } 
      } 
     } 
    } 


} 
관련 문제