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