时隔多日后的更新:
新一轮转码的结果终于出来了。这次使用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) | [email protected] |
格式设置 | 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%) |