如果你想以高压缩效率和高视频质量来压缩你的视频,那么使用 FFMpeg 进行 HEVC 编码是个不错的选择。
HEVC(高效视频编码)或 H.265 是一种视频压缩标准,旨在解决其前身 H.264/AVC 的局限性。它使用更先进的编码技术(与 H.264 相比)来实现更高的压缩效率,这意味着它可以编码具有与 H.264 相同质量但比特率低得多的视频。
要了解 HEVC 的强大功能,请阅读这篇《AVC 和 HEVC 的区别》比较文章,你可以清楚地看到,通过切换到 HEVC 可以节省 35-50% 的比特率。2023年视频转码的预测也表明未来几年将逐步转向 HEVC 编解码器。
HEVC 通过使用更大的块进行运动补偿、四叉树分解、更好的预测技术以及更灵活的编码工具(例如 DST(离散正弦变换)、SAO 等),以较低的比特率实现这种高质量。
HEVC 被广泛用于需要以较低比特率提供高质量视频的应用,如流媒体视频、视频会议和广播。然而,HEVC 编码和解码需要比其前身更多的处理能力,而且可能不被旧设备或软件所支持。
在本文中,我们将探索使用 HEVC 和 FFmpeg 进行编码。
注意:
- 我在 M1 MacBook Pro(具有 8 核、16 GB RAM 和 512 GB SSD 的 M1 Pro 芯片)上使用 FFmpeg 6.0 运行了这些测试。
- 我使用的测试序列是 Big Buck Bunny 的 1080p 版本,可从此处下载 ( https://test-videos.co.uk/bigbuckbunny/mp4-h264 )。
- 我在所有命令行中都使用了
benchmark
参数,它显示了实际、系统和用户使用的时间;以及编码速度(以fps为单位)。
使用 FFmpeg 进行 HEVC 编码的基本命令
让我们从一个简单的例子开始。为了使用 FFmpeg 对使用 HEVC 编码的视频进行转码,你需要使用libx265 implementation 。要访问 x265 库中的所有参数,请阅读官方文档。
让我们通过尝试一个简单的 FFmpeg 命令行并使用 HEVC 编码视频来开始这个快速教程。
./ffmpeg -i input_file -c:v libx265 -preset [preset] -crf [crf] -x265-params [params] -c:a copy output_file
以下是每个参数的作用:
-i input_file
:指定输入视频文件。-c:v libx265
:指定用于编码的视频编解码器为HEVC或H.265。-preset [preset]
:指定 HEVC 编码器的预设。可用的预设是超快、超快、非常快、更快、快、中、慢、慢、非常慢和 placebo。预设越慢,压缩率越高,质量越好。-crf [crf]
:指定HEVC 编码器的恒定速率因子 (CRF) 。CRF 的范围为 0-51,其中 0 是无损的,51 是可能的最差质量。较低的 CRF 值将导致更高的质量和更大的文件大小,而较高的 CRF 值将导致较低的质量和较小的文件大小。默认值为 28。-x265-params [params]
:指定额外的 HEVC 编码器参数。这可用于微调编码过程。-c:a copy
:指定应按原样复制音频流而不进行任何重新编码。output_file
:指定输出文件名和位置。
通通过使用这个命令行和改变参数,你可以产生不同质量和大小的HEVC编码。
让我们使用 CRF 值为 20 并改变预设来尝试一些测试。
HEVC 编码,预设为 “慢”,CRF值为20。
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset slow -crf 20 -c:a copy output_slow_crf20.mp4
这会生成一个大小为 12 MB 且 PSNR 为 43.15 dB 的文件,耗时 32.62 秒(9.20 fps)。
HEVC 编码,预设为 “中”,CRF值为20。
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset medium -crf 20 -c:a copy output_medium_crf20.mp4
这会生成一个大小为 11 MB 且 PSNR 为 42.20 dB 的文件,耗时 12.93 秒(23.20 fps)。
HEVC 编码,预设为 “快速”,CRF值为20。
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset fast -crf 20 -c:a copy output_fast_crf20.mp4
这会生成一个大小为 9.7 MB 且 PSNR 为 41.53 dB 的文件,耗时 11.93 秒(25.14 fps)。
HEVC 编码,预设为 “超快”,CRF值为20。
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset ultrafast -crf 20 -c:a copy output_ultrafast_crf20.mp4
这会生成一个大小为 7.8 MB 且 PSNR 为 38.68 dB 的文件,耗时 4.23 秒(71.00 fps)。
正如你所看到的,通过改变预设,你可以通过打开和关闭编码工具来改变转码过程。这将导致转码速度的改变,从而改变视频的质量和大小。
预设 | 文件大小 (MB) | 峰值信噪比(分贝) | 所用时间(秒) |
慢的 | 12 | 43.15 | 32.62 |
中等的 | 11 | 42.20 | 12.93 |
快速地 | 9.7 | 41.53 | 11.93 |
超快 | 7.8 | 38.68 | 4.23 |
表 1:导致文件大小、PSNR 和编码时间发生变化的预设变化。
HEVC (x265) 的附加参数
x265 是一个很棒的编解码器实现,具有数百个参数,你可以使用这些参数来调整编解码器的性能——无论是在视频质量还是性能方面。如需完整的参数列表,请访问此处——你可以使用这些参数来控制 SAO 强度、量化参数、运动估计(半像素和四分之一像素)、帧级并行性等等。
在这个例子中,我们运行一个编码,并将量化参数 (QP) 设置为23
并将自适应量化 (AQ) ( aq-mode
) 设置为2
。在 AQ 中,每个块的 QP 在质量和比特率之间进行权衡。
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset medium -crf 23 -x265-params qp=22:aq-mode=2 -c:a copy output.mp4
在此示例中,我们使用 CRF 为 23 的中等预设,并添加qp
和aq-mode
参数以进一步微调编码过程。
使用 HEVC 和 FFmpeg 进行 CBR 编码
到目前为止的所有示例中,我们都使用 FFmpeg 的 CRF 模式对视频进行编码。在下面的例子中,让我们使用 CBR 编码模式。
要使用恒定比特率 (CBR) 模式使用 FFmpeg 和 HEVC 进行编码,可以使用以下命令:
./ffmpeg -benchmark -i input.mp4 -c:v libx265 -b:v [bitrate] -minrate [bitrate] -maxrate [bitrate] -bufsize [buffer size] -preset medium -c:a copy output.mp4
这是命令的细分:
- -i input.mp4:指定输入视频文件。
- -c:v libx265:指定用于编码的视频编解码器是HEVC或H.265。
- -b:v [比特率]:指定视频流的比特率。比特率以比特每秒 (bps) 为单位指定。该值在整个视频中都是相同的。
- -minrate [比特率]:指定视频流的最小比特率。该值用于控制内容复杂部分的视频质量。
- -maxrate [比特率]:指定视频流的最大比特率。此值用于控制内容简单的部分中的视频质量。
- -bufsize [缓冲区大小]:指定用于存储视频数据的缓冲区大小。该值用于控制在将数据写入输出文件之前可以存储在缓冲区中的数据量。
- -preset medium:指定 HEVC 编码器的媒体预设。此预设提供了文件大小和质量之间的平衡。
- -c:a copy:按原样复制音频流而不重新编码。
- output.mp4:指定输出文件名和位置。
你可以将 [bitrate] 和 [buffer size] 替换为所需的值。
例如,要对 CBR 为 5 Mbps、缓冲区大小为 10 Mbps 的 1080p HEVC 视频进行编码,可以使用以下命令:
ffmpeg -benchmark -i input.mp4 -c:v libx265 -b:v 5M -minrate 5M -maxrate 5M -bufsize 10M -preset medium -c:a copy output.mp4
此命令将生成 1080p HEVC 编码视频,CBR 为 5 Mbps,缓冲区大小为 10 Mbps,同时保持音频流不变。请注意,与 CRF 相比,使用 CBR 可能会产生更大的文件大小,但它可以在整个视频中提供更一致的质量。
使用 HEVC 和 FFmpeg 进行 2-Pass 编码
使用 HEVC 和 FFmpeg 进行 2-pass 编码非常简单。在运行 2-pass 编码时,FFmpeg 将分析第一遍中的视频流,以确定第二遍的最佳比特率和其他编码参数。与单程编码过程相比,这可以带来更好的压缩效率和质量。
需要注意的是: 与单次编码相比,2次编码可以带来更好的压缩效率和质量,但是,在某些情况下可能会过度,也就是说,尽管花费了大量的时间和资源,质量却没有很大的提高。这在简单的卡通内容中很容易观察到,这些内容都是零散的线性区域(例如,辛普森一家)。
好的 – 让我们开始编码吧。以下是使用 HEVC 和 FFmpeg 执行 2-pass 编码的步骤:
第一遍
首先,使用以下命令运行编码过程的第一遍
./ffmpeg -benchmark -y -i input.mp4 -c:v libx265 -preset [preset] -b:v [bitrate] -pass 1 -f mp4 /dev/null
在这个命令中,
- -y 用于覆盖输出文件(如果它已经存在)。
- -i input.mp4 指定输入的 H.264 视频文件。-c:v libx265 指定用于编码的 HEVC 编解码器。
- -b:v [比特率] 设置视频流的目标比特率。
- [比特率] 的值以每秒位数 (bps) 为单位。
- -pass 1 指定这是两遍编码过程的第一遍。最后,/dev/null 被用作输出文件,因为实际的输出文件不是在第一遍中生成的。
第二遍
第一遍完成后,使用以下命令运行第二遍编码过程:
./ffmpeg -benchmark -i input.mp4 -c:v libx265 -preset [preset] -b:v [bitrate] -pass 2 -c:a copy output.mp4
在这个命令中,
- -i input.mp4 选项指定输入 H.264 视频文件。
- -c:v libx265 指定用于编码的 HEVC 编解码器。
- -b:v [比特率] 设置视频流的目标比特率。[bitrate] 的值应该与第一遍相同。
- -pass 2 指定这是双遍编码过程的第二遍。
- 最后,-c:a copy 用于从输入文件复制音频流而不进行任何重新编码。
- 输出视频文件的扩展名为 .mp4。
使用 FFmpeg 从 HEVC 转换为 H.264/AVC
最后,让我们以相反的方式结束本教程,使用 FFmpeg 将 HEVC 转换为 H.264/AVC!同样,它非常简单,可以通过简单的命令行完成。
./ffmpeg -benchmark -i input.hevc -c:v libx264 -preset [preset] -crf [crf] -c:a copy output.mp4
以下是每个参数的作用:
- -i input.hevc:指定输入的 HEVC 编码文件。
- -c:v libx264:指定用于编码的视频编解码器为H.264。
- -crf [crf]:指定 H.264 编码器的恒定速率因子 (CRF)。CRF 的范围为 0-51,其中 0 是无损的,51 是可能的最差质量。较低的 CRF 值将导致更高的质量和更大的文件大小,而较高的 CRF 值将导致较低的质量和较小的文件大小。
- -c:a copy:指定应按原样复制音频流而不进行任何重新编码。
- output.mp4:指定输出文件名和位置。
使用 FFmpeg 和 HEVC 将 1080p 视频更改为 720p 视频
要使用 FFmpeg 和 HEVC 将 1080p 视频转换为 720p 视频,您可以使用以下命令:
./ffmpeg -benchmark -i Big_Buck_Bunny_1080_10s_30MB.mp4 -c:v libx265 -preset medium -crf 23 -vf scale=1280x720 -c:a copy output_1080_to_720.mp4
这是命令的细分:
- -i input.mp4:指定输入视频文件。
- -c:v libx265:指定用于编码的视频编解码器是HEVC或H.265。
- -preset medium:指定 HEVC 编码器的媒体预设。此预设提供了文件大小和质量之间的平衡。
- -crf 23:指定 HEVC 编码器的恒定速率因子 (CRF)。CRF 值越低,质量越高,文件越大。
- -vf scale=1280×720:通过使用缩放过滤器指定 1280×720 的新分辨率,将视频重新缩放为 720p。
- -c:a copy:按原样复制音频流而不重新编码。
- output.mp4:指定输出文件名和位置。
此命令将生成 720p HEVC 编码的视频,其中预设为中等,CRF 为 23,同时保持音频流不变。
作者:Krishna Rao Vijayanagar
原文:https://ottverse.com/hevc-encoding-using-ffmpeg-crf-cbr-2-pass-lossless/
本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/22502.html