Можно ли читать метаданные, используя потоковую передачу HTTP в iPhone SDK - PullRequest
10 голосов
/ 14 января 2011

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

Ответы [ 3 ]

21 голосов
/ 05 апреля 2012

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

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» они рассказывают о «метаданных timed», которые нигде не нужны.И пример Мэтта не работает со всеми потоками (но AVPlayer работает).

4 голосов
/ 26 марта 2016

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


}
0 голосов
/ 14 января 2011

Да, но это не так просто.Мэтт Галлахер опубликовал в своем блоге приятное сообщение о потоковом аудио.Процитирую его по этому вопросу:

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

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

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

...