视频录制转码

视频参数常识, 录像软件推荐, 视频压制教程.

本页包含较多的专业知识, 笔者尽量简化了一些描述, 并配上了大量的图片来方便理解. 如果读者发现有任何错误或者是可以改进的地方,请 联系站长 修改更新.

视频参数

视频格式有 mov mkv ts avi flv mp4 等等, 它们都是封装格式 (外壳/容器), 即把视频数据和音频数据打包成一个文件的规范.

所打包的每个轨道都有自己的编码格式, 主流的视频编码格式有 H.264 H.265 RealVideo VC-1 等, 音频有 FLAC AAC MP3 等.

封装格式

不同的封装格式对文件大小和视频画质几乎没影响, 这些格式是为了应对不同的播放需求而产生的.

H.264 和 AAC 分别是当今实际应用中编码效率最高的视频标准和音频标准.

H.264 高级视频编码 又被称为 MPEG-4 AVC, 是一种视频编码标准. x264 则是实实在在的视频编码器, 很显然它符合 H.264 标准.

视频是由一系列连续的图像构成的, 每一张图像称为一帧. 这些静态图片快速切换就形成了动画效果.

连续播放

图像是由一个个像素点组成的, 像素可以理解为一个独立的带颜色的小方格. 每个像素的颜色都是用数字来表示的, RGB 模型即是用 红(Red) 绿(Green) 蓝(Blue) 三种颜色的强度来记录颜色值. 每个分量用一个字节表示, 总共能表达 256 x 256 x 256 = 16777216 种颜色, 也简称为 24 位色或者 1600 万色. 例如一张分辨率为 16×12 的图像是由宽高各 16 12 个像素点构成. (为了方便展示本图放大了 20 倍.)

像素

调色板

现代的显示器就是通过组合不同强度的三原色来达成几乎任何一种可见光的颜色. 图像储存中通过记录每个像素红绿蓝强度来记录图像的方法称为 RGB 模型. 通过数学转换将 RGB 三个通道转换为一个代表亮度的通道 (Y, Luma) 和两个代表色度的通道 (UV, Chroma) 的模型称为 YUV 模型, 又被称为亮度-色度模型 (Luma-Chroma). 在图像视频的加工与储存中 YUV 格式一般更受欢迎, 几乎所有的视频格式都是基于 YCbCr 模型的. 播放的时候播放器需要将 YCbCr 的信息通过计算转换为 RGB, 这个步骤称为渲染. 色深是指每个通道的精度. 8bit 就是每个通道用一个 8bit 整数 (0~255) 记录, 10bit 就是用 10bit 整数 (0~1023) 来记录. 就算是 8bit 的显示器, 由于 10bit 视频的运算精度更佳显示效果也会更细腻. 现阶段需要上传到网络上的视频通通用 8bit. 图像视频的实际储存和传输中, 通常将 Y 以全分辨率记录, UV 以减半甚至 1/4 的分辨率记录, 这个手段被称为色度半采样. 最常见的是 420 采样, 配合 YUV 格式常常被写作 yuv420. 这种采样是 Y 保留全部, UV 只以 (1/2) x (1/2) 的分辨率记录. 即使只有 Y 信号分量而没有 UV 分量仍然可以表示出图像, 只不过图像是黑白灰度图像.

视频的帧尺寸就是每一帧图像的分辨率, 分辨率越高的视频画面大小越大, 也就能够做到更清晰. 常见的视频分辨率有 640x480 1280×720 1920×1080 等.

分辨率尺寸

每秒钟播放帧的数量称为视频的帧率. 常见的帧率有 23.976 29.97 59.94 24 30 60 等等. 视频的帧率是可以是恒定的也可以是变化的 (CFR / VFR), 帧率越高视频看上去就越逼真越流畅.

帧率对比

