Возможно ли читать метаданные с использованием потоковой передачи HTTP в iPhone SDK

При воспроизведении живого потока с использованием метода HTTP Live Streaming можно ли читать текущие метаданные (например, Title и Artist)? Это приложение для iPhone.

Ответ 1

Не уверен, что этот вопрос по-прежнему актуальен для его автора, но может быть, это поможет кому-то. После двух дней боли я исследовал, что это довольно просто. Вот код, который работает для меня:

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" они рассказывают о "timedMetadata" где-то там, где это необходимо. И образец Matt не работает со всеми потоками (но AVPlayer делает).

Ответ 2

в swift 2.0 получение метаданных информация потоковое воспроизведение музыки:

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

добавьте этот метод:

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
                    }
                }
            }
        }
    }


}

Ответ 3

Это, но это непросто. У Matt Gallagher есть хорошая запись в его блоге о потоковой передаче аудио. Процитировать его по теме:

Самый простой источник метаданных из заголовков HTTP. Внутри handleReadFromStream: типСобытии: метод, используйте CFReadStreamCopyProperty скопировать kCFStreamPropertyHTTPResponseHeader свойство из CFReadStreamRef, то вы можете использовать CFHTTPMessageCopyAllHeaderFields для скопируйте поля заголовка из ответ. Для многих потоковых аудио серверов, имя потока является одним из эти поля.

Значительно более сложный источник метаданные являются тегами ID3. ID3v1 - всегда в конце файла (так бесполезно при потоковой передаче). ID3v2 - расположенный в начале, так что может быть больше доступны.

Я никогда не читал теги ID3, но я подозревайте, что если вы кешируете первый несколько сотен килобайт файла где-то, когда он загружается, откройте этот кеш с AudioFileOpenWithCallbacks и затем прочитайте kAudioFilePropertyID3Tag с AudioFileGetProperty вы можете быть возможность считывать данные ID3 (если это существует). Как я уже сказал, я никогда не делал этого, поэтому я не точно знаю, что это сработает.