Извлечение тегов ID3 ​​из MP3 через HTTP Live Streaming - PullRequest
12 голосов
/ 23 февраля 2011

Мне было довольно трудно извлекать информацию 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, я получаю «soun» для первого и «tmet» для второго. Я предполагаю, что первая дорожка - это сами аудиоданные, а вторая - метаданные. Тем не менее, я только когда-либо вижу пустой массив в commonMetadata.

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

Есть идеи? Я в полной растерянности.

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

Ответы [ 3 ]

9 голосов
/ 24 февраля 2011

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

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
0 голосов
/ 09 марта 2016

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

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

0 голосов
/ 24 февраля 2011

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

...