单位时间内用来记录视频的数据量称为码率, 视频的平均码率即文件总体积除以总时长. 例如一个时长 10 分钟的大小为 100 MB 的视频, 其平均码率为 (100 x 8 x 1024) kbit / (10 x 60) s ≈ 1365 kbps. 通常来说码率越高的视频用来记录视频的数据量越多, 意味着视频拥有更好的质量.

用低码率视频编码成高码率视频填充的是垃圾数据, 并不能提升画质.

未经编码的原始视频数据量非常庞大, 以一个分辨率 1920x1080 帧率 24 fps 时长 90 分钟的视频为例, 其体积为 (1920 x 1080 x (8 + 8 + 8)) x 24 x (90 x 60) / (8 * 1024 * 1024 * 1024) ≈ 750 GB. 现实中得益于视频编码技术我们看到的高清盗版电影通常不超过 20 GB. 视频编码的本质就是将数据压缩, 减少存储空间和传播带宽的占用.

这是用播放器 PotPlayer 查看到的某个视频文件的信息, 相信读者在看完上文之后已经能对其含义有所了解了.

视频参数

视频录制

Windows 10 用户建议在设置里禁用游戏模式, 这个模式可能会对录像软件的性能造成影响.

禁用游戏模式

Bandicam

下载地址: https://www.bandicam.com/cn/downloads/

Bandicam 是收费软件. 免费版本有最长 10 分钟的录制时间限制, 并且会在视频顶部添加其网站水印.

录制模式有 屏幕录制/游戏录制/设备录制 三种, 直接录制游戏窗口内容选游戏录制模式.

Bandicam 录制模式

常规选项里, 选择要保存录制的视频的文件夹.

Bandicam 输出文件夹

常规选项里, 点击 “高级” 进入 “视频录制选项”, 取消勾选 “当帧率不更新时跳过录制”.

Bandicam 跳过录制

录像选项里, 勾选 “显示鼠标指针”, 取消勾选 “添加鼠标点击效果”.

Bandicam 显示鼠标指针

录像选项里, 点 “格式” 下方的 “设置”.

Bandicam 格式设置

文件类型:

AVI/MP4 随意.

视频:

尺寸: “完整屏幕” 或者是游戏窗口化的分辨率 “800” x “600”.

FPS: 通常 30, 追求流畅度可以用 60 或者更高.

在帧率模式中选择 CFR 恒定帧率, 可以解决音画不同步的问题.

Bandicam 恒定帧率

视频格式: 各种视频编码器的文件体积视频质量和编码速度对比 (录制 1 分钟 1920x1080 分辨率的视频).

Bandicam 编码器对比

尽量使用 H.264 编码器, 优先选择 NVENC 显卡加速, 没有 H.264 的话再考虑 Xvid 或者 MPEG-1. (Intel H.264 的 FourCC 编码选项选择 X264.)

要用来在 Vegas / Premiere 里后期编辑就选择 Motion JPEG. YV12 和 RGB24 虽然是高清无损的, 但是录像文件体积过大一般不考虑.

品质: 品质越高录出来的视频画质越好, 相应的体积也更大. 一般 50% 以下会有明显的画质变差现象, 建议 70-90%. 如果电脑性能不足出现卡顿可以适当降低品质.

音频:

AVI: MP3 一般够用, PCM 无损适合需要在编辑软件里再次处理的场合. MP4: 只能 AAC.

比特率越高越好, 反正相比视频占不了什么空间. 声道立体声. 频率 44100 或者 48000.

默认会在游戏界面的左上角显示实时帧率.

Bandicam 实时帧率

按下录制快捷键 F12, 文字变成红色就表示正在录制了.

Bandicam 正在录制

OBS Studio

下载地址: https://obsproject.com/download/

设置视频:

基础和输出分辨率一致, 设置成和游戏一样的 800x600, 帧率 30(常用) 或者 60(流畅).

如需捕获全屏则把分辨率设置成和当前显示器一致, 例如 1920x1080.

OBS 视频

