假设你已经知道什么样的元数据正在从流发送(如果你不这样做,使用媒体播放器VLC喜欢看),您必须先注册一个通知,即可在一定的时间间隔的元数据和然后处理它们的方法。
与通知开始,只是
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MetadataUpdate:)
name:MPMoviePlayerTimedMetadataUpdatedNotification
object:nil];
中的MPMoviePlayerController分配后。
然后在MetadataUpdate方法
- (void)MetadataUpdate:(NSNotification*)notification
{
if ([streamAudioPlayer timedMetadata]!=nil && [[streamAudioPlayer timedMetadata] count] > 0) {
MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0];
metadataInfo = firstMeta.value;
}
}
其中streamAudioplayer是您的MPMoviePlayerController和metadataInfo一个NSString的存储值。以上将获得当前播放歌曲的歌手和曲目信息。
这是为了通过一个或的shoutcast的Icecast流发送标准元数据的情况。 (不能对别人说,因为我还没有尝试过)
注意,每个流可以处理和发送不同的元数据。 由于[streamAudioPlayer timedMetadata]是一个NSArray的,你可以
NSArray *metaArray = [streamAudioPlayer timedMetadata];
NSLog (@"%i", [metaArray count]); //to see how many elements in the array
MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0];
然后使用调试控制台显示利用密钥,密钥空间,时间戳值属性的元数据的内容。
以上所有仅仅是一个例子。没有一种方法可以处理元数据。 详细信息可以在
https://developer.apple.com/library/ios/#DOCUMENTATION/MediaPlayer/Reference/MPTimedMetadata_Class/Reference/Reference.html
为MPTimedMetadata类的引用,并从那里可以找到...的代码!
令人惊叹!谢谢! – Genevios 2014-08-06 20:36:00
嗨...四年后,但仍然,请问......是否有任何情况下'timedMetadata'方法返回一个具有多个'MPTimedMetadata'实例的数组?现在我正在使用'for-in'循环来获得所有这些,但是我想知道是否真的有必要使用数组的第一个元素。谢谢! – 2016-01-20 14:50:09
从技术上讲......可以。这需要一个自定义编译的Icecast版本或一个新的Shoucast/Icecast版本来改变这一点。在特殊情况下,它*可能*返回第二个对象,可能包含*站点的网址。根据我的经验,我100%确定标准Shoutcast/Icecast服务器将在第一个(索引0)对象上具有元数据。 – Pericles 2016-01-22 18:46:07