从美剧「巫师」简要分析FFMPEG视频转码与压缩

2020-02-01 ffmpeg

寒假在家,我开始搜索各种电视剧电影来充实自己的寒假生活,最近正在看的是Netflix的美剧「巫师」。但是下载的 1080P .mkv 原片一集大小高达 3.3 G,我们能否通过合理的视频转码压缩在保证视频观感体验的同时,尽可能减少视频文件的大小呢?

事实上是可能的,我们可以通过视频的重新编码,使得在保留一定画面质量的同时,尽可能的减少视频的大小。比如这一次就将从 .mkv 文件转码成 .mp4 文件,以换取更小的体积和更大的兼容性(.mkv文件在手机平板等移动端支持往往没有 .mp4 好。)

几个概念

视频封装 一般视频文件格式有 .mp4 .mov .mkv 等等,这些格式往往都包含着一条或者多条视频、声音和字幕通道。

视频编码 未经压缩的画面往往非常大,需要通过帧间编码或者帧内编码的方式来对视频大小进行压缩。常见的视频编码格式有 H264, H265 等等。H265作为比较新的编码方案具有压缩率较高,画面较好的优点。

音频编码 场景的音频编码有 .mp3 .aac .flac等。

分辨率 视频的分辨率是视频画面的大小,通常分辨率越高,视频的画面就越精细。常见的分辨率有 720p, 1080p, 4K 等。

帧率 是指一秒钟内有多少帧图片。帧率越高,视频就越连贯,普遍的码率有 25fps, 50fps, 30fps, 60fpx 等

码率 码率最终决定了视频的大小,是指一秒视频使用多少字节来描述。一般蓝光视频的码率在 10-20 Mbps,而更多网络视频的码率一般在 2-6 Mbps 之间。码率越高,画面压缩率越低,画面越精细。

分析一下

首先使用 ffmpeg -i xxxx.mkv命令来查看一下原始的视频的一些编码细节,这里截取了部分比较关键的输出内容。

Metadata:
    encoder         : libebml v1.3.5 + libmatroska v1.4.8
    creation_time   : 2019-12-20T08:18:01.000000Z
Duration: 01:01:04.58, start: 0.000000, bitrate: 6468 kb/s
    Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 24 fps, 24 tbr, 1k tbn, 48 tbc (default)
    Stream #0:1(eng): Audio: eac3, 48000 Hz, 5.1, fltp (default)
    Stream #0:2(eng): Subtitle: subrip
    Stream #0:3(eng): Subtitle: subrip
    Stream #0:4(ara): Subtitle: subrip
    Stream #0:5(cze): Subtitle: subrip
    Stream #0:6(dan): Subtitle: subrip
    ...
    Stream #0:30(chi): Subtitle: subrip
    Stream #0:31(chi): Subtitle: subrip

得到的信息有:

  1. 这个文件长度是1小时1分04秒。有32个通道。平均比特率是 6468 kbps。
  2. 有一个视频通道,h264编码,1080p分辨率,
  3. 有一个音频通道,eac3编码,48kHz采样率,5.1声道。这个格式比较不通用。
  4. 有30个字幕通道,分别是各个国家语言的字母,其中我们只需要留下30通道,也就是简体中文字幕。

如何转码?

下面是我的转码思路:

  1. 一般 1080p的码率在3-6Mbps 直接较合适, 720p 的在 1-3 Mbps直接较合适。原始视频码率是 6000kbps 作用,我们选择一个中等偏低的码率,将降低码率到 3000kbps,足以满足 iPad或者iPhone 上观看。同时较小的文件也便于传输。
  2. 将音频格式转为同样音质优秀但更为常见的 aac 格式。
  3. 将无用的字幕去掉,只留下 30 通道的简体中文字幕。

ffmpeg 命令。

ffmpeg -i xxxxxx.mkv -map 0:0 -map 0:1 -map 0:31 -b:v 3M -c:s mov_text xxxxxx.mp4
  • -i xxxxx.mkv 选取了输入文件为原始视频文件
  • -map 0:0 -map 0:1 -map 0:31选取了原始视频中的第零(视频)、第一(音频)和第三十(简中字母)
  • -b:v 3M 设置视频码率转为 3000kbps
  • -c:s mov_text 设置字幕的编码方式为移动文字
  • xxxxxx.mp4 是输出文件名

运行和结果

在运行完命令后到了一个 1.52 G的 .mp4 文件。打开后检查视频画质、音频和字母符合预期。再次运行 ffmpeg -i xxxxx.mp4 得到了转码后的视频文件的相关信息:

Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
Duration: 01:01:04.58, start: 0.000000, bitrate: 3325 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2931 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 388 kb/s (default)
    Stream #0:2(chi): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)

视频、音频和字幕通道各一条,相关参数符合预期,视频转码完成。