将 MPEG4 源过滤器扩展到其他媒体类型
Posted
技术标签:
【中文标题】将 MPEG4 源过滤器扩展到其他媒体类型【英文标题】:Extending MPEG4 Source Filter to other MediaTypes 【发布时间】:2020-06-30 11:00:30 【问题描述】:我正在创建一个 MFT 视频解码器,以向我的应用程序添加 Media Foundation 当前不支持的编解码器的支持。在这种情况下,它是 Hap 编解码器。这对 AVI 文件非常有用,但对 MOV 文件不起作用。
我在 MS 文档中读到,MPEG4 源过滤器(我相信它可以处理 MOV 文件)确实通过此处记录的 MFMPEG4Format_Base 机制支持其他未知的媒体类型: https://docs.microsoft.com/en-us/windows/win32/medfound/mpeg-4-file-source
所以我通过带有fourCC代码的MFMPEG4Format_Base向我的MFT工厂添加了新的子类型,并像往常一样使用MFTRegisterLocal()注册它。
问题是媒体基金会似乎仍然没有考虑使用我的 MFT。它甚至不使用工厂来创建 MFT 的实例来查看它是否可以连接它。
我不确定这是否相关,但我正在使用 IMFMediaEngine 进行播放,并较早在本地注册此 MFT。它适用于 AVI 文件,但不适用于 MOV。
网上关于 MFMPEG4Format_Base 的信息很少,所以我希望这里的人对此有经验并可以就我做错了什么提供建议,或者可能是另一种实现此目的的方法?
谢谢,
【问题讨论】:
你有任何 Hap MOV 样本吗? 是的,这里有一个:rh-testmedia.s3-eu-west-1.amazonaws.com/HapCodec/… 【参考方案1】:Stock Microsoft 的MPEG-4 Media Source 能够读取this sample MOV with HAP frame inside。
MSDN 文档通常是准确的,但存在细微差别。
轨道被指示为 FourCC 'Hap1' 视频,而不是您建议的 MFMPEG4Format_Base
。您不能扩展源代码,因为一般来说,它已经完成了预期的工作:它能够从此文件中读取数据。
Media Foundation 管道中此类内容的进一步可扩展性和播放支持假设存在用于此类内容的解码器 MFT。您需要安装这样的 MFT(如果有的话),或者自己开发。
【讨论】:
我已经创建了自定义 MFT 来解码这些帧,它在使用 AVI 容器时可以正常工作,但不能在 MOV 容器中使用。我已经使用 MFTRegisterLocal() 注册了 MFT,其中包含许多具有 Hap 子类型的 VIDEO 主要类型,例如:DEFINE_MEDIATYPE_GUID(MFVideoFormat_Hap, FCC('Hap1'));我想可能是IMFMediaEngine对MediaSession的解析只是因为某种原因在使用MPEG4源过滤器时没有考虑我的MFT,但是如果我手动连接它们可能会起作用....hmmm 解决了!出于某种原因,我必须向后定义 FourCC。我将在下面发布我的解决方案。欢迎评论。【参考方案2】:Roman 是正确的,MPEG-4 Media Source 可以支持其他子类型。我设法让它适用于我的用例,但我不得不颠倒 FOURCC 的顺序!
对于 AVI 文件,我可以为 Hap 子类型声明和使用这些 GUIDS:
DEFINE_MEDIATYPE_GUID(MFVideoFormat_Hap, FCC('Hap1'));
然后将我的 MFT 注册到 MFTRegisterLocal(_instance, MFT_CATEGORY_VIDEO_DECODER...
但这不适用于 MOV 容器。我必须使用 MFMPEG4Format_Base 类型并添加编解码器 FOURCC,但它仅在我颠倒顺序时才有效:
//
// this macro creates a media type GUID from a FourCC, D3DFMT, or WAVE_FORMAT
// based on MFMPEG4Format_Base which defines GUIDS for unknown mediaTypes
// when using the MF MPEG-4 Source
//
#ifndef DEFINE_MPEG4_MEDIATYPE_GUID
#define DEFINE_MPEG4_MEDIATYPE_GUID(name, format) \
DEFINE_GUID(name, \
format, 0x767a, 0x494d, 0xb4, 0x78, 0xf2, 0x9d, 0x25, 0xdc, 0x90, 0x37);
#endif
DEFINE_MPEG4_MEDIATYPE_GUID(MFVideoFormat_MPEG4_Hap, FCC('1paH'));
我不确定为什么顺序颠倒了,但它对我有用。
【讨论】:
以上是关于将 MPEG4 源过滤器扩展到其他媒体类型的主要内容,如果未能解决你的问题,请参考以下文章