从HTTP Live Streaming中提取MP3的ID3标签

12

我一直在努力从通过直播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模拟器来运行它。由于苹果公司仍在批准我们公司的开发者帐户,因此我尚不能将其放在设备上。


你能提供使用id3 wowza库发送元数据的模块的源代码吗?在客户端,你使用“timedMetadata”捕获了元数据? - user759001
3个回答

9

不要使用commonMetadata,您可以尝试在AVPlayerItem上使用timedMetadata

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

我也试过那样做!但是Wowza网站上的示例代码有误,一旦他们的支持小组修复了它,我就忘记使用timedMetadata再次运行测试。但那起作用了!谢谢! - Marc W

0
只是一个想法:使用 Fiddler/其他网络嗅探工具来嗅探 HTTP 请求内容,查看是否存在元数据?

我使用Wireshark来完成这个任务,除此之外还手动下载了媒体片段。元数据已经存在。 - Marc W

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接