Подтвердить что ты не робот

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

У меня было довольно сложное время извлечения информации ID3 из потока MP3, транслируемого по потоку Live HTTP (с использованием медиа-сервера 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 все еще одобряет мою учетную запись разработчика.

4b9b3361

Ответ 1

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

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];

Ответ 2

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

Ответ 3

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

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