12

我一直很难从通过 Live HTTP Streaming 流式传输的 MP3 中提取 ID3 信息(如果有人好奇的话,使用 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,并且每 1/4 秒调用addPeriodicTimeObserverForInterval一次。正是在这种方法中,我尝试提取 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.

有任何想法吗?我在这里完全不知所措。

另外,我目前正在通过运行 iOS 4.2.1 的 iPhone 4 模拟器运行它。由于 Apple 仍在批准我公司的开发者帐户,因此我还不能将它放在设备上。

4

3 回答 3

9

而不是使用commonMetadata你可能想尝试timedMetadata使用AVPlayerItem

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
于 2011-02-24T14:12:16.637 回答
0

只是一个想法:使用 fiddler/othersniffer 来嗅探 http 请求内容以查看是否存在元数据?

于 2011-02-24T08:50:04.380 回答
0

您需要在 Appdelegate didFinishLaunchingWithOptions 方法中注册 NSURLProtocol 的子类。

然后您可以看到视频播放器发出的请求的响应

于 2016-03-09T14:01:58.610 回答