我尝试从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": ...
问题是:我如何从媒体基金会.NET的喊叫声中获取更新,我需要实现什么来触发上述事件?
事先感谢您的时间和仁慈。
根据您的情况,有几个答案。例如,
Windows 7
- 如果您要连接到的服务器使用
ICY 200 OK
将自己标识为冰冷的服务器,则可以在此处使用C#代码。增加对歌曲标题的支持是对现有样本的相当微不足道的变化。 - 如果您要连接到的服务器可以通过发送
Icy-Metadata: 1
来哄骗与ICY 200 OK
响应,然后明确使用urlmonschemeplugin,而不是允许Sourceresolver解析URL可以帮助您。
注意:如果无法说服服务器使用ICY 200 OK
响应(例如,如果仅使用200 OK
(,则无法说服MF为您自动解析标题(尽管可以进行解析 - 也许是MFT?(。
实际上,如果服务器在使用200 OK
响应后发送歌曲标题,则MF将尝试"播放"标题。这些哔哔声/嗡嗡声可能非常烦人(除了迪斯科音乐以外,自从您怎么说?(
我考虑过尝试创建这样的MFT,但后来我意识到:
Windows 8
而不是"修复" MF,以允许任何指定icy-metaint
提供歌曲标题的流(看似较小的修复程序(,而是采取了不同的方式。
它们具有完全损坏使用MF播放MPEG音频的能力。
在W7上工作正常的同一程序(上图(现在给出了W8上的MF_E_BYTESTREAM_NOT_SEEKABLE错误。这似乎很奇怪,因为这样的流也无法在W7中寻找,但显然这是一个致命的错误。
MS可能会有一些新方法希望人们使用,但我不知道可能是什么。
更新:
这让我感到困扰,因为这在Windows 8上不起作用。因此,我创建了自己的计划处理程序(也用C#编写(。除了处理使用ICY 200 OK
的流外,该流还仅处理200 OK
(以及其他一些功能(。而且,它支持(仅(寻求与W8的Soutceresolver合作。因此(几乎(同一播放器应用程序同时适用于W7&W8。
有几个警告:
- 虽然样本仍然在Windows 7上工作,但支持
200 OK
的新方案处理程序仅在Windows 8上工作,并且(大概是(。 - 它需要MediaFoundation .Net的Beta版本。
使用.NET 4.5.2在2015年shoutcast-2015样本中包含的.NET 4.5.2。库源将被检查为简历。
这不是"商业就绪"代码,但确实显示了基本概念。如果有人想改善它,则包括(评论(来源。特别是,它无法处理非ASCII歌曲的标题,我很确定该流处理可能会更有效地避免音频差距(或者失败,将差距传达给MF并做得更好,并做得更好。为了避免下一个 gap(。
流url已经包含艺术家和歌曲名称的元数据(至少(。因此,您的实际来源是URL本身。