文章

AMD 的 4K HEVC 伪影,最后只改了一行 mpv 配置

在一份 4K HEVC Main 10 动画样本上复现 AMD 硬解伪影,用软件解码、D3D11VA-copy 与 AMF-copy 做对照,最后把 mpv 的硬解路径改为 AMF。

最近播放一份 3840×2160、HEVC Main 10 的动画样本时,画面突然变成了绿色和橙色。画面里有大块色块、横向条带和错位的图像,人物还能看出轮廓,颜色却已经完全不对。

我先怀疑过文件损坏,也怀疑过字幕、着色器和 vo=gpu-next。后来把同一个时间点分别交给软件解码、D3D11VA-copy 和 AMD AMF,问题很快缩小到了硬件解码路径。

先确认文件和播放器

这份样本的基本信息如下。

项目 结果
视频 3840×2160 HEVC Main 10
帧率 23.976 fps
时长 5431.510 秒
文件大小 约 6.1 GiB
播放器 mpv 0.41.0-902
显卡 AMD Radeon RX 6750 GRE 10GB
驱动 32.0.21045.1000

用 FFmpeg 软件解码抽帧时,画面没有出现同样的伪影。mpv 的实际便携配置位于安装目录的 portable_config/mpv.conf,其中原来的设置如下。

vo=gpu-next
gpu-context=d3d11
hwdec=auto-copy

另外,Emby Theater 使用的用户配置 %APPDATA%\\mpv\\mpv.conf 里也有同样的 hwdec=auto-copy。

三路对照测试

为了排除缓存和界面因素,我用 --no-config 绕过原配置,在同一个时间点提取一帧。测试命令可以按下面的形式改写,视频文件路径替换成自己的文件。

mpv --no-config --hwdec=no --vo=image --frames=1 --start=60 "视频文件路径"
mpv --no-config --hwdec=d3d11va-copy --vo=image --frames=1 --start=60 "视频文件路径"
mpv --no-config --hwdec=amf-copy --vo=image --frames=1 --start=60 "视频文件路径"

第一路使用 CPU 解码,输出的天空、树林、人物和木栅栏颜色正常。第二路的日志确认实际使用了 d3d11va-copy,输出帧则出现了明显的绿色和橙色偏色,画面被横向条带切成多个区域,部分图像还发生了错位。

第三路的日志里出现了两条关键记录。

AMF initialisation succeeded via D3D11.
Using hardware decoding (amf-copy).

AMF-copy 仍然使用了 AMD 的硬件解码,输出帧却恢复正常,没有绿色爆炸、橙色块、密集条纹或大面积错位。文件本身因此可以排除为主要原因,字幕和渲染器也不需要先动。

为什么 auto-copy 也会踩到问题路径

auto-copy 的含义是让 mpv 自动选择一个带回拷的硬解方式。回拷模式会把硬件解码后的画面复制回系统内存,因此可以配合更多视频输出和滤镜。它解决的是兼容范围问题,并不保证某个具体显卡、驱动和编码组合一定不会产生错误画面。

这次自动选择的结果正是 d3d11va-copy。它的初始化和播放都成功,日志没有把它判定为失败,但输出内容已经损坏。播放器能打开文件、硬件解码器能启动、画面能显示,这三件事都成立时,仍然可能存在解码伪影。

修复配置

修改前先备份了两份配置。修改后的相关片段如下。

# AMD HEVC Main 10 workaround
# hwdec=auto-copy
# D3D11VA can produce green/orange corruption on this AMD path.
hwdec=amf-copy

独立版 mpv 的 portable_config/mpv.conf 和 Emby Theater 使用的 %APPDATA%\\mpv\\mpv.conf 都做了相同修改。原来的 hwdec=auto-copy 保留为注释,之后如果驱动或 mpv 更新,可以直接回滚。

这次没有改动下面这些设置。

vo=gpu-next
gpu-context=d3d11
video-sync=audio
glsl-shaders=

它们在对照测试中没有表现出与伪影直接相关的证据。字幕也没有关闭,避免把解码问题和字幕渲染混在一起。

修改后的验证

修改后用实际便携配置重新打开同一个样本。日志确认播放器读取了安装目录下的 portable 配置,并加载了新的硬解设置。

Reading config file .../portable_config/mpv.conf
Setting option 'hwdec' = 'amf-copy'
AMF initialisation succeeded via D3D11.
Using hardware decoding (amf-copy).

同一时间点的输出帧已经恢复正常。之后又指定 Emby Theater 的用户配置目录做了一次测试,日志同样确认加载了 amf-copy,输出帧没有重新出现伪影。

这次排查留下的判断顺序

遇到 4K HEVC 画面变绿、变橙、出现条纹或大块错位时,可以先按下面的顺序缩小范围。

  1. 用 hwdec=no 播放同一个文件。
  2. 软件解码正常时,再记录 mpv 实际选择的硬解方式。
  3. 用 d3d11va-copy 和显卡厂商的替代路径分别测试。
  4. 通过日志确认硬件解码器真的启用,不要只看播放器界面上的硬解开关。
  5. 修复后完全退出并重新启动 mpv 或 Emby,再做一次同时间点对照。

在这台 RX 6750 GRE 上,当前结论是 amf-copy 比 auto-copy 更适合这份 HEVC Main 10 样本。它保留了硬件解码,CPU 不需要接管整段 4K 视频,同时避开了会产生伪影的 D3D11VA-copy 路径。

这不是对所有 AMD 显卡、驱动和 HEVC 文件的普遍保证。硬件解码问题会随驱动、mpv 构建版本、视频编码参数和渲染后端变化。若以后 AMF 初始化失败,稳定的兜底仍然是 hwdec=no。升级或回退显卡驱动前,最好先留下软件解码、当前硬解和替代硬解的日志,方便判断到底是哪一层发生了变化。

相关文档

  1. mpv 官方手册中的硬件解码说明
  2. FFmpeg 硬件加速介绍
  3. FFmpeg 官方文档