我一直有一个相当困难的时间从正在流式传输的实时HTTP流式传输(使用Wowza媒体服务器,如果有人很好奇)的MP3中提取ID3信息。我知道标签(现在是专辑标签和专辑封面标签)已正确嵌入每个文件段中,因为当我手动下载它们时,我可以在每个段中看到它们,如.m3u
索引文件中所列服务器。从HTTP通过HTTP提取ID3标签实时流式传输
我使用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];
}
一旦我的志愿方法被触发时,我开始玩self.musicPlayer
我呼吁它addPeriodicTimeObserverForInterval
每个1/4秒。正是在这种方法中,我尝试提取ID3元数据。
我已经试过各种我能对事物的的iOS侧想到要做到这一点,包括对每个AVAssetTrack
实例打印出
self.musicPlayer.currentItem.asset.commonMetadata
以及迭代并打印出他们元数据。
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模拟器运行此。自从苹果仍在批准我公司的开发人员帐户后,我还无法将其放到设备上。
做出反应?在客户端,您使用“timedMetadata”捕获元数据? – 2011-05-18 10:30:52