【FFmpeg】如何改进我的这组转码配置方案?

时隔多日后的更新:

新一轮转码的结果终于出来了。这次使用h.265/crf 24/slower配置进行转码。虽然成功地压缩掉了25%的体积,但大概是因为愚蠢的服务器既不支持硬解、算力也小得可悲的缘故,这次的耗时非常之惨烈:总计11天18时39分32秒 。我大概是能死了这颗用廉价服务器做转码的心了。


前情提要:

拿腾讯的轻量应用服务器来搞ffmpeg转码一些录播视频。折腾并耐心等待了一段时间之后,第一个结果终于出来了(然后因为服务器只给了4m小水管所以下载又耗了四五个钟头),然而结果却不甚理想:一个约6GB的视频耗时50+小时,转出来的结果还大了1GB。想来主要原因还是因为我出于不损失画质的目的,将转码配置设得过于保守了。

于是想请教一下,参考下面我给出的视频参数(我要转的视频基本上都是同一个源的直播录像,所以参数基本一致),如何修改以下转码方案,以在尽量不出现肉眼可见的画质损失为前提下压缩视频:

nohup ffmpeg -hide_banner -loglevel warning -i "$1" -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -r>

(更新……)等等,这都几天了,才发现命令只拷了一半上来……重发一次完整的吧。

nohup ffmpeg -hide_banner -loglevel warning -i "$1" -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -map 0:v:0? -c:a aac -q:a 1.6 -ar 44100 -rematrix_maxval 1.0 -ac 2 -map 0:a? -c:s mov_text -map 0:s? -map_chapters 0 -map_metadata 0 -f mp4 "$1_output.mp4" &>> "$1_output.log" &

以及一个额外问题:因为ffmpeg运行于后台,所以我将其标准输出和错误输出都汇总到了一个log文件中。然而,使用-loglevel warning配置,会只输出错误信息,无法查看实时进度;而如果loglevel设为低一级的默认配置,则会导致那个每秒更新一次的底部横幅也被全部写入log,于是耗时数日的转码产生的Log文件之体积也会蔚为壮观。这个问题有什么解决的思路吗?

参考用视频参数:

名称 参数
概览
格式 Flash Video
文件大小 5.95 GiB
时长 3 时 25 分
总体码率模式 动态码率 (VBR)
总体码率 4 141 kb/s
编码程序 Lavf58.41.100
视频
格式 AVC
格式/信息 Advanced Video Codec
格式配置 (Profile) High@L3.1
格式设置 CABAC / 2 Ref Frames
格式设置, CABAC
格式设置, 参考帧 2 帧
编解码器 ID 7
时长 3 时 25 分
码率模式 动态码率 (VBR)
码率 4 000 kb/s
宽度 1 280 像素
高度 720 像素
画面比例 16:9
帧率模式 恒定帧率 (CFR)
帧率 30.000 FPS
色彩空间 YUV
色度抽样 4:2:0
位深 8 位
扫描类型 逐行扫描 (连续)
数据密度 [码率/(像素*帧率)] 0.145
流大小 5.74 GiB (97%)
色彩范围 Limited
色彩原色 BT.709
传输特性 BT.709
矩阵系数 BT.709
音频
格式 AAC LC
格式/信息 Advanced Audio Codec Low Complexity
编解码器 ID 10-2
时长 3 时 25 分
码率 256 kb/s
声道数 2 声道
声道格式 L R
采样率 44.1 kHz
帧率 43.066 FPS (1024 SPF)
压缩模式 有损
相对视频的延迟 66 毫秒
流大小 376 MiB (6%)

每个人的眼睛的分辨能力并不是一致的,要好是分别使用不同的 -crf 值裁剪压缩几秒内容作为小样,通过小样确定参数后再压制,免得白费几十个小时。

要小体积,上 H265(libx265),具体 -crf 参数自测决定,没必要用这么夸张的预设。
要看进度,用 -progress

ffmpeg -i in.mp4 -c:v libx265 -crf 26 -c:a copy -progress p.txt out.mp4

附:官网H.265压制文档
有意进一步调整参数的话,可以搜 -x265-params 学习。


当初刚接触 FFmpeg 时也花过50多个小时压视频,不过是把5G压成1G(H265),反正我的狗眼是看不出什么明显区别 :sweat_smile:

1 Like

crf 18太大了吧
一般23
极限点26,1080p也几乎看不出来损失

1 Like

我是直接上传到youtube,设置为不公开,等YouTube转好了,再下载下来

1 Like

我都是直接设码率的:
1280x720 画面正好,我一般把1920的也缩成1280
视频4M码率有点高,我一般是:重要的1k,差一点的512k,再差的360k
帧率一般10就能看,重要的不变也行
音频10k-40k就行了

便宜的vps上传还勉强,下载就很慢了
现在是每天用i4590压上百个视频,旧风扇要达到100度自动降频,新风扇基本在60-70度

1 Like

日志的问题,我没具体操作过。只是提个思路:grep 找出需要的信息,其他信息转到黑洞里去。不知可否

1 Like

感谢。确实之前没想到用x265。我再去试试。

想文件小,我就直接压码率.

ffmpeg -i input.avi -b:v 5120k output.mp4

5120k 指1分钟 5m大小
看你视频时长了,自己算一个满意的大小.然后

1 Like

小更新:

耗时惨烈的H.265转码成果与配置。

有个小丸工具箱,压缩视频效果太好了。100m教程视频压成5m,质量还很好

教程的背景基本是不变的,压缩率是可以比较高的

1 Like