Skip to content
🎞️ 成片第 4 / 6 节

剪辑与音量检查: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 剪辑软件的界面操作;
  • 在时间线上手动对齐每一个片段。

🎒 开始前的准备 ​

核心思路 ​

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 参数相同:

bash
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 过滤器,把裁好的片段按镜头表顺序接成一条时间线——这一步做完,一堆素材才算真正变成「一部片子」。它要求各段流的参数一致(同一工作流生成的片段通常天然满足);某段音频比视频短时,会自动补静音:

bash
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.mp4

n=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 指定采样率:

bash
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 目标 LRA7(默认)响度范围目标
loudnorm 目标 TP-2(默认)真峰值上限
-ar48000防止 loudnorm 内部 192kHz 上采样写进文件
-c:v / -crflibx264 / 20官方示例用法,crf 按画质需求自定

下一课预告 ​

成片到手,发布前还要对照平台规范过一遍:继续「导出与发布前检查:对照 YouTube 官方规范」。

你会学到:

  • YouTube 官方推荐的上传编码设置:容器 MP4、视频 H.264、音频 AAC-LC 48kHz
  • 帧率、分辨率、码率等推荐值怎么对照检查
  • 发布前最后一遍检查清单怎么过
搞懂AI关于我们怎么写隐私说明

独立的第三方教程,与文中提到的任何产品及其公司没有隶属或合作关系;产品名称和商标归各自所有者。价格和政策以官方页面为准。