用 ffmpeg 以 h.265 的编码方式压缩视频体积

/ 2评 / 7

最近下载了一些不错的电影,然而发现一个问题就是部分电影的编码格式过于老旧,导致视频体积过大的问题,不好收藏,于是乎想能不能在尽量不损失质量的情况下尽可能地缩小视频体积。

h.265编码是目前最好的选择了。

网上也有不少带 Gui 的客户端,比如 Mediacoder 、handbrake 、MEGui 等等,但是打开这些软件看着复杂的选项往往让我无所适从之后无从下手。

编码这件事,一旦搞不好就是好几倍的时间浪费。

前段时间看精品论坛的时候看到一篇帖子问用什么工具编码比较好,有人推荐直接用命令行的 ffmpeg 最好,因为基于 ffmpeg 的软件无非就是加个壳,所以昨天在网上找到国外网友最新编译的 Windows x64 版本试用了一下,发现真的好棒诶!

代码:

ffmpeg -i input.mp4 -c:v libx265 -crf 20 output.mp4

2020-11-03 更新
最近下载了《The Queen's Gambit》这部剧,发现 mkv 文件内嵌了30国语言,于是研究转码时如何在将 H.264 转为 H.265 减小体积的同时,去掉多余的字幕文件,仅保留英文、繁体中文和简体中文的方法。经过查询实验,现在成功了,转码参数为:

ffmpeg -i input.mkv -c:v libx265 -crf 20 -map 0:0 -map 0:1 -map 0:7 -map 0:30 -map 0:31 output.mkv

参数解释

-i input.mkv #输入文件
-c:v libx265 #转码为h.265
-crf 20 #压缩参数,该参数可调,低于20的结果是质量好,体积大;高于20的结果是质量低,体积小,自己找平衡数值
-map 0:0 -map 0:1 -map 0:7 -map 0:30 -map 0:31 #这一组数值表示保留源视频中的0:0\0:1\0:7\0:30\0:31轨道的数据,其中0:0是视频轨、0:1是音频轨道、0:7\0:30\0:31分别是源文件中的 English、Simplified Chinese、Traditional Chinese 的字幕文件。
output.mkv #输出文件

而 0:* 的参数如何得知?

ffmpeg -i input.mkv -hide_banner

2020-11-03 更新
如何提高转码效率(缩短转码时间):
纯 CPU 软压的方式,添加

-threads x -preset ultrafast

x表示核心数量
用 GPU 来编码的方式,查看 ffmpeg 的编码支持情况:

.\ffmpeg.exe -encoders
……
 V..... libx264              libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
 V..... libx264rgb           libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
 V..... h264_amf             AMD AMF H.264 Encoder (codec h264)
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... h264_qsv             H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)

 V..... libx265              libx265 H.265 / HEVC (codec hevc)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_amf             AMD AMF HEVC encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_qsv             HEVC (Intel Quick Sync Video acceleration) (codec hevc)

 V..... libvpx               libvpx VP8 (codec vp8)
 V..... libvpx-vp9           libvpx VP9 (codec vp9)
 V..... vp9_qsv              VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
……

所以我的锐龙 4750 就可以用

-c:v h264_amf #来压 h.264
-c:v hevc_amf #来压 h.265

原 400 MB 大小的 h.264 编码的 mp4 文件在用了 -c:v libx265 -crf 20 这两个参数后,体积直接降到了 100 MB 左右,缩减了 2/3 。随后我又试验性地将 crf 的值改为 28 测试,体积竟然变得更小了,只有 68 MB 左右了!

将 crf 降为 28 之后,虽然视频质量依然是可以接受的,但也确实比 crf 20 要差一些了,因此今天我就一直在用 crf 20 的参数将部分 h.264 编码的电影转为 h.265 ,比如下面这部电影:

源体积为 3.99 GB,经过压缩后,体积缩小为 1.05 GB。
h-1.png
h-2.png
源格式的信息:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.71.100
Duration: 02:05:26.49, start: 0.000000, bitrate: 4557 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 4230 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 60k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 319 kb/s (default)
Metadata:
handler_name : SoundHandler

转换为 h.265 之后的信息:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf58.45.100
Duration: 02:05:26.52, start: 0.000000, bitrate: 1206 kb/s
Stream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1280x720 [SAR 1:1 DAR 16:9], 1068 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 29.97 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler

另一部,源体积为 3.05 GB,压缩后体积缩小为 0.99 GB。
wall-1.png
wall-2.png
Metadata:
Stream #0:0: Video: h264 (High), yuv420p(tv, smpte170m/bt470bg/bt709, progressive), 694x556 [SAR 4448:3123 DAR 16:9], SAR 205:144 DAR 71135:40032, 25 fps, 25 tbr, 1k tbn, 180k tbc (default)
Stream #0:1(eng): Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
title : Stereo
LANGUAGE : eng
Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
Metadata:
title : Surround
LANGUAGE : eng
Stream #0:3(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 768 kb/s
Metadata:
title : Surround
LANGUAGE : eng
At least one output file must be specified

转换为 h.265 之后的信息:
Metadata:
Stream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 694x556 [SAR 205:144 DAR 71135:40032], 1153 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(eng): Data: bin_data (text / 0x74786574)
Metadata:
handler_name : SubtitleHandler

由此可见,效果显著。

2 responses to “用 ffmpeg 以 h.265 的编码方式压缩视频体积”

  1. gosiple says:

    不建议用硬编码压缩,除非真的CPU性能不行等不了。
    硬编码的效果是不如软编码的。

    • weeper says:

      @gosiple 你说的对的,但是时间很耗不起。
      比如我自己压制的表演工作坊的那些话剧,本来也就是从DVD抓取然后压制的,源素材的质量本来也不高,所以对我而言只是一个转数码备份的需求而已。软编码也不会让DVD画质变得更高。

Leave a Reply

Your email address will not be published. Required fields are marked *