ffmpeg 编码的 h264/hevc 1366x768 视频似乎在 Linux 上损坏

ffmpeg 编码的 h264/hevc 1366x768 视频似乎在 Linux 上损坏

我正在运行 Linux 并且有带集成显卡的 AMD CPU。

我想截取我的屏幕并将其编码为 mp4 格式。以下是我尝试的方法:

1.捕获屏幕并直接将其编码为mp4;

ffmpeg -y -f x11grab -i :0.0 -codec:v libx264 test.mp4 

2.捕获屏幕并保存为原始数据文件,然后编码为mp4;

ffmpeg -y -f x11grab -i :0.0 -vcodec copy output.nut  
ffmpeg -i output.nut -c:v libx264 -crf 24 -vsync 2 test.mp4

3.以无损方式捕获屏幕然后将其编码为 mp4;

ffmpeg -y -f x11grab -i :0.0 -framerate 60 -codec:v huffyuv lossless.mkv  
    ffmpeg -i lossless.mkv -c:v libx264 out.mp4

4.先将原始数据或无损视频编码为vp9(可以正确显示),然后转换为mp4;

5.使用 VAAPI 硬件加速(与上面相同,但使用硬件标志和 h264_vaapi 或 hevc_vaapi 作为编解码器,或使用 kmsgrab 而不是 x11grab)

6.下载 OBS 工作室并使用默认选项录制屏幕(因为 OBS 使用 ffmpeg 作为后端);

7.设置流的比例、屏幕尺寸或纵横比选项。

在所有情况下,ffmpeg 制作的 mp4 视频似乎在某些方面存在问题。如果视频播放器(VLC、MPV)支持硬件加速,我的视频屏幕将如下所示:

在此处输入图片描述

如您所见,屏幕相当模糊,右侧有宽黑边框,底部有过多像素重复我的任务栏,这不应该存在。使用 hevc 视频看起来只是错位(右侧有较宽的黑边框,但底部没有过多像素)

但是,如果我禁用 MPV 或 VLC 中的硬件加速,问题就会消失,视频可以正确显示,但每次播放时,您都会看到播放器本身的视频“跳跃”,就好像播放器试图在窗口中对齐视频一样。在 chrome 播放器、Telegram 播放器和 Firefox 播放器中也可以看到相同的行为。

如果我将输入编码为 .mkv 或 .webm,则不会发生上述情况,只有使用 hevc 或 h264 时才会发生这种情况。此外,我在 Windows 上使用 ffmpeg 也没有遇到任何问题。

我的问题是:这是预期行为吗?我应该将此提交给 ffmpeg 错误跟踪器吗?有没有什么解决方法?

答案1

您的输入像素被编码为 RGB,但视频通常是 YUV。ffmpeg 会将输入转换为编码器支持的最佳 YUV 格式。在本例中,即 yuv444p。但是,这种像素格式没有得到广泛支持。此外,编码器会High Predictive 4:4:4根据这种像素格式设置配置文件,只有少数播放器可以播放。

因此,使用

ffmpeg -y -f x11grab -i :0.0 -codec:v libx264 -pix_fmt yuv420p test.mp4

相关内容