【发布时间】:2011-07-02 10:09:21
【问题描述】:
我一直很难从通过 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 仍在批准我公司的开发者帐户。
【问题讨论】:
-
您能否提供模块的源代码以使用 id3 wowza 库发送元数据?在客户端,您使用“timedMetadata”捕获了元数据?
标签: iphone cocoa-touch avfoundation id3 http-live-streaming