设置音频:

启用一个桌面音频设备 “默认”, 默认捕捉扬声器输出, 戴耳机则是捕捉耳机输出.

需要录制麦克风的话在 麦克风/辅助音频设备 里再选上要录的音频来源.

OBS 音频

设置输出:

输出模式选简单. 设置推流的码率和编码器, 以及录像的输出路径和质量.

推流的码率不要超过网络的上行带宽, 下面是来自 NVIDIA 的建议:

带宽 (Mbps) 码率 (kbps) 分辨率 (px * px) 帧率 (FPS)
3 2500 1024x576 30
4 3500 1280x720 30
6 5000 1280x720 60
8-10 6000 1920x1080 60
12+ 10000 1920x1080 60
15+ 12000 1920x1080 60
20+ 15000 2560x1440 60
40+ 30000 3840x2160 60

录像质量建议用 “近似无损的质量” 以在视频质量和文件体积之间取得平衡, 硬盘空间足够或者需要后续再次编辑就选择 “无损的质量”. 格式选 “flv” 防断电损坏或者 “mp4” “mov” 以方便后续在 Adobe Premiere Pro 里面再次编辑. 编码器尽量使用 “NVENC 硬件加速” 或者 “x264 低 CPU 使用率预设”.

OBS 输出

捕获画面:

场景下点加号新建一个场景,

OBS 场景

来源里点加号新建一个 “游戏捕获” 或者 “窗口捕获”, 一种方式不行就试试另一种,

OBS 捕获

取个名字比如 “PVZ”, 窗口里选游戏标题, 显示游戏画面即是捕获成功了, 确定.

OBS 捕获pvz

双显卡用户如果捕捉显示器时黑屏请尝试用输出显示画面的那张显卡来运行 OBS.

来源名称左边的两个开关分别是显示和锁定. 可以捕获多个不同的输入来源, 并且调整它们的显示与否和图层位置.

OBS 显示锁定

在主界面空白的地方右键可开启或者关闭预览.

OBS 预览

在没锁定的情况下可以在预览区拖动红色边框调整画面的位置和大小.

OBS 调整

之前已经把背景设置成了 800x600, 游戏窗口也是这个分辨率, 因此能正好填充.

OBS 调整完毕

然后点右下角的开始录制就能录视频啦.

OBS 推流录制

直播推流:

开播后找到推流地址和直播码.

OBS 直播

设置流类型为自定义, 填上刚刚获取的地址和直播码.

OBS 推流地址

设置推流码率和编码器.

OBS 推流参数

保存配置后点右下角的开始推流.

OBS 推流录制

视频压制

视频压制的目的通常是在保证画质的前提下尽量减小文件体积. 如果网速够快直接上传录制好的源文件即可, 不需要自己压制.

目前 (2020 年中) 哔哩哔哩的视频清晰度根据 分辨率/码率/帧率 分为以下几档:

4K       20000  120
1080P60   6000   60
720P60    3000   60
1080P+    6000   30
1080P     3000   30
720P      2000   30
480P       900   30
360P       400   30

1080P+ / 720P60 / 1080P60 / 4K 这几档画质只有大会员用户才能观看.

投稿规范的限制:

网页端上传的文件大小上限升级至16G
视频内容时长最大10小时

网页端、桌面客户端推荐上传的格式为:mp4,flv

视频码率建议20000kbps(H264/AVC编码)
视频峰值码率建议不超过60000kbps
音频码率最高320kbps(AAC编码)
分辨率最大支持4096x4096 120fps
关键帧平均至少10秒一个
色彩空间yuv420
位深8bit
声道数≤2
采样率=44100
逐行扫描

综上可得到自己压制 pvz 视频的最佳参数:

720P: 800x600 2000kbps 30fps

720P: 960x720 3000kbps 60fps

1080P: 1440x1080 6000kbps 60fps

