我尝试从shoutcast流中获取歌曲标题,但事件:MENewStream,MEEndOfStream,MESourceMetadataChanged从未被触发,没有任何更新。
这就是我创建媒体源的方式:
hr = sourceResolver.CreateObjectFromURL(
mediaURL, MFResolution.ByteStream, properties, out mediaStream
);
hr = sourceResolver.CreateObjectFromByteStream(
mediaStream, mediaURL, MFResolution.MediaSource, properties, out objectType, out mediaSource
);
这就是我获取元数据的方式:
hr = MFExtern.MFGetService(
mediaSource, MFServices.MF_METADATA_PROVIDER_SERVICE, typeof(IMFMetadataProvider).GUID, out obj
);
IMFMetadataProvider metadataProvider = obj as IMFMetadataProvider;
hr = mediaSource.CreatePresentationDescriptor(out descriptor);
hr = metadataProvider.GetMFMetadata(descriptor, 0, 0, out metadata);
在应用程序的某个地方我打电话:
Display(stream.Metadata);
仅返回:
"Bitrate" : 128
"Title" : ...(station name)
"WM/Genre" : ...
"WM/PromotionURL": ...
问题是:如何通过Media Foundation .NET从shoutcast获取更新,我需要实现什么才能触发上述事件?
提前感谢你的时间和仁慈。
答案 0 :(得分:1)
根据您的具体情况,这个问题有几个答案。例如,
Windows 7
ICY 200 OK
将自己标识为ICY服务器,则可以使用cout代码,例如shoutcast.zip代码here。添加对歌曲标题的支持对现有样本来说是一个相当微不足道的变化。ICY 200 OK
哄骗回复Icy-Metadata: 1
,那么明确使用UrlMonSchemePlugin而不是允许SourceResolver解析该网址可以提供帮助。注意:如果无法说服服务器回复ICY 200 OK
(例如,如果它只使用200 OK
),则无法说服MF自动为您解析标题(尽管可能你可以自己做解析 - 也许是MFT?)。
事实上,如果服务器在用200 OK
回复后发送歌曲标题,MF会尝试播放'标题。这些哔哔声/嗡嗡声可能非常烦人(迪斯科音乐除外,你怎么知道?)。
我想过尝试创建这样一个MFT,但后来我意识到:
Windows 8
而不是修复' MF允许指定icy-metaint
的任何流提供歌曲标题(看似微小的修复),MS采用了不同的方式。
他们完全 已经 能够使用MF传输mpeg音频。
在W7上正常工作的相同程序(上面)现在在W8上给出了MF_E_BYTESTREAM_NOT_SEEKABLE错误。这看起来很奇怪,因为这些流在W7中也是不可寻找的,但显然现在这是一个致命的错误。
MS希望人们可以使用一些新的方法,但我不知道它可能是什么。
<强>更新强>
让我感到困扰的是,这在Windows 8上无效。所以我创建了自己的Scheme处理程序(也用c#编写)。除了处理使用ICY 200 OK
的流之外,这个流还只处理200 OK
(以及其他一些功能)。并且,它支持(仅)足够寻求与W8的SourceResolver一起工作。因此(几乎)相同的播放器应用程序适用于W7和W8。
有几点需要注意:
200 OK
的新Scheme处理程序仅适用于Windows 8和(可能)以后。ShoutCast-2015 sample中包含.Net 4.5.2的预建版本库。库源已签入cvs。
这不是商业准备的&#34;代码,但它确实显示了基本概念。如果有人想让它变得更好,那么(评论的)来源就会被包括在内。特别是,它不能处理非ascii歌曲标题,我非常确定流处理可以更有效地避免音频缺口(或者失败,将差距传达给MF并做得更好缓冲&#39;以避免下一个缺口。)
答案 1 :(得分:0)
流网址已包含艺术家和歌曲名称的元数据(至少)。 所以你的实际来源就是网址。