ffmpeg中已经实现了使用dxva加速解码部分代码。但是要整合在自己的播放器中dxva相关管理代码没有实现。 以下笔者带大家去实现一个基于dxva的加速解码器。 关键代码如下 dxva2_h264.c AVHWAccel ff_h264_dxva2_hwaccel = { .name = "h264_dxva2", .type .c #if CONFIG_WMV3_DXVA2_HWACCEL AVHWAccel ff_wmv3_dxva2_hwaccel = { .name = "wmv3_dxva2 static int Setup(va_dxva2_t *va, void **hw, const AVCodecContext *avctx) { //va_dxva2_t *va = vlc_va_dxva2 = NULL ) dxva_Delete( p_va ); p_va = dxva_New(avctx->codec_id); if(p_va !
0.前言 参考博客:ffmpeg实现dxva2硬件加速 下载源码:GitHub:https://github.com/Yacov-lu/ffmpeg-DXVA-decode MFCApplication2(基于对话框): 将源码中的文件夹《D3D》《include》《lib》、文件《D3DVidRender.h》《D3DVidRender.cpp》《ffmpeg_dxva2 .h》《ffmpeg_dxva2.cpp》、还有《Debug》文件中的《avcodec-57.dll》《avdevice-57.dll》《avfilter-6.dll》《avformat-57.dll》 2.2.3、问题3:执行到sws_getContext异常退出 调试发现:dxva2_init 返回值 -22,而源码执行发现返回值0;修改添加: 修改后 dxva2_init 返回0 ,便不再执行 2.3.6、int dxva2_init(AVCodecContext *s, HWND hwnd); 这步骤就是配置硬解码,函数dxva2_init是初始化配置dxva2解码器的入口,配置工作主要就是由它来完成
修改的文件位于libavutil/hwcontext_dxva2.c文件,我先将修改部分贴出来然后再给大家解释 hwcontext_dxva2.c修改部分 代码中dxva2_device_create9 _extend函数是我新加入的,并且在dxva2_device_create函数(这个函数是ffmpeg原始流程中的,我的改动不影响原本任何功能)中适时调用;简单来说,原来的ffmpeg也能基于dxva2 enable-shared --enable-small --disable-all --disable-autodetect --enable-avcodec --enable-decoder=h264 --enable-dxva2 --enable-hwaccel=h264_dxva2 --toolchain=msvc --prefix=host make && make install ? 让你再选一个,而我们首先认定了要用dxva2的硬件解码器,其次,如果dxva2初始化错误,ffmpeg内部会自动降级为内置264软解,因此我们无需多此一举。
DirectX视频加速(DXVA)是一个API和以及需要一个对应的DDI实现,它被用作硬件加速视频处理。软件CODEC和软件视频处理器可以使用DXVA将某些CPU密集型操作卸载到GPU。 DXVA 2 API需要Windows Vista或更高版本。 ,文章中的DXVA,大多数情况下指的实际上是 DAVA2)。 为了使用 DXVA功能,基本上只能根据需要选择使用DirectShow或者Media Foundation;另外,需要注意的是,DXVA/DXVA2/DXVA-HD只定义了解码加速,后处理加速,并未定义编码加速 现在,FFmpeg只支持了DXVA2的硬件加速解码,DXVA-HD加速的后处理和基于Media Foundation硬件加速的编码并未支持(在DirectShow时代,Windows上的编码支持需要使用
PotPlayer播放器,拥有强劲播放引擎加速,支持DXVA, CUDA, QuickSync,多媒体播放器支持蓝光3D,内置强大的解码器及滤镜/分离器,支持自定义添加解码器,对字幕的支持非常优秀,能够兼容特效字幕及在线搜索字幕实时翻译 HDR 转换功能到 H/W HDR 功能 + 添加 pes 文件播放功能 + 添加 HEVC 420P12, 422P10, 422P12, 444P8, 444P10, 444P10 DXVA - 修正在某些视频中应用旋转的视频截图时截图异常的问题 - 修正播放某些视频时发生的错误 - 修正某些菜单项未在快捷键中注册的问题 - 修正某些字幕无法显示的问题 - 修正 dxva copyback 播放 av1 时出现黑屏的问题 - 修正首次播放时无法随机播放的问题 - 提高内部色彩空间处理速度 - 修正使用 DXVA copyback 时浏览速度慢的问题 设置—>使用硬件加速 (DXVA) ├—滤镜—视频解码器—内置解码器/DXVA设置—解码器—>H.265/HEVC 5、删除TV直播列表, 登陆程序,日志管理, 消息通知, 多语言等不必要的文件
在 WPF 中可以使用 Dxva2 或 GDI 的方法调整屏幕亮度或获取屏幕亮度 比较推荐使用 Dxva2 的方法修改亮度,但不是所有的屏幕都支持的。 假定某个设备有多个屏幕,此时可以使用 User32 的 MonitorFromWindow 方法获取某个窗口所在的屏幕,此时根据这个屏幕的返回的 GetMonitorBrightness 判断是否支持 Dxva2 的方法 如果 Dxva2 的方法不支持,那么尝试使用 GDI 的方式,下面请让我告诉大家两个方法如何使用 先定义 AdjustScreenByDxva2 类,这个类通过 dxva2.dll 的几个方法进行获取或修改屏幕亮度 [DllImport("dxva2.dll")] public static extern bool SetMonitorBrightness(IntPtr hMonitor , ref short pdwCurrentBrightness, ref short pdwMaximumBrightness); [DllImport("dxva2
一、前言 之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到 下面是本人测试的结果: 测试数据,64位WIN10+32位qt5.7+32位ffmpeg3+6路1080P主码流+6路子码流 方案 CPU 内存 GPU none+none 12% 147MB 0% dxva2 +painter 21% 277MB 62% none+yuyv 17% 177MB 22% dxva2+yuyv 25% 400MB 38% d3d11va+yuyv 18% 30MB 65% qsv +nv12 22% 970MB 40% dxva2+nv12 20% 380MB 40% d3d11va+nv12 15% 320MB 62% 二、功能特点 支持多画面切换,全屏切换等,包括1+4+6 可设置硬解码类型,支持qsv、dxva2、d3d11va等。 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
不同内核硬解码处理 vlc硬解码: 1.1 通过调用libvlc_media_add_option设置参数:avcodec-hw=auto 1.2 支持的参数:none auto any d3d11va dxva2 avcodec_send_packet avcodec_receive_frame解码数据 2.6 调用av_hwframe_transfer_data转换硬解码的数据 2.7 支持的参数:none qsv cuvid d3d11va dxva2 mpv硬解码: 3.1 通过调用mpv_set_option设置参数hwdec 3.2 支持的参数:none auto any d3d11va dxva2 二、功能特点 支持多画面切换,全屏切换等,包括 可设置硬解码类型,支持qsv、dxva2、d3d11va等。 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
如在h264解码器中可以使用cuda 加速,qsv加速,dxva2 加速,d3d11va加速,opencl加速等。 cuda qsv dxva2/d3d11va opencl 应用场景 适应NVIDIA显卡平台,但跨OS 适应Intel显卡平台,但跨OS 适用Windows OS,但跨硬件平台 仅仅支持opencl的硬件平台 , "Usage: %s <device type> <input file> <output file>\n", argv[0]); return -1; } // 设备类型为:cuda dxva2 qsv d3d11va opencl,通常在windows使用d3d11va或者dxva2 type = av_hwdevice_find_type_by_name(argv[1]); //根据设备名找到设备类型 input_ctx); av_buffer_unref(&hw_device_ctx); return 0; } 编译后生成hw_decoder.exe,解码生成YUV文件如下: hw_decoder.exe dxva2
enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2
1、设置硬件加速:窗口左上角或者右键菜单,打开选项-滤镜-视频解码器-内置解码器/DXVA设置,勾选使用硬件加速dxva(可选优先使用d3d11dxva) 最好用的PC端播放器PotPlayer无边框设计
之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到 方案 CPU 内存 GPU none+none 12% 147MB 0% dxva2+none 3% 360MB 38% d3d11va+none 2% 277MB 62% none+painter 30% 147MB 0% dxva2+painter 30% 360MB 38% d3d11va+painter 21% 277MB 62% none+yuyv 17% 177MB 22% dxva2+yuyv 25% 400MB 38% d3d11va+yuyv 18% 30MB 65% qsv+nv12 22% 970MB 40% dxva2+nv12 20% 380MB 40% d3d11va+nv12 可设置硬解码类型,支持qsv、dxva2、d3d11va等。 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
如在h264解码器中可以使用cuda 加速,qsv加速,dxva2 加速,d3d11va加速,opencl加速等。 cuda qsv dxva2/d3d11va opencl 应用场景 适应NVIDIA显卡平台,但跨OS 适应Intel显卡平台,但跨OS 适用Windows OS,但跨硬件平台 仅仅支持opencl的硬件平台
12bit decoding VDPAU accelerated VP9 10/12bit decoding AV1 decoder (Hardware acceleration used only) DXVA2 tun & .pcm) muxer AV1 VAAPI decoder adenorm filter ADPCM IMA AMV encoder AMV muxer NVDEC AV1 hwaccel DXVA2
支持qsv dxva d3d 硬解码。
支持qsv、dxva2、d3d11va等硬解码。 "yes"); //启用键盘输入 setValue("input-vo-keyboard", "yes"); //设置硬件加速 none auto any d3d11va dxva2
特性 硬件解码支持:DXVA2,VAAPI,VDA/VideoToolbox,CedarX,CUDA。 OpenGL和ES2支持几乎所有格式。 RGB和YUV格式的视频捕获。
│ │ ├── avfft.h │ │ ├── d3d11va.h │ │ ├── dirac.h │ │ ├── dv_profile.h │ │ ├── dxva2 hwcontext_cuda.h │ │ ├── hwcontext_d3d11va.h │ │ ├── hwcontext_drm.h │ │ ├── hwcontext_dxva2
enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2
在LAV解码器当中,可以在“Hardware Acceleration”处选择硬解方式,目前常用的一般是两种硬解,一种是“DXVA2(native)”,另一种是“DXVA2(copy-back)”。 如果软解性能不够,需要硬解,推荐使用DXVA2 copy-back 这两种硬解的区别在于,native会把数据完全交给GPU处理,而copy-back会多出一个回传到内存给CPU处理的步骤。 一来,使用DXVA native硬解,某些GPU解码可能会出现问题,例如AMD RX显卡用native解码10bit可能会出问题,但NV的GTX10X0就不会,你很难判断到底某显卡用native解码能不能正常工作 因此,如果你想要用显卡硬解10bit视频,那么推荐使用LAV解码器当中的DXVA2 copy-back硬解方式。如果性能足够强劲,还是推荐使用CPU软解,最不容易出错。 与此同时,如果用madVR渲染的话还要注意版本,madVR在0.9之后的版本才开始支持DXVA YUV 4:2:0的10bit解码输入。