通过HTTP直播流从MP3中提取ID3标签

时间:2011-02-23 00:17:20

标签: iphone cocoa-touch avfoundation id3 http-live-streaming

我一直很难从通过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仍在批准我公司的开发者帐户。

3 个答案:

答案 0 :(得分:9)

您可能想尝试在commonMetadata上使用timedMetadata,而不是使用AVPlayerItem

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];

答案 1 :(得分:0)

只是一个想法:使用fiddler / othersniffer来嗅探http请求内容以查看是否存在元数据?

答案 2 :(得分:0)

您需要在Appdelegate didFinishLaunchingWithOptions方法中注册NSURLProtocol的子类。

然后您可以看到视频播放器发出的请求的响应