- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目的是为视频处理和与外部应用程序的同步实现自定义 MFT。的细节并不重要。作为第一步,我想要实现的是使用 DXVA 视频处理或 DXVA-HD 启动并运行 MFT。我做不到。
这是我所做的:我开始使用源输入节点(我的网络摄像头)、MFT(MFT_Grayscale 示例)和 EVR 构建拓扑。我将其包含在一个小应用程序中。拓扑有效,我可以看到来自相机的单色流。现在我想更改 MF_Grayscale 示例的代码,使其支持 DXVA 视频处理并可以使用 VideoProcessBlt 方法提供的硬件加速。Microsoft 文档提供了零碎的信息,但我无法实现正在运行的 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
。我是否必须将缓冲区的数据 memcpy 到 Direct3D 表面?
在 ProcessOutput
方法中作为起点,我想将传入帧转发到输出。 VideoProcessBlt
应该进行从输入到输出的 1:1 blit。文档说:
Get an available surface that is not currently in use.
如何确定表面是否在使用中?
我应该如何输出表面?我应该使用 MFCreateVideoSampleFromSurface
还是 MFCreateDXSurfaceBuffer
?
不幸的是,我真的很迷茫,无法使用文档取得任何进展。
现在的情况是我没有看到任何视频输出(窗口具有默认的窗口背景颜色)并且网络摄像头在第一帧之后停止捕捉帧(LED 关闭)。除此之外什么也没有发生——应用程序只是继续运行而没有显示任何内容。
我希望有人能帮助我。如果有人可以指导我使用 DXVA 视频处理或 DXVA-HD 的 MFT 示例代码,我将不胜感激。我找不到任何东西...
谢谢
最佳答案
Do I have to adapt the GetOutputAvailableType/SetOutputType methods?
是的。您需要照常提供属性,没有特殊要求。
Do I have to memcpy the data of the buffer to a Direct3D surface?
是的。执行此操作时需要关心 IDirect3DDeviceManager9 和 LockDevice,因为 EVR 可以同时使用该表面。
How can I determine whether a surface is in use?
您必须格外小心,尤其是当表面可以免费使用时。您的 MFT 需要实现 IMFAsyncCallback 接口(interface)。使用 MFCreateVideoSampleFromSurface 后,查询 IMFTrackedSample 接口(interface)并调用 SetAllocator。 Invoke 方法会告诉您表面何时空闲。
How am I supposed to output the surface? Should I use MFCreateVideoSampleFromSurface or MFCreateDXSurfaceBuffer?
因为您正在使用 IDirectXVideoProcessorService->CreateSurface,所以 MFCreateVideoSampleFromSurface 是正确的位置。您通过 IMFSample 输出表面。
检查这个项目:
在MFTDxva2Decoder和MFSkDxva2Renderer下,你会发现一些dxva2处理。
关于c++ - 使用 DirectX 视频加速 (DXVA) 实现媒体基础转换 (MFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28448764/
我在一个项目中工作,我必须从驱动器中枚举文件名。我尝试了两种方法 MFT 解析和 使用 FindFirstFile 进行多线程处理。我比较了两种实现的执行时间,它显示较小的 MFT 大小执行速度更快,
我正在使用 DesktopDuplication API 捕获桌面并将样本从 RGBA 转换为 GPU 中的 NV12,并将其提供给 MediaFoundation 硬件 H264 MFT。这适用于
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在编写一些代码来解析 NTFS 卷中磁盘上的 MFT。这很简单,但是一个特殊的极端案例引起了我的注意,我在互联网上的任何地方都找不到明确的答案。 对于 NTFS 中的普通文件,如果文件的属性多于单
我正在尝试提取主文件表(MFT)的内容。我已从 NTFS 卷复制 MFT 并将其另存为 .bin 文件。现在我尝试使用Python中提供的unpack函数来读取这个文件。我正在读取为存储在文件记录的文
对于我正在做的一些商业项目,我需要能够读取存储在 $mft 文件中的实际数据。 我找到了一个 gpl lib这可能会有所帮助,但由于它是 gpl,我无法将它集成到我的代码中。 有人可以指点我可以使用的
我正在编写一个程序来删除 Windows NTFS 卷中的文件和所有相关属性(包括 0x30 $FILE_NAME、0x80 $DATA、0x90 $INDEX_ROOT 和 0xA0 $INDEX_
在网上寻找有关如何读/写 MFT 的解释时,我发现了以下部分:( http://www.installsetupconfig.com/win32programming/1996%20AppE_apni
我正在使用 Windows Media Foundation 创建视频播放应用程序。 我使用 IMFTransform 接口(interface)和下面链接中提到的其他一些强制接口(interface
我也是媒体基础编程和 Windows 编程的新手。 这个问题看起来可能很愚蠢,但我在任何地方都没有得到明确的答案。 我的应用程序是捕获屏幕、缩放、编码并将数据发送到网络。我希望提高管道的性能。所以我想
有什么方法可以用 Python 或 JavaScript 访问 NTFS 主文件表 (MFT)? 最佳答案 您需要一个库来分析 NTFS 文件系统中的主文件表 ($MFT)。 对于 Python,有
我正在尝试从 MFT 中删除一个文件记录,如果我打开原始分区并通过解析 MFT 文件到达所需的文件记录,我就成功了。这种方法的问题是我必须首先锁定卷,以便我可以在任何 MFT 文件记录上写入零,如果其
要使用 Windows Media Foundation Transform 解码 H264 流,目前的工作流程是这样的: IMFSample sample; sample->SetTime(time
在我的 C# 应用程序中,我已经有了一种检查文件系统的方法,但我想利用从主文件表 (MFT) 读取的优势,因为它要快得多。我了解 1) 它是专有规范,因此如有更改,恕不另行通知,以及 2) 只有当应用
有人遇到过 VideoToolbox 无法正确解码媒体基础变换 (MFT) 编码的 H264 的问题吗?解码帧的一半以上具有绿色 block 失真。我试过Livy Stork's example用于解
我现在尝试在 Win10 pro Insider 预览版上使用 MP3 编码器 mft,但无法设置输出媒体类型。 下面是我的代码: // Fill in MPEGLAYER3WAVEFORMAT da
我正在努力将两个音频流混合成一个输出流。 MFNode 有一个 AudioMixerMFT,但当我尝试构建这样的拓扑并执行它时 TopoEdit 崩溃: 注意:我尝试了 Windows SDK 7.1
我正在编写一个工具,用于查找 iTunes 库中丢失的文件,适用于 Mac 和 Windows。在 Mac 上,我可以使用神奇的“目录搜索”功能通过命名快速查找文件。 但是,在 Windows 上,似
媒体基础转换对象 (MFT) 可以实现输出缓冲区分配模型,其中缓冲区由 MFT 对象在内部分配。 如果是这种情况,内部分配的缓冲区将通过传递给 IMFTransform::ProcessOutput(
我想使用“英特尔® 快速同步视频 H.264 编码器 MFT”对视频进行编码。如果我从系统缓冲区创建 IMFSample,它运行良好。就像下面这样: IMFMediaBuffer *pBuffer =
我是一名优秀的程序员,十分优秀!