目的是实现用于视频处理和与外部应用程序同步的自定义MFT。细节并不重要。我想要实现的第一步是让MFT启动和运行使用DXVA视频处理或DXVA-HD。我没能这么做。
下面是我所做的工作:我开始用源输入节点(我的摄像头)、MFT ( MFT_Grayscale示例)和EVR构建一个拓扑。我在一个小的应用程序中包括了这个。拓扑正常工作,我可以从相机上看到单色流。现在,我想更改MF_Grayscale示例的代码,以便它支持DXVA视频处理,并且可以使用VideoProcessBlt方法提供的硬件加速。微软的文档给出了一些零碎的信息,但我无法实现正在运行的MFT。
我到目前为止所做的:
GetAttributes方法中,我指出这个MFT是MF_SA_D3D_AWARE。ProcessMessage中,我处理消息MFT_MESSAGE_SET_D3D_MANAGER以获得设备句柄、IDirect3DDeviceManager9和IDirectXVideoProcessorService。SetInputType方法中,我使用这里描述的方法,https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx获得一个DXVA2_VideoDesc结构,然后按照这个代码https://msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx创建一个视频处理设备。此外,我使用IDirectXVideoProcessorService->CreateSurface创建曲面GetOutputStreamInfo中,dwFlags变量如下所示:pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
在这里之前一切似乎都很好。现在我的问题(很抱歉,我不能说得更具体):
GetOutputAvailableType/SetOutputType方法吗?ProcessInput方法中,我得到IMFSample并提取一个IMFMediaBuffer。缓冲区不是根据我的函数调用来管理IDirect3DSurface9的。我是否必须将缓冲区的数据保存到Direct3D表面?ProcessOutput方法中,为了建立一个起点,我希望将传入的帧转发到输出。VideoProcessBlt应该以1:1的比例从输入到输出。文件上说:
获取当前未使用的可用表面。如何确定表面是否在使用?
MFCreateVideoSampleFromSurface还是MFCreateDXSurfaceBuffer?现在的情况是,我没有看到任何视频输出(窗口有其默认的窗口背景色)和网络摄像头停止捕捉帧后,第一帧( LED开关关闭)。除此之外,什么都没有发生--应用程序只是继续运行,而没有显示任何内容)。
我希望有人能帮我。如果有人能指示我使用DXVA视频处理或DXVA-HD为MFT示例代码,我也会很感激。我什么都找不到..。
谢谢
发布于 2015-07-13 11:59:52
我必须调整GetOutputAvailableType/SetOutputType方法吗?
是。您需要像往常一样提供属性,没有特殊的要求。
我是否必须将缓冲区的数据保存到Direct3D表面?
是。在这样做时,您需要关心IDirect3DDeviceManager9和LockDevice,因为EVR可以同时使用表面。
如何确定表面是否在使用?
你必须关心,特别是当表面是免费的使用。您的MFT需要实现IMFAsyncCallback接口。使用MFCreateVideoSampleFromSurface之后,查询IMFTrackedSample接口并调用SetAllocator。Invoke方法将告诉您何时表面是空闲的。
我该怎么输出表面呢?我应该使用MFCreateVideoSampleFromSurface还是MFCreateDXSurfaceBuffer?
因为您使用的是IDirectXVideoProcessorService->CreateSurface,所以MFCreateVideoSampleFromSurface是正确的位置。通过IMFSample输出表面。
检查此项目:
MFNode
在MFTDxva2Decoder和MFSkDxva2Renderer下,您将看到一些dxva2处理。
发布于 2015-04-04 23:05:52
获取媒体基金会示例的最简单方法是从http://www.microsoft.com/en-us/download/details.aspx?id=8279下载并安装“MicrosoftWindowsSDKforWindows7和.NET Framework4”。安装这些示例,然后在'v7.1/ Samples /Multimedia/MediaFoundation‘上找到它们。据推测,媒体基金会的样本在微软的代码库网站上,但我一直无法在那里找到它们。这些示例不再包含在Windows版本中。
与您的问题直接相关的示例可能是解码器、DXVA_HD、DXVA2_VideoProc、EVRPresenter、MPEG1Source和拓扑编辑。
我无法提供更多的帮助,因为我目前正在努力解决一些同样的问题。
https://stackoverflow.com/questions/28448764
复制相似问题