6

目的是为视频处理和与外部应用程序同步实现自定义 MFT。的细节并不重要。作为第一步,我想要实现的是使用 DXVA 视频处理或 DXVA-HD 启动和运行 MFT。我无法这样做。

这是我所做的:我开始使用源输入节点(我的网络摄像头)、MFT(MFT_Grayscale 示例)和 EVR 构建拓扑。我将它包含在一个小型应用程序中。拓扑有效,我可以看到来自相机的单色流。现在我想更改 MF_Grayscale 示例的代码,使其支持 DXVA 视频处理并可以使用 VideoProcessBlt 方法提供的硬件加速。Microsoft 文档提供了一些信息,但我无法实现正在运行的 MFT。

到目前为止我做了什么:

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根据我的函数调用,缓冲区没有管理 a 。我是否必须将缓冲区的数据存储到 Direct3D 表面?

  • ProcessOutput创建起点的方法中,我想将传入的帧转发到输出。VideoProcessBlt应该从输入到输出进行 1:1 blit。文档说:

    获取当前未使用的可用表面。

如何确定某个表面是否在使用中?

  • 我应该如何输出表面?我应该使用MFCreateVideoSampleFromSurfaceorMFCreateDXSurfaceBuffer吗?

  • 不幸的是,我真的迷路了,无法使用文档取得任何进展。

现在的情况是我看不到任何视频输出(窗口具有其默认的窗口背景颜色)并且网络摄像头在第一帧之后停止捕获帧(LED 关闭)。除此之外什么也没有发生——应用程序只是继续运行而不显示任何东西)。

我希望有人能帮助我。如果有人可以指导我使用 DXVA 视频处理或 DXVA-HD 为 MFT 示例代码,我也将不胜感激。我找不到任何东西...

谢谢

4

2 回答 2

2

我是否必须调整 GetOutputAvailableType/SetOutputType 方法?

是的。您需要像往常一样提供属性,没有特殊要求。

我是否必须将缓冲区的数据存储到 Direct3D 表面?

是的。执行此操作时需要注意 IDirect3DDeviceManager9 和 LockDevice,因为 EVR 可以同时使用表面。

如何确定某个表面是否在使用中?

您必须小心,尤其是当表面可以自由使用时。您的 MFT 需要实现 IMFAsyncCallback 接口。使用 MFCreateVideoSampleFromSurface 后,查询 IMFTrackedSample 接口并调用 SetAllocator。Invoke 方法会告诉您表面何时空闲。

我应该如何输出表面?我应该使用 MFCreateVideoSampleFromSurface 还是 MFCreateDXSurfaceBuffer?

因为您使用的是 IDirectXVideoProcessorService->CreateSurface,所以 MFCreateVideoSampleFromSurface 是正确的位置。您通过 IMFSample 输出曲面。

检查这个项目:

MFNode

在MFTDxva2Decoder和MFSkDxva2Renderer下,你会发现一些dxva2的处理。

于 2015-07-13T11:59:52.877 回答
1

获取 Media Foundation 示例的最简单方法是从http://www.microsoft.com/en-us/download/details.aspx?id=下载并安装“Microsoft Windows SDK for Windows 7 and .NET Framework 4” 8279 . 安装示例,然后将它们定位在“v7.1/Samples/Multimedia/MediaFoundation”。Media Foundation 示例应该在 Microsoft 的 Code Gallery 站点上,但我一直无法在那里找到它们。这些示例不再包含在 Windows SDK 版本中。

与您的问题直接相关的示例可能是 Decoder、DXVA_HD、DXVA2_VideoProc、EVRPresenter、MPEG1Source 和 topoedit。

我无法再提供帮助,因为我目前正在努力解决一些相同的问题。

于 2015-04-04T23:05:52.363 回答