我已经研究了一整天,但没有走得太远。我使用的是windows7,使用的是directx11(我的最终输出是DX11纹理上的一帧视频)我想解码一些非常大的H.264视频文件,但CPU (使用libav)无法对其进行解码。
我已经使用DXVA2研究了libav的hwaccel功能,但在需要创建IDirectXVideoDecoder时遇到了障碍,因为它只能通过D3D9接口创建。(使用DX11时我没有这样的功能)
每当我查找DXVA文档时,它都没有引用DX11,这是在DX10还是11中删除的?(找不到任何证实这一点的地方,也没有任何地方说DXVA2是多余的,可能它已经被DXVA-HD取代了?)
然后我研究了媒体基础软件开发工具包,因为它看起来像是我应该在DX11中使用的……但是这些类型都不存在于我的头文件中(文档说只包含,但这不会产生任何结果)。他们还指定至少要使用Windows8。
我相信要使用MF,我需要windows8sdk,它现在包含了所有的directx库/头文件。
所以这就留下了一个与windows7的差距...有没有可能获得硬件加速的视频解码?如果是这样的话,我应该使用哪个API?
编辑:作为另一个后续,我的MediaFoundation (以及AVF、android、magic leap等)实现在我的开源项目https://github.com/NewChromantics/PopH264 Edit2中:但我不知道它是否支持win7 :)
发布于 2014-07-08 18:45:46
D3D11提供了一个视频接口,它基本上是DXVA2的,但上面的界面略有改变。你需要很好地理解h.264码流才能继续(真的!)也就是说,确保你手头有一个h.264解析器来提取SPS和PPS结构的字段以及编码帧的所有切片。
1)从您的ID3D11Device获取ID3D11VideoDevice实例,从您的即时D3D11设备获取ID3D11VideoContext上下文注意:在Win7上,您必须创建具有功能级9_3的设备才能获得视频支持!(在Win8中,它可以正常工作)
2)使用ID3D11VideoDevice::GetVideoDecoderProfileCount,GetVideoDecoderProfile,CheckVideoDecodeRFormat创建h.264的ID3D11VideoDecoder实例...遍历所有支持的配置文件,并找到一个没有胶片颗粒的h264的GUID D3D11_DECODER_PROFILE_H264_VLD_NOFGT。作为OutputFormat,你最好的选择是DXGI_FORMAT_NV12。
3)单个帧的解码请参见Supporting Direct3D 11 Video Decoding in Media Foundation
解码的帧纹理) outputView
缓冲区中填充了相应的DXVA2结构(参见dxva2.h)完整的DXVA2规范在这里,您将需要它来相应地映射H.264SP/pps字段。
请参见:
然后:
3) GPU还包含所有参考帧/曲面的信息-您需要自己管理它们,即确保曲面/纹理可用于D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS!
这是相当复杂的,检查DX11和媒体播放器经典,他们都有DXVA2 (虽然不是通过ffmpeg )支持。
4)从NV12转换为RGB(A),一些GPU (D3D11功能级别)允许使用NV12作为着色器输入,有些则不允许。如果不能直接使用NV12,可以看看D3D11VideoProcessor接口,这些接口为所有支持D3D11的GPU提供NV12/YUV420->RGB转换。
转换可以在如下代码中执行:
// Setup ID3D11Video*
ID3D11VideoProcessor * d3dVideoProc = ...;
ID3D11VideoDevice * d3dVideoDevice = ...;
ID3D11VideoProcessorEnumerator * d3dVideoProcEnum = ...;
ID3D11Texture2D * srcTextureNV12Fmt = ...;
ID3D11Texture2D * dstTextureRGBFmt = ...;
// Use Video Processor
// Create views for VideoProc In/Output
ID3D11VideoProcessorInputView * videoProcInputView;
ID3D11VideoProcessorOutputView * videoProcOutputView;
{
D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = { 0 };
inputViewDesc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
inputViewDesc.Texture2D.ArraySlice = arraySliceIdx;
inputViewDesc.Texture2D.MipSlice = 0;
hr = d3dVideoDevice->CreateVideoProcessorInputView(srcTextureNV12Fmt, d3dVideoProcEnum, &inputViewDesc, &videoProcInputView);
}
{
D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputViewDesc = { D3D11_VPOV_DIMENSION_TEXTURE2D };
outputViewDesc.Texture2D.MipSlice = 0;
hr = d3dVideoDevice->CreateVideoProcessorOutputView(dstTextureRGBFmt, d3dVideoProcEnum, &outputViewDesc, &videoProcOutputView);
}
// Setup streams
D3D11_VIDEO_PROCESSOR_STREAM streams = { 0 };
streams.Enable = TRUE;
streams.pInputSurface = videoProcInputView.get();
RECT srcRect = { /* source rectangle in pixels*/ };
RECT dstRect = { /* destination rectangle in pixels*/ };
// Perform VideoProc Blit Operation (with color conversion)
hr = videoCtx_->VideoProcessorBlt(d3dVideoProc, videoProcOutputView.get(), 0, 1, &streams);发布于 2016-01-06 22:40:48
作为后续,我目前正在使用Windows7、8和10的MediaFoundation,以及directx(或者在8+的情况下只使用windows SDK )
它支持更少的格式(或者更确切地说,分辨率/配置文件级别),目前我不确定它是否使用了硬件加速……
但是这个API是兼容的,它是原始的查询
发布于 2018-10-17 05:26:44
如何在DirectX11和windows 7中使用硬件加速视频/H.264解码?
你不能。
ID3D11VideoDevice仅适用于Windows8 ID3D11VideoDevice。
ID3D11VideoDecoder仅适用于Windows8 ID3D11VideoDecoder。
在Windows7上,你只需要使用DirectX9来实现硬件加速视频/H.264即可。感谢微软。好消息是,IDirect3D9Ex工作了.嗯..。另一个好消息是,在Windows7上使用DirectX9时,图形处理器的解码性能非常好。
这是Windows7和DirectX 9的源代码:mofo7777,在H264Dxva2Decoder项目下。
https://stackoverflow.com/questions/19846770
复制相似问题