首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在directx 11和windows 7中使用硬件加速视频/H.264解码?

如何在directx 11和windows 7中使用硬件加速视频/H.264解码?
EN

Stack Overflow用户
提问于 2013-11-08 05:10:52
回答 3查看 17.6K关注 0票数 14

我已经研究了一整天,但没有走得太远。我使用的是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 :)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

  • ID3D11VideoContext::DecoderBeginFrame(解码器,
    • D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS
    • D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX
    • D3D11_VIDEO_DECODER_BUFFER_BITSTREAM
    • D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL

解码的帧纹理) outputView

  • 填充缓冲区:
  • ID3D11VideoContext::DecoderBeginFrame(

缓冲区中填充了相应的DXVA2结构(参见dxva2.h)完整的DXVA2规范在这里,您将需要它来相应地映射H.264SP/pps字段。

请参见:

然后:

  • ID3D11VideoContext::SubmitBuffers提交所有已填充的buffers
  • ID3D11VideoContext::DecoderEndFrame以完成当前帧

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转换。

转换可以在如下代码中执行:

代码语言:javascript
复制
// 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);
票数 23
EN

Stack Overflow用户

发布于 2016-01-06 22:40:48

作为后续,我目前正在使用Windows7、8和10的MediaFoundation,以及directx(或者在8+的情况下只使用windows SDK )

它支持更少的格式(或者更确切地说,分辨率/配置文件级别),目前我不确定它是否使用了硬件加速……

但是这个API是兼容的,它是原始的查询

票数 1
EN

Stack Overflow用户

发布于 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项目下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19846770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档