Media Foundation .NET:如何从shoutcast获取歌曲名称

时间:2017-04-27 00:14:19

标签: c# .net ms-media-foundation shoutcast icecast

我尝试从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获取更新,我需要实现什么才能触发上述事件?

提前感谢你的时间和仁慈。

2 个答案:

答案 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。

有几点需要注意:

  1. 虽然示例仍可在Windows 7上运行,但支持200 OK的新Scheme处理程序仅适用于Windows 8和(可能)以后。
  2. 它需要MediaFoundation .Net的测试版。
  3. ShoutCast-2015 sample中包含.Net 4.5.2的预建版本库。库源已签入cvs

    这不是商业准备的&#34;代码,但它确实显示了基本概念。如果有人想让它变得更好,那么(评论的)来源就会被包括在内。特别是,它不能处理非ascii歌曲标题,我非常确定流处理可以更有效地避免音频缺口(或者失败,将差距传达给MF并做得更好缓冲&#39;以避免下一个缺口。)

答案 1 :(得分:0)

流网址已包含艺术家和歌曲名称的元数据(至少)。 所以你的实际来源就是网址。