2011-02-23 112 views
12

我一直有一个相当困难的时间从正在流式传输的实时HTTP流式传输(使用Wowza媒体服务器,如果有人很好奇)的MP3中提取ID3信息。我知道标签(现在是专辑标签和专辑封面标签)已正确嵌入每个文件段中,因为当我手动下载它们时,我可以在每个段中看到它们,如.m3u索引文件中所列服务器。从HTTP通过HTTP提取ID3标签实时流式传输

我使用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]; 
} 

一旦我的志愿方法被触发时,我开始玩self.musicPlayer我呼吁它addPeriodicTimeObserverForInterval每个1/4秒。正是在这种方法中,我尝试提取ID3元数据。

我已经试过各种我能对事物的的iOS侧想到要做到这一点,包括对每个AVAssetTrack实例打印出

self.musicPlayer.currentItem.asset.commonMetadata 

以及迭代并打印出他们元数据。

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模拟器运行此。自从苹果仍在批准我公司的开发人员帐户后,我还无法将其放到设备上。

+0

做出反应?在客户端,您使用“timedMetadata”捕获元数据? – 2011-05-18 10:30:52

回答

9

而不是使用commonMetadata你可能想在AVPlayerItem使用timedMetadata尝试:

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

我也试过了!但是网站上的Wowza示例代码是错误的,一旦他们的支持小组修正了它,我忘了使用'timedMetadata'运行我的测试。但是,这工作!谢谢! – 2011-02-24 14:22:01

0

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

+0

除了手动下载媒体片段之外,我还使用Wireshark来做到这一点。元数据存在。 – 2011-02-24 12:28:07

+0

你有没有得到解决方案? – 2012-07-31 16:53:12

0

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

然后就可以看到该请求的您可以提供模块使用ID3 wowza库发送的元数据的源代码,通过视频播放器