压制时分辨率应该设置为和原视频相同或者等比例缩放, 例如 800x600 可以拉伸为 960x720 或者 1440x1080.

缩放过程也可以在 OBS 录制的时候实现, 基础分辨率和游戏画面一致, 输出分辨率为等比缩放后的分辨率.

FFmpeg

下载地址: https://ffmpeg.zeranoe.com/builds/

该站已于 2020/09/18 关闭, 请在下方 FFGUI 网盘下载.

根据操作系统位数选择对应的下载链接, 32 位系统下载 “Windows 32-bit” 版本, 64 位系统下载 “Windows 64-bit” 版本. 对于 64 位系统虽然两个版本都能正常运行, 但是使用对应的 64 位版本能得到大约 10% 的速度提升. 如果你不确定自己的操作系统位数, 请下载 32 位版本. 链接方式建议选择静态链接 (Static Linking), 得到的是单个可执行文件而不是附带一大堆动态链接库.

FFmpeg 版本选择

下载解压出来后, 有两种安装方法:

  • 把 ffmpeg.exe 所在的目录永久添加到环境变量.

FFmpeg 环境变量

  • 每次打开一个新的命令行窗口时先把 ffmpeg.exe 所在的目录临时添加到环境变量.
set PATH=C:\tools\ffmpeg-4.2.3-win32-static\bin;%PATH%

打开命令提示符, 输入 ffmpeg –version, 能够显示版本号说明安装成功了.

FFmpeg 命令提示符

这个就是要用到的压制命令:

ffmpeg -i "test.mov" -vcodec libx264 -preset veryslow -profile:v high -level:v 4.2 -x264-params keyint=540:min-keyint=60 -pix_fmt yuv420p -b:v 2950k -s 800x600 -r 60 -pass 1 -acodec aac -ac 2 -ab 160k -ar 44100 -f flv NUL -y && ffmpeg -i "test.mov" -vcodec libx264 -preset veryslow -profile:v high -level:v 4.2 -x264-params keyint=540:min-keyint=60 -pix_fmt yuv420p -b:v 2950k -s 800x600 -r 60 -pass 2 -acodec aac -ac 2 -ab 160k -ar 44100 "test_out.flv"

x264 有两种常用的码率控制模式: Constant Rate Factor / Two-Pass ABR.
crf 模式根据视频质量自动分配码率, 一遍编码. 无法得知成品的最终码率. 参数可用值从 0 到 51, 可为浮点数, 越小编码质量越好, 码率越高. 默认 23, 一般用 18 到 27.
2pass 模式可以精确的得到想要的平均码率, 需要做两次编码. 第一遍编码先分析全片生成中间文件, 第二遍编码以临时文件作参考分配合理的码率.

这里要控制成品码率/体积因此选择了 2pass 编码模式. 其实是用 “&&” 连接的两条命令, 下面逐条解释参数:

-i "in.avi" 指定输入文件名.

-vcodec libx264 视频用 x264 编码器.

-preset veryslow 预设的一整套选项值. preset 的值有 ultrafast superfast veryfast faster fast medium slow slower veryslow placebo. 编码速度从快到慢, 压缩效率由低到高. 码率参数相同时编码速度越快画质会变差. 应该设置为所能接受的最慢一个, 这里用的是 veryslow, 还是嫌慢的话可以下调到 slower slow 或者 medium.

-profile:v high -level:v 4.2 设备兼容性, 保持不变即可.

-x264-params keyint=540:min-keyint=60 这里设置了两个 x264 的参数. keyint 关键帧最大间隔, 需要小于帧率乘以十, 比如 60 帧的视频, 这个值要小于 600. min-keyint 关键帧最小间隔, 等于帧率就好了. 帧率为 60 的视频这个值设置为 60.

