【问题标题】:Extracting ID3 tags from MP3 over HTTP Live Streaming通过 HTTP Live Streaming 从 MP3 中提取 ID3 标签
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我也试过了!但是网站上的 Wowza 示例代码是错误的,一旦他们的支持小组修复了它,我就忘记了使用 timedMetadata 运行我的测试。但这行得通!谢谢!
【解决方案2】:

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

【讨论】:

  • 除了手动下载媒体片段外,我还使用 Wireshark 来执行此操作。元数据存在。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2011-09-14
    • 2012-05-02
    相关资源
    最近更新 更多