我一直很难从通过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仍在批准我公司的开发者帐户。
答案 0 :(得分:9)
您可能想尝试在commonMetadata
上使用timedMetadata
,而不是使用AVPlayerItem
:
[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
答案 1 :(得分:0)
只是一个想法:使用fiddler / othersniffer来嗅探http请求内容以查看是否存在元数据?
答案 2 :(得分:0)
您需要在Appdelegate didFinishLaunchingWithOptions方法中注册NSURLProtocol的子类。
然后您可以看到视频播放器发出的请求的响应