用 ffmpeg 把碎片拼成一条片子
为什么用命令行
剪辑软件我也用过。点来点去三小时,想"只把第三句改慢 0.2 秒",得重新拖一遍。
命令行不一样:改哪句只用改哪行,重跑一遍就行。 一条片子 30 秒渲完,我能改十版。
第一步:先看时长
配音每一句都是一个文件,先把每段多长量出来,才能决定每张卡显示多久。
ffprobe -v error -show_entries format=duration ^
-of default=nw=1:nk=1 line01.mp3
把这些秒数加起来,就是片子总长。音频定时长,画面跟着音频走——反过来会很痛苦。
第二步:一条片子最简单的做法
把每张卡和每段音配成一段小视频,再串起来:
ffmpeg -loop 1 -i card01.png -i line01.mp3 ^
-c:v libx264 -tune stillimage -shortest ^
-pix_fmt yuv420p seg01.mp4
-shortest 是让画面长度等于音频长度的开关,没有它,静帧会无限长。
把 seg01.mp4 seg02.mp4 ... 写进一个文件,一次拼完:
ffmpeg -f concat -safe 0 -i list.txt -c copy v_final.mp4
第三步:加音乐和淡出
ffmpeg -i v_final.mp4 -i bgm.mp3 ^
-filter_complex "[1:a]volume=0.18,afade=t=out:st=13:d=2[b];^
[0:a][b]amix=inputs=2:duration=first[a]" ^
-map 0:v -map "[a]" -c:v copy -c:a aac v_mix.mp4
volume=0.18—— 背景音乐一定要压到人声下面,大概 0.15 到 0.2afade=t=out:st=13:d=2—— 第 13 秒开始,2 秒淡出
结尾画面淡出用这句:
ffmpeg -i v_mix.mp4 ^
-vf "fade=t=out:st=13.5:d=1.5" -c:a copy final.mp4
我踩过的坑
- 先 MinimizeAll 再录屏,结果控制台跳出来被录进去。录屏进程要扔进最小化的窗口(
start /min cmd /c "...") -sseof -1.2抽最后一帧看不清成片结尾。想检查结尾,老老实实截连续几帧拼成九宫格:
ffmpeg -i final.mp4 -vf "fps=1,scale=640:-1,tile=3x2" -frames:v 1 sheet.png
一张图六帧,一眼看完,比反复拖进度条快十倍。
底线
渲完之后,自己从头看一遍。不是看有没有黑屏,是看节奏:哪句太快、哪张卡停太久。看完记下来,下一条改。
← 画面从哪来:一张卡一张卡地做