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: 1
以 ICY 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。
有几个注意事项:
- 虽然示例仍然适用于 Windows 7,但支持
200 OK
的新 Scheme 处理程序仅适用于 Windows 8 和(可能)更高版本。
- 它需要 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 本身。
我尝试从 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: 1
以ICY 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。
有几个注意事项:
- 虽然示例仍然适用于 Windows 7,但支持
200 OK
的新 Scheme 处理程序仅适用于 Windows 8 和(可能)更高版本。 - 它需要 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 本身。