剪辑与音量检查:FFmpeg 拼出第一部成片
一句话目标:这一课完成 AI 短剧剪辑——把你挑选好的镜头片段按镜头表顺序拼成 30–60 秒练习成片,并用 loudnorm 把音量统一到 EBU R128 标准。
GUI 剪辑软件(如剪映、Premiere)同理能完成本课操作,但本课程未核验其具体步骤,以下一律以 FFmpeg 命令为准。
学完你能做什么
- 用
trim与atrim把每个镜头裁到镜头表时长,并把时间戳归零 - 用
concat过滤器把多个镜头片段按镜头表顺序拼成一条完整时间线 - 用
loudnorm把整片音量统一到 EBU R128 标准(默认目标 I=-24、LRA=7、TP=-2) - 产出一个 30–60 秒、音画同步、音量平稳的
final.mp4练习成片
你现在的困境
- 「镜头都挑好了,可还是一堆零散的 mp4,怎么看都不像一部短剧。」
- 「勉强拼到一起,有的镜头声音大、有的声音小,听着难受。」
- 「听说该用剪辑软件,可界面按钮一大堆,我只想先把片子拼出来。」
什么时候用这一招
当你需要:
- 把挑好的镜头片段按镜头表顺序拼成一部 30–60 秒练习成片;
- 统一整片音量,让配音不再忽大忽小。
而且不想:
- 一上来就学 GUI 剪辑软件的界面操作;
- 在时间线上手动对齐每一个片段。
🎒 开始前的准备
- 已学完「镜头重试与替换策略:每镜最多 3 次」,手握前期课程制定的镜头表(教学模板),挑好的片段按播放顺序命名,如
shot01.mp4、shot02.mp4、shot03.mp4 - 已学完「字幕制作与校对:SRT 从生成到烧录」,字幕已烧进各片段,或准备最后统一烧到成片上
- 各镜头片段已在前面课程合入配音音轨
- 终端运行
ffmpeg -version能看到版本号
核心思路
AI 短剧剪辑听起来工程浩大,这一课的 FFmpeg 视频剪辑其实只做三件事:裁、拼、调,每件事对应一个过滤器:
| 动作 | 过滤器 | 干什么 |
|---|---|---|
| 裁 | trim / atrim + setpts / asetpts | 按镜头表时长裁掉多余首尾,时间戳归零 |
| 拼 | concat | 多段按顺序接成一条时间线,短音频自动补静音 |
| 调 | loudnorm | 按 EBU R128 统一整片响度 |
整条流水线:shot01.mp4 等素材 →(裁)shot01_cut.mp4 等片段 →(拼)draft.mp4 →(调)final.mp4。
两个前提要记住:concat 要求每段从时间戳 0 开始,所以裁剪后要归零;各段对应流的参数要一致——分辨率必须显式一致,像素格式、采样率这些 concat 会自动统一。
跟我做
第 1 步:裁剪镜头首尾
为什么:镜头表给每个镜头规定了时长,裁剪让片段严格对表;concat 又要求每段从时间戳 0 开始,裁完顺手归零。trim 用 start/end/duration 圈定范围,atrim 参数相同:
ffmpeg -i shot01.mp4 \
-vf "trim=start=0:end=4,setpts=PTS-STARTPTS" \
-af "atrim=start=0:end=4,asetpts=PTS-STARTPTS" \
shot01_cut.mp4你应该看到:shot01_cut.mp4 时长 4 秒、时间戳从 0 开始、首尾无多余画面。
- 小检查:每个镜头各跑一次,得到
shot01_cut.mp4、shot02_cut.mp4、shot03_cut.mp4
第 2 步:拼接镜头,搭出 AI 短剧剪辑时间线
为什么:FFmpeg 拼接视频靠 concat 过滤器,把裁好的片段按镜头表顺序接成一条时间线——这一步做完,一堆素材才算真正变成「一部片子」。它要求各段流的参数一致(同一工作流生成的片段通常天然满足);某段音频比视频短时,会自动补静音:
ffmpeg -i shot01_cut.mp4 -i shot02_cut.mp4 -i shot03_cut.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -crf 20 draft.mp4n=3 是拼接的段数,镜头不止 3 个就改成实际数量,并按顺序追加 -i 输入。-map 选定 concat 输出的视频流与音频流;-c:v libx264 配合 -crf 控制画质,这是官方文档示例中的用法,crf 数值按你的画质需求自定。
你应该看到:得到 draft.mp4,总时长约等于各镜头之和,播放顺序与镜头表一致。
- 小检查:播放
draft.mp4,顺序与镜头表一致,没有漏镜、重镜
第 3 步:音量检查与统一
为什么:不同镜头的配音响度未必一致,拼在一起会忽大忽小。loudnorm 是 FFmpeg 的音量标准化过滤器,按 EBU R128 标准统一整片响度,默认目标是 I=-24、LRA=7、TP=-2。注意它的动态模式内部按 192kHz 上采样处理,输出时要用 -ar 指定采样率:
ffmpeg -i draft.mp4 -af loudnorm -ar 48000 -c:v copy final.mp4你应该看到:final.mp4 整片响度达标,镜头之间不再忽大忽小;视频流直接复制(-c:v copy),不二次损失画质。
💡 音量还是忽大忽小?
先回头检查拼接顺序有没有漏镜、重镜,确认没问题再重跑一遍 loudnorm。
- 小检查:
ffmpeg -i final.mp4显示音频采样率为 48000,而不是 192000
检查点 ✅
- 每个裁剪片段(
shot01_cut.mp4等)时间戳从 0 开始,时长与镜头表一致 draft.mp4总时长约等于各镜头之和,播放顺序与镜头表一致final.mp4时长落在 30–60 秒(练习片的课程设计目标),含视频、音频两路流- 完整播放一遍:顺序、画面、音量逐项过耳;字幕若已烧录,显示正常
踩坑提醒
❌ concat 报流参数不一致
原因:混入了分辨率不同的镜头(如横竖版混用)。concat 会自动统一像素格式、采样率等参数,但分辨率不会被自动转换,必须各段一致;帧率不同虽不报错,却会输出可变帧率成片。
正确做法:回镜头阶段统一参数、重新生成后再拼。
❌ concat 报缺少音频流
原因:有的镜头没合入配音音轨,拼接时就会报缺少音频流。
正确做法:先按配音一课补齐音轨,再重跑第 2 步。
❌ 开头黑帧或音画错位
原因:某段裁剪后时间戳没归零,concat 把非零起点当成了段的开头。
正确做法:补上第 1 步的 setpts/asetpts,重跑裁剪和拼接。
❌ 输出采样率高达 192kHz
原因:loudnorm 动态模式的内部上采样被写进了文件。
正确做法:加 -ar 48000 重跑第 3 步。
本课小结
- ✅ 用
trim/atrim加setpts/asetpts,把每个镜头裁到镜头表时长并归零时间戳 - ✅ 用
concat按镜头表顺序拼接镜头,搭出 AI 短剧剪辑时间线,产出draft.mp4 - ✅ 用
loudnorm做 EBU R128 音量标准化,用-ar 48000锁定输出采样率,产出final.mp4
关键参数回顾:
| 参数 | 推荐值 | 说明 |
|---|---|---|
trim/atrim 的 start/end | 按镜头表时长 | 圈定每个镜头的保留范围 |
concat 的 n | 镜头数量 | 拼接段数,与输入文件数对应 |
loudnorm 目标 I | -24(默认) | EBU R128 整合响度目标 |
loudnorm 目标 LRA | 7(默认) | 响度范围目标 |
loudnorm 目标 TP | -2(默认) | 真峰值上限 |
-ar | 48000 | 防止 loudnorm 内部 192kHz 上采样写进文件 |
-c:v / -crf | libx264 / 20 | 官方示例用法,crf 按画质需求自定 |
下一课预告
成片到手,发布前还要对照平台规范过一遍:继续「导出与发布前检查:对照 YouTube 官方规范」。
你会学到:
- YouTube 官方推荐的上传编码设置:容器 MP4、视频 H.264、音频 AAC-LC 48kHz
- 帧率、分辨率、码率等推荐值怎么对照检查
- 发布前最后一遍检查清单怎么过