【问题标题】:Media Foundation .NET: How to get song title from shoutcastMedia Foundation .NET:如何从直播中获取歌曲名称
【发布时间】:2017-04-27 00:14:18
【问题描述】:

我尝试从直播流中获取歌曲标题,但事件: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 从广播中获取更新,我需要实现什么来触发上述事件?

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

【问题讨论】:

  • 我怀疑这是一个多层次的问题。我怀疑 MF 只理解 ID3 并且仅适用于文件。此外,为了让您的流包含元数据,您需要告诉服务器注入它,然后在将其移交给解码器之前将其删除。我对MF不熟悉,所以不知道它是否有这种模式。请注意,在 Icecast 的情况下,首选的流容器是 Ogg,它的处理方式又有所不同。
  • 有一个关于使用 MF here 的喊话的详细讨论。来自 MS 的响应似乎是,由于 icecast 没有像其他广播服务器那样发送预期的ICY 200 OK,因此 MF 无法正确处理它。那篇文章有些过时(2010 年),所以也许有一个更新的解决方案。
  • @Mario 您应该创建自己的代码来从流中解复用带内元数据,然后将常规流发送到正在解码的任何地方。

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


【解决方案1】:

根据您的具体情况,这个问题有几个答案。例如,

Windows 7

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

注意:如果无法说服服务器回复 ICY 200 OK(例如,如果它只使用 200 OK),则无法说服 MF 为您自动解析标​​题(尽管可以这样做自己解析——也许是 MFT?)。

事实上,如果服务器在回复200 OK 后发送歌曲标题,MF 将尝试“播放”这些标题。这些哔哔声/嗡嗡声可能非常烦人(迪斯科音乐除外,因为你怎么知道?)。

我曾想过尝试创建这样的 MFT,但后来我意识到:

Windows 8

MS 采用了不同的方式,而不是“修复”MF 以允许任何指定 icy-metaint 的流提供歌曲标题(看似很小的修复)。

他们完全破坏了使用 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 中包含使用 .Net 4.5.2 的库的预构建版本。库源签入cvs

这不是“商业就绪”的代码,但它确实展示了基本概念。如果有人想让它变得更好,则包括(评论的)来源。特别是,它不处理非 ascii 歌曲标题,我很确定流处理可以更有效地避免音频间隙(或失败,将间隙传达给 MF 并更好地“缓冲”以避免下一个间隙)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2015-08-09
      相关资源
      最近更新 更多