Извлечение тегов ID3 ​​из MP3 через HTTP Live Streaming

Мне было довольно трудно извлечь информацию ID3 из MP3, передаваемого через Live HTTP Streaming (с использованием медиасервера Wowza, если кому-то интересно). Я знаю, что теги (сейчас тег альбома и тег обложки альбома) правильно встроены в каждый из сегментов файла, потому что, когда я загружаю их вручную, я вижу их в каждом сегменте, как указано в индексном файле .m3u, сгенерированном сервер.

Для этого я использую классы AVFoundation, и я настроил их как таковые:

- (void)initializeAudioStream {
    NSURL *streamUrl = [NSURL URLWithString:self.urlField.text];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamUrl];
    self.musicPlayer = [AVPlayer playerWithPlayerItem:playerItem];
    self.musicPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    [self.musicPlayer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:NULL];
}

Как только мой метод KVO срабатывает, я начинаю играть self.musicPlayer и вызываю addPeriodicTimeObserverForInterval для него каждую 1/4 секунды. Именно этим методом я пытаюсь извлечь метаданные ID3.

Я пробовал все, что мог придумать на стороне iOS, чтобы добиться этого, включая распечатку

self.musicPlayer.currentItem.asset.commonMetadata

а также повторение каждого из AVAssetTrack экземпляров и распечатка их метаданных.

for (AVAssetTrack *track in self.musicPlayer.currentItem.asset.tracks) {
    NSLog(@"Media type of track: %@", track.mediaType);
    NSLog(@"Track metadata: %@", track.commonMetadata);
}

Что интересно, актив всегда говорит, что у него 2 трека. Когда я распечатываю их свойство mediaType, я получаю "sun" для первого и "tmet" для второго. Я предполагаю, что первая дорожка — это сами аудиоданные, а вторая дорожка — метаданные. Однако я вижу только пустой массив в commonMetadata.

Я также проверяю состояние свойств, используя statusOfValueForKey:error на дорожках, и ключ commonMetadata всегда возвращается как AVKeyValueStatusLoaded.

Любые идеи? Я тут в полной растерянности.

Кроме того, в настоящее время я запускаю это через симулятор iPhone 4 под управлением iOS 4.2.1. Я еще не могу установить его на устройство, так как Apple все еще утверждает учетную запись разработчика моей компании.


person Marc W    schedule 23.02.2011    source источник
comment
Можете ли вы предоставить исходный код модуля для отправки метаданных с использованием библиотеки id3 wowza? На стороне клиента вы поймали метаданные, используя timedMetadata?   -  person    schedule 18.05.2011


Ответы (3)


Вместо использования commonMetadata вы можете попробовать использовать timedMetadata на AVPlayerItem:

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
person AdamH    schedule 24.02.2011
comment
Я тоже так пробовал! Но пример кода Wowza на сайте был неправильным, и как только их группа поддержки исправила его, я забыл запустить свой тест, используя timedMetadata. Но это сработало! Спасибо! - person Marc W; 24.02.2011

Просто идея: использовать fiddler/othersniffer для прослушивания содержимого HTTP-запроса, чтобы увидеть, присутствуют ли метаданные?

person maborg    schedule 24.02.2011
comment
Я использовал Wireshark для этого в дополнение к загрузке сегментов мультимедиа вручную. Метаданные присутствуют. - person Marc W; 24.02.2011

Вам необходимо зарегистрировать подкласс NSURLProtocol в методе didFinishLaunchingWithOptions Appdelegate.

затем вы можете увидеть ответ на запрос, сделанный вашим видеоплеером

person Shiv prakash Yadav    schedule 09.03.2016