我一直很难从通过 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 仍在批准我公司的开发者帐户,因此我还不能将它放在设备上。