视频 – Windows Media Foundation使用IMFTransform将mp4电影帧
我正在尝试使用
Windows Media Foundation类解码mp4视频,并将帧转换为可由DirectX着色器用于渲染的2D纹理.我已经能够使用MFCreateSourceReaderfromURL读取源流,并且能够按预期读取其主要类型MFMEdiaType_Video和次要类型为MFVideoFormat_H264的流的媒体类型.
我现在需要将此格式转换为RGB格式,该格式可用于初始化D3D11_TEXTURE2D资源和资源视图,然后可以将其传递给HLSL像素着色器进行采样.我已经厌倦了使用IMFTransform类为我做转换但是当我尝试将转换的输出类型设置为任何MFVideoFormat_RGB变体时,我得到一个错误.我也尝试在源阅读器上设置一个新的输出类型,并且只是希望以正确的格式获取样本的采样,但我再次没有运气. 所以我的问题是: >这种转换是否可行? 正在使用的操作系统是Windows 7,所以我不能使用SourceReaderEx或ID3D11VideoDevice接口,因为据我所知,这些解决方案似乎只在Windows 8上可用. 我们非常感谢任何正确方向的帮助/指针,如有必要,我还可以提供一些源代码. 解决方法
我发现你在理解Media Foundation时有些错误.您希望从MFVideoFormat_H264获取RGB格式的图像,但不使用解码器H264.您写道“我已经厌倦了使用IMFTransform类” – IMFTransform不是类.它是Transform COM对象的接口.您必须创建COM对象Media Foundation H264解码器. Microsoft软件H264解码器的CLSID是CLSID_CMSH264DecoderMFT.但是,从该解码器,您可以获得以下格式的输出图像:
输出类型 MFVideoFormat_I420 MFVideoFormat_IYUV MFVideoFormat_NV12 MFVideoFormat_YUY2 MFVideoFormat_YV12 您可以从其中一个创建D3D11_TEXTURE2D.或者您可以从我的项目CaptureManager SDK中执行以下操作: CComPtrCustom<IMFTransform> lColorConvert; if (!Result(lColorConvert.CoCreateInstance(__uuidof(CColorConvertDMO)))) { lresult = MediaFoundationManager::setInputType( lColorConvert,lVideoMediaType,0); if (lresult) { break; } DWORD lTypeIndex = 0; while (!lresult) { CComPtrCustom<IMFMediaType> lOutputType; lresult = lColorConvert->GetOutputAvailableType(0,lTypeIndex++,&lOutputType); if (!lresult) { lresult = MediaFoundationManager::getGUID( lOutputType,MF_MT_SUBTYPE,lSubType); if (lresult) { break; } if (lSubType == MFVideoFormat_RGB32) { LONG lstride = 0; MediaFoundationManager::getStrideForBitmapInfoHeader( lSubType,lWidth,lstride); if (lstride < 0) lstride = -lstride; lBitRate = (lHight * (UINT32)lstride * 8 * lNumerator) / lDenominator; lresult = MediaFoundationManager::setUINT32( lOutputType,MF_MT_AVG_BITRATE,lBitRate); if (lresult) { break; } PROPVARIANT lVarItem; lresult = MediaFoundationManager::getItem( *aPtrPtrInputMediaType,MF_MT_FRAME_RATE,lVarItem); if (lresult) { break; } lresult = MediaFoundationManager::setItem( lOutputType,lVarItem); if (lresult) { break; } (*aPtrPtrInputMediaType)->Release(); *aPtrPtrInputMediaType = lOutputType.detach(); break; } } } } 您可以设置ColorConvertDMO,以便将H264解码器的输出格式转换为您所需的格式. 此外,您可以通过链接查看代码:videoInput.此代码从网络摄像头获取实时视频并将其解码为RGB.如果您更换mp4视频文件源上的网络摄像头源,您将获得接近您需要的解决方案. 问候 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Windows上运行任意的子进程,并且仍然彻底终止?
- 8 款macOS 分屏应用让你的桌面窗口不再乱糟糟
- [windows官网]虚拟地址空间
- windows-server-2008 – Windows Server Backup表示将其他目
- windows – 使用希腊语文本编译.Rnw到pdf
- windows-server-2003 – Windows Server 2003 – 黑屏,光标
- Windows上的SQLite数据库是否有MySQLAdmin或SQL Server Man
- winapi – Win32消息队列有多深?
- Web服务器IIS6的PHP5.2.5最佳配置方法
- 有没有办法让tortisesvn使用Windows 7 kerberos票证来对抗a
- windows – 如何让iCacl在文件夹级别授予访问权限
- windows-7 – W7(或Vista)上ReadyBoost的用处
- windows – 如何说服Visual Studio在TCP / IP上使
- windows-server-2008-r2 – FileZilla FTP的被动
- windows-phone-7 – 无法从c#访问应用程序按钮(W
- Windows 10 下彻底关闭 Hyper-V 服务
- windows – 如何在Internet上获取文件版本但不下
- 使用命令行工具更改Windows网络共享权限
- 微信PCHOOK。
- 值为NULL的列是否会影响Microsoft SQL Server的性