6

好获取元数据,以便我从使用的MPMoviePlayerController一个URL实时流。从的MPMoviePlayerController

Player = [[MPMoviePlayerController alloc] 
       initWithContentURL:[NSURL URLWithString:@"MY_URL_HERE_I_REMOVED"]]; 
Player.movieSourceType = MPMovieSourceTypeStreaming 

现在该流给出元数据(我相信这就是大家都称之为的)。例如。轨道等

我要得到这个信息,并在标签显示它的名称。

我不知道如何得到它,我不能改变从MPMoviePlayerController和搜索小时后,我发现MPTimedMetadata类引用,但不知道如何使用获取此信息。

伟大的,如果你可以提到如何使用该通知还触发每到这个数据的变化。

回答

14

假设你已经知道什么样的元数据正在从流发送(如果你不这样做,使用媒体播放器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类的引用,并从那里可以找到...的代码!

+0

令人惊叹!谢谢! – Genevios 2014-08-06 20:36:00

+0

嗨...四年后,但仍然,请问......是否有任何情况下'timedMetadata'方法返回一个具有多个'MPTimedMetadata'实例的数组?现在我正在使用'for-in'循环来获得所有这些,但是我想知道是否真的有必要使用数组的第一个元素。谢谢! – 2016-01-20 14:50:09

+0

从技术上讲......可以。这需要一个自定义编译的Icecast版本或一个新的Shoucast/Icecast版本来改变这一点。在特殊情况下,它*可能*返回第二个对象,可能包含*站点的网址。根据我的经验,我100%确定标准Shoutcast/Icecast服务器将在第一个(索引0)对象上具有元数据。 – Pericles 2016-01-22 18:46:07