x264 编码的视频将帧划分为了三种: I 帧, P 帧, B 帧.
I 帧是全帧压缩编码帧. 它将整个画面的信息进行类似 JPEG 的编码方式进行压缩. I 帧的数据量最大, 占用体积最多, 压缩率最低.
P 帧是前向预测编码帧. 它以 I 帧为参考帧, 只记录差值信息. P 帧的数据量比 I 帧少, 占用体积中等. 受益于差值压缩算法压缩率较 I 帧高.
B 帧是前后预测编码帧. 它以前面的 I 帧 P 帧和后面的 P 帧为参考帧. B 帧的数据量最小, 占用体积最少, 压缩率最高.
视频内两个 I 帧之间一长串连续的单帧图像就是图片组 (GOP), 整个视频就是由若干个图片组串起来构成的.
x264 的 --min-keyint--keyint 参数定义的就是最小 GOP 长度和最大 GOP 长度.

-pix_fmt yuv420p 色彩空间 yuv420p.

-b:v 2950k 输出视频的码率为 2950 kbps, 成品的实际码率略有浮动, 不一定刚好是这个值.

-s 800x600 输出视频的分辨率为 800x600, 拉伸的话宽高要乘以相同的比例系数.

-r 60 输出视频的帧率为 60, 应该设置成和原视频相同.

-pass 1 -pass 2 用 “&&” 链接的两条命令分别用了 -pass 1-pass 2, 说明这是第几遍编码.

-acodec aac 音频用 aac 编码器.

-ac 2 音频立体声 (2 个声道).

-ab 160k 音频码率 160 kbps, 追求音质的最高可调到 320 kbps.

-ar 44100 音频采样率 44100 Hz, 尽量和原视频相同.

"out.flv" 最终生成的文件, 建议用 flv 或者 mp4 格式. 要用 mp4 格式的话再把上面的 -f flv 改为 -f mp4.

根据需求修改调整命令行各个参数, 复制整条命令. 在视频源文件所在的文件夹空白处按住 Shift 同时点击鼠标右键, 点击 “在此处打开命令窗口”, 右键粘贴修改好的命令, 按下回车. 等待压制完成.

准备压制

压制完成

这个过程中会生成类似 ffmpeg2pass-0.log ffmpeg2pass-0.log.mbtree 这样的临时文件, 完成后可随手删掉.

在哔哩哔哩观看上传后的视频, 右键选择 “视频统计信息” 即可查看视频参数信息.

检查视频参数

FFGUI

FFGUI 预览

蓝奏云下载    密码: ffgui

备用下载地址

FFGUI 是一个 FFmpeg 脚本的可视化生成器, 本身并不包含媒体转码功能.

使用时需要把 ffgui.exe 和 ffmpeg.exe 放置在同一文件夹下.

FFGUI 合并

点击 “打开” 选择视频源文件 (或者直接拖动文件到窗口内), 设置各种输出文件参数, 修改输出文件名, 点击 “开始压制”.

单独勾选 视频/音频 的 “启用” 选项框可以分离 视频/音频. 视频/音频 编码器选择 copy 时不做处理直接复制源文件的内容.

FFGUI 支持导出的视频格式包括 flv mp4 avi mov mkv, 音频格式包括 aac mp3.

FFGUI 包含实验性质的 NVIDIA 显卡转码功能, 虽然速度很快但是同码率下的画质相比 x264 略差.

合并音频视频时需要保证视频文件没有音轨. 即先单独处理视频文件去掉音轨, 再把去掉音轨的视频文件和配乐合并.

FFGUI 只能生成最简单的视频处理脚本, 复杂的需求请使用 Premiere Pro / After Effects 等专业编辑软件.

参考资料

https://trac.ffmpeg.org/wiki/Encode/H.264

https://www.nmm-hd.org/doc/X264%E8%A8%AD%E5%AE%9A

https://www.bandicam.com/cn/support/tips/best-codec/

https://vcb-s.com/archives/2726

https://www.nvidia.cn/geforce/guides/broadcasting-guide/

https://maruko.appinn.me/