测试平台:笔记本i7-9750H,GTX1650,16GB内存,Win10,ffmpeg
测试文件:input.mp4(斗鱼客户端录制,AVC,10M,1080P60FPS),input.ass(斗鱼客户端录制)
以下测试需要支持硬件加速的Nvidia显卡或支持英特尔Quick_sync核显加速的CPU
(N卡建议GTX9代后,以及7系列的GTX745、750、750Ti,笔记本端GTX850M及以后。NVENC硬件加速编码首次引入是在第一代开普勒架构显卡,GK104核心开始后面几乎都有,对应显卡为GT640(开普勒架构版本)、GTX650及以上的显卡)
(英特尔Quick_sync核显硬件加速技术于2代酷睿时期引入,也就是i3-2xxx,i5-2xxx,i7-2xxx后带核显的U都有支持,同代的奔腾赛扬也支持)
一、视频转码
1.1 使用CPU处理的转码
首先来看一个软转码的例子(libx264,使用CPU,预设选slow以保证质量)
ffmpeg -i input.mp4 -c:v libx264 -b 8M -preset slow -c:a copy output_x264.mp4
这样执行时cpu满载,转码速率为0.67x,转码速度受CPU性能、散热制约较大。
 
1.2 使用Nvidia GPU处理的硬件加速转码
下面用Nvidia显卡进行硬件加速转码(预设slow,h264_nvenc编码器后面的视频参数照抄Nvidia官方文档)
(个人推荐GTX1650Super或RTX3050以上。GTX1650的部分版本(TU117版)中NVENC编码器用的是上一代的Volta编码器而非16系列本应该用的Turing编码器)
ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -c:v h264_nvenc -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 10M -qmin 0 -g 250 -bf 2 -temporal-aq 1 -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 output-h264-nvenc-8M.mp4
此时系统CPU使用率9%,转码速率为3.18x。
同时转分辨率到1080p的方法: 在-i前面加-resize 1920x1080 (N卡硬件加速专用)
为什么升分辨率?目前b站对720p的压缩策略是码率给的非常低,导致画面十分糊...为了保持画质需要将纵向分辨率升到720以上。大家可以自行设定,横向大于纵向就可以 例如冒险岛常用的1366x768,传上去是按1080p处理。我这里直接设定成1920x1080了。
 
1.3 使用英特尔核显Quick_sync硬件加速转码
ffmpeg -c:v h264_qsv -vsync 0 -i input.mp4 -c:v h264_qsv -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M output-h264-qsv.mp4
此时系统CPU使用率18%,速度3.71x,CPU核显接近满载。
上述输出视频的画质粗略看来观感上并无显著区别,不过细节方面本人没有仔细对比。
1.4 批量Nvidia GPU硬件加速转码
用powershell的Foreach-object对文件夹里所有内容批量转码并输出到output文件夹($_代指传入的每一个内容,$a则是我自定义的变量用来存文件名)
在需要转码的文件夹下按住shift点鼠标右键-在此处打开powershell窗口
mkdir output;dir .|foreach-object {if ($_.Extension -eq ".mp4"){$a=$_.BaseName;ffmpeg -c:v h264_cuvid -vsync 0 -i $_.Name -c:v h264_nvenc -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M -qmin 0 -g 250 -bf 2 -temporal-aq 1 -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 output-$a-h264-nvenc-8M.mp4}}
这样会转码文件夹中所有.mp4文件
其中输出名称可以自定义,不过不要在$a的左右两侧加下划线。
同时转分辨率到1080p的方法: 在-i前面加-resize 1920x1080
1.5 批量英特尔核显Quick_sync硬件加速转码
同1.4中操作,视频输出参数设定请自行百度(因为本人也是照抄)
dir .|foreach-object {if ($_.Extension -eq ".mp4"){$a=$_.BaseName;ffmpeg -c:v h264_qsv -vsync 0 -i $_.Name -c:v h264_qsv -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M output-$a-h264-qsv-8M.mp4}}
二、斗鱼弹幕硬封装
2.1 使用纯CPU
ffmpeg -i input.mp4 -vf ass=input.ass -c:v libx264 -b 8M -preset slow -c:a copy output_pure_soft.mp4
CPU满载,速率0.653x,总耗时160秒
2.2 CPU解码,GPU(Nvidia)编码
ffmpeg -i input.mp4 -vf 'ass=input.ass' -c:v h264_nvenc -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M -qmin 0 -g 250 -bf 2 -temporal-aq 1 -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 output_softDecode_hwEncode.mp4
CPU使用率上升至35%左右,GPU满载(解码器空载),速率3x,总耗时35秒
2.3 GPU(Nvidia)解码、编码(推荐)
ffmpeg -c:v h264_cuvid -vsync 0 -i input.mp4 -vf 'ass=input.ass' -c:v h264_nvenc -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M -qmin 0 -g 250 -bf 2 -temporal-aq 1 -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 output-h264-nvenc-ass.mp4
cpu使用率稍有升高,显卡满载,速率2.92x,总耗时也是35秒
2.4 GPU(英特尔Quick_sync)解码、编码)
ffmpeg -c:v h264_qsv -vsync 0 -i input.mp4 -vf 'ass=input.ass' -c:v h264_qsv -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M output-h264-qsv-ass.mp4
cpu使用率稍有升高,核显使用率上升到50%以上,速率2.81x,耗时37秒
2.5 批量硬封装ass弹幕到视频文件(Nvidia)
将视频和ass字幕文件放到同一个文件夹里,在那里打开powershell窗口
(如果录制的视频格式不是.mp4,在if里面".mp4"位置改成对应的即可)
dir .|foreach-object {if ($_.Extension -eq ".mp4"){$a=$_.BaseName;ffmpeg -c:v h264_cuvid -vsync 0 -i $_.Name -vf "ass=$a.ass" -c:v h264_nvenc -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M -qmin 0 -g 250 -bf 2 -temporal-aq 1 -rc-lookahead 20 -i_qfactor 0.75 -b_qfactor 1.1 burn-in_ass_$a.mp4}}
2.6 批量硬封装ass弹幕到视频文件(英特尔Quick_sync)
dir .|foreach-object {if ($_.Extension -eq ".mp4"){$a=$_.BaseName;ffmpeg -c:v h264_qsv -vsync 0 -i $_.Name -vf "ass=$a.ass" -c:v h264_qsv -preset slow -profile high -b:v 8M -bufsize 8M -maxrate 12M burn-in_ass_$a.mp4}}