无法使用FFmpeg结合DXVA2硬件加速解码HEVC视频求助
我之前也碰到过几乎一模一样的DXVA2硬解HEVC问题,折腾了好一阵才搞定,结合对FFmpeg DXVA2实现的了解,给你几个靠谱的排查和解决方向:
确认FFmpeg编译时包含HEVC DXVA2解码器支持
很多时候问题出在编译环节:你需要确保编译FFmpeg时不仅开启了--enable-dxva2,还启用了HEVC相关的解码器。可以在命令行执行ffmpeg -decoders | findstr dxva2,如果输出里没有hevc_dxva2,说明编译时没加HEVC DXVA2解码器支持。重新编译时要加上这些参数:./configure --enable-dxva2 --enable-decoder=hevc --enable-decoder=hevc_dxva2 [其他你的编译参数]修改hw_decode.c的get_format回调逻辑
官方示例的get_format回调可能没有优先给HEVC分配DXVA2格式。你可以调整回调函数,让它在遍历支持的像素格式时,优先返回AV_PIX_FMT_DXVA2_VLD,不管是H.264还是HEVC:static enum AVPixelFormat get_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt) { const enum AVPixelFormat *p; // 优先选择DXVA2硬件解码格式 for (p = fmt; *p != -1; p++) { if (*p == AV_PIX_FMT_DXVA2_VLD) { return *p; } } // fallback到软解格式 return AV_PIX_FMT_YUV420P; }另外还要确认示例中
hw_device_ctx的DXVA2设备初始化代码没有针对HEVC做限制,确保设备创建逻辑对HEVC同样生效。检查显卡硬件和驱动的HEVC DXVA2支持
DXVA2对HEVC硬解有硬件门槛:NVIDIA需要Kepler及以后的显卡,AMD需要GCN 2架构及以后,Intel则需要HD 5000系列及以后的核显。同时要安装显卡厂商的最新官方驱动,老驱动可能缺失HEVC硬解支持。你可以用dxdiag工具查看显卡的DXVA能力,确认HEVC解码是否在支持列表里。验证HEVC视频的profile/level是否在硬件支持范围内
部分显卡仅支持HEVC的Main Profile,对High 10、High 4:2:2等高profile的视频无法硬解,会自动 fallback到软解。你可以用ffprobe查看视频的profile和level:ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of default=noprint_wrappers=1如果视频是高profile,而你的显卡不支持,那只能要么换显卡,要么用软解。
内容的提问来源于stack exchange,提问作者Igor

