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

Media Foundation .NET: How to get song title from shoutcast

我尝试从 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);

其中returns只有这些:

"Bitrate"       : 128
"Title"         : ...(station name)
"WM/Genre"      : ... 
"WM/PromotionURL": ...

问题是:如何使用 Media Foundation .NET 从 shoutcast 获取更新,我需要实施什么来触发上述事件?

提前感谢您的宝贵时间和善意。

根据您的情况,这个问题有多种答案。例如,

Windows 7

  • 如果您要连接的服务器使用 ICY 200 OK 将自己标识为 ICY 服务器,您可以使用 c# 代码,例如 shoutcast.zip 代码 here。添加对歌曲标题的支持是对现有示例的一个相当微不足道的更改。
  • 如果您要连接的服务器可以通过发送 Icy-Metadata: 1ICY 200 OK 来响应,则显式使用 UrlMonSchemePlugin 而不是允许 SourceResolver 解析 URL可以帮忙。

注意:如果无法说服服务器以 [​​=10=] 响应(例如,如果它只使用 200 OK),则无法说服 MF 自动为您解析标题(尽管也许可以自己进行解析 - 也许是 MFT?)。

事实上,如果服务器在用 200 OK 响应后发送歌曲标题,MF 将尝试 'play' 标题。这些 beeps/buzzes 可能非常烦人(迪斯科音乐除外,因为你怎么知道?)。

我想尝试创建这样一个 MFT,但后来我意识到:

Windows 8

不同于 'fixing' 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 的测试版。

ShoutCast-2015 sample. The library source is checked into cvs.

中包含一个使用 .Net 4.5.2 的库的 pre-built 版本

这不是 "commercial-ready" 代码,但它确实展示了基本概念。如果有人想让它变得更好,就包括(评论的)来源。特别是,它不处理 non-ascii 歌曲标题,而且我很确定流处理可以更有效地避免音频间隙(或者如果失败,将间隙传达给 MF 并更好地完成 'buffering' 以避免 下一个 差距)。

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