【GPU编解码】GPU硬解码---DXVA

前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码。

一、DXVA介绍

DXVA是微软公司专门定制的视频加速规范,是一种接口规范。DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反余弦变换;Mocomp,运动补偿,Pixel Prediction;PostProc,显示后处理。其中,VLD加速等级最高,所以其包含IDCTMoCoopmPostProcIDCT加速次之,包含MoCoopmPostProc;最后MoComp加速仅包含PostProc。一款显卡芯片在硬件支持DXVA规范,并不代表它就实现了DXVA所有功能。DXVA_Checker可用于检测硬件所支持的等级,DXVA_Checker运行示意图如下所示。

二、使用FFmpeg中DXVA技术硬解码

基本思路:

1.根据FFmpeg对编码器的描述,实现自定义的硬解码器。

2.通过REGISTER_ENCODEC(X,x)将自定义的视频编码器添加到视频编解码器。

3.在视频解码,根据编码器ID或编码器名称找到视频编解码器中自定义的视频解码器。

4.利用自定义的视频解码器,解码视频。

其关键步骤是:自定义解码器的实现,需要参考FFmpeg源码中,解码器的定义和接口设计。

基于DXVA的自定义解码器实现

1.熟悉FFmpeg中编解码的组织方式

下图是ffmpeg编解码组织的简单示意图。

由示意图可知,编解码器由全局链表组织,可根据编码器的名称或ID,获取编解码器。

编解码器的具体编解码的具体工作,由编解码器定义的函数指针完成。

自定义解码器时,需要按照AVCodec结构体,定义解码器的属性,然后注册到全局编解码器链表中。

2.基于DXVA解码器的定义实现

ff_h264_dxva2_decoder的定义如下:

  1. AVCodec ff_h264_dxva2_decoder = { 
  2.     .name           = "h264_dxva2"
  3.     .type           = AVMEDIA_TYPE_VIDEO, 
  4.     .id             = AV_CODEC_ID_H264, 
  5.     .priv_data_size = sizeof(DXVA2_DecoderContext), 
  6.     .init           = h264_dxva2dec_init, 
  7.     .close          = h264_dxva2dec_close, 
  8.     .decode         = h264_dxva2dec_decode, 
  9.     .capabilities   = CODEC_CAP_DELAY, 
  10.     .flush          = h264_dxva2dec_flush, 
  11.     .long_name      = NULL_IF_CONFIG_SMALL("H.264 (DXVA2 acceleration)"), 
  12. }; 

ff_h264_dxva2_decoder的函数指针对应的函数定义如下:

  1. static int h264_dxva2dec_decode(AVCodecContext *avctx, void *data, int *got_frame, 
  2.                                   AVPacket *avpkt) 
  3.     return ff_dxva2dec_decode(avctx,data,got_frame,avpkt,&ff_h264_decoder); 
  4.  
  5. static av_cold int h264_dxva2dec_close(AVCodecContext *avctx) 
  6.     return ff_dxva2dec_close(avctx,&ff_h264_decoder); 
  7.  
  8. static av_cold int h264_dxva2dec_init(AVCodecContext *avctx) 
  9.     return ff_dxva2dec_init(avctx,&ff_h264_dxva2_decoder,&ff_h264_decoder); 
  10.  
  11. static void h264_dxva2dec_flush(AVCodecContext *avctx) 
  12.     ff_dxva2dec_flush(avctx,&ff_h264_decoder); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一款由 KMPlayer 的原作者姜勇希在跳槽到 Daum 公司后使用 C++ 完全重写的播放器。它基本上继承了 KMPlayer 方便的滤镜的管理系统。同时简化了内部的解码器体系。现在基本依靠 Bass 和 FFmpeg 系滤镜解决播放问题。Potplayer 具有DXVA 硬件解码以及多线程解码功能,使您能更流畅的观看高清影片。在相对小巧的体积下 Potplayer 实现支持绝大多数视频格式的功能。美化主程序图标和关联图标,移除了聊天模块、VC库和连接,集成了real解码器,加入一款精美透明皮肤(开启皮肤D3D模式可实现)。体积小巧、界面简洁、功能强大,没有任何广告和垃圾信息,是本地视频播放器的最佳不二之选。同时汉化版抛弃了以往 KMP 制作时追求大而全的模式而改以精简的方式,使 Potplayer 成为真正的便携播放器! PotPlayer就是KMPlayer作者换公司之后基于KMPlayer开发出来的。当年全能播放器领域最出名的数暴风影音和Kmplayer。Kmplayer站到了傻瓜播放器对面的队伍,适合有一定动手能力的玩家,它可以满足各类用户的定制需求,有丰富的参数设定可以满足你的要求,比如多字幕的挂载。本身也很全能,性能强悍。专业性尤其迎合了高清党的需求。Potplayer作为后辈,继承了Kmplayer的衣钵,而且有64bit版本,简直找不到更好的播放器。最大的优点——不流氓!
FFmpeg是一种开源的多媒体处理工具,其中包含了dxva2解码功能。DXVA2是DirectX Video Acceleration 2的缩写,它是一种能够充分利用显卡硬件加速的视频解码技术。 使用FFmpeg进行dxva2解码时,可以获得以下几个优势: 1. 提高解码效率:dxva2解码能够使用显卡的硬件加速能力,从而大大提高视频解码的效率。相较于软解码,在相同的硬件条件下,dxva2解码可以更快地完成对视频的解码工作。 2. 减轻CPU负担:由于dxva2解码利用显卡进行解码,可以减轻CPU的负担,从而为其他任务提供更多的计算资源。这对于同时进行多任务处理的用户来说,尤其是一些对计算性能要求较高的场景,是非常有益的。 3. 优化视频播放体验:dxva2解码可以提供更平滑和流畅的视频播放体验。它能够更好地处理高分辨率、高比特率的视频文件,避免视频卡顿或者出现掉帧的情况。 然而,dxva2解码也存在一些限制和要求: 1. 硬件支持要求:要使用dxva2解码功能,需要具备支持DXVA2的显卡硬件。不同显卡型号和厂商支持的dxva2版本可能会有所不同,所以在使用前需要确认自己的显卡是否支持dxva2解码。 2. FFmpeg版本要求:为了能够使用dxva2解码功能,需要使用支持dxva2的FFmpeg版本。更新的FFmpeg版本通常会修复一些bug并加入新的功能,所以建议使用最新版本的FFmpeg。 总结来说,通过FFmpeg的dxva2解码功能,我们可以提高解码效率、减轻CPU负担,并获得更好的视频播放体验。需要注意的是,确保硬件和软件环境支持dxva2解码,并及时更新FFmpeg版本可以保证最佳的使用效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值