我一直在努力从通过直播HTTP流(使用Wowza媒体服务器)传输的MP3中提取ID3信息。 我知道标签(目前是专辑标签和专辑封面标签)已正确嵌入每个文件段,因为当我手动下载它们时,我可以在由服务器生成的 .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模拟器来运行它。由于苹果公司仍在批准我们公司的开发者帐户,因此我尚不能将其放在设备上。