【发布时间】: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