You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.5 KiB
3.5 KiB
视频剪辑
目标
将所有生成的视频片段按脚本时间线拼接,嵌入歌曲音频,输出完整 MV 成片。
工具
本阶段全部使用本地 ffmpeg / ffprobe 命令完成,不调用任何远程 MCP 工具。
流程
1. 素材校验
检查 clips/ 目录下所有视频片段是否齐全(与 storyboard.md 幕数一致),通过 ffprobe 检查分辨率/帧率是否统一。如有不一致,先用 ffmpeg 统一转码:
# 检查视频信息
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,codec_name -of csv=p=0 <input.mp4>
# 统一转码(示例:统一为 1280x720, 30fps)
ffmpeg -i <input.mp4> -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" -r 30 -c:v libx264 -preset medium -crf 18 -an <output.mp4>
2. 裁剪时长
根据脚本时间码,用 ffmpeg 将每个视频片段裁剪至对应幕的精确时长:
ffmpeg -i <input.mp4> -t <duration_seconds> -c copy <output.mp4>
如裁剪后需要重编码(例如精确到帧),去掉 -c copy。
3. 拼接视频
使用 ffmpeg concat demuxer 将所有裁剪后的视频片段按脚本顺序拼接:
# 1. 生成 filelist.txt
echo "file 'clip_01.mp4'" > filelist.txt
echo "file 'clip_02.mp4'" >> filelist.txt
# ... 按顺序列出所有片段
# 2. 拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy <merged.mp4>
如果片段编码参数不完全一致,改用重编码拼接:
ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -preset medium -crf 18 -an <merged.mp4>
4. 嵌入音频
用 ffmpeg 将歌曲音频嵌入拼接后的视频,替换原有音频(如有):
ffmpeg -i <merged.mp4> -i <audio_file> -c:v copy -c:a aac -b:a 192k -map 0:v:0 -map 1:a:0 -shortest <output_with_audio.mp4>
音频文件路径从 lyric.md 的 音频: / Audio: 行读取。
5. 字幕烧录(可选)
通过 AskUserQuestion 询问用户是否需要烧录歌词字幕(选项:需要 / 不需要)。
- 需要 → 先从
lyric.md提取时间码和歌词,生成 SRT 字幕文件,再用ffmpeg烧录:
# 烧录字幕(硬字幕)
ffmpeg -i <input.mp4> -vf "subtitles=<subtitle.srt>:force_style='FontSize=24,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Alignment=2'" -c:v libx264 -preset medium -crf 18 -c:a copy <output.mp4>
- 不需要 → 跳过此步
6. 输出成片
将最终成片保存到 output/final.mp4。
向用户输出项目总结(见下方「完成总结」模板),包含所有阶段的关键产物路径和统计信息。
完成总结
成片输出后,向用户汇报以下信息:
MV 创作完成总结
-----------------
歌曲:{song_name}
主题:{theme}
总时长:M:SS
总幕数:N 幕
项目目录:.mv/{song_name}/{theme}/
├── 歌词拆解:lyric.md
├── 故事概念:story_concept.md
├── 脚本:script.md(N 幕,含动态描述)
├── 美术风格:art_style.md
├── 角色设计:{character_count} 个角色
├── 背景图:{background_count} 个场景背景
├── 关键物件:{props_count} 个物件(如有)
├── 分镜规划:storyboard.md(N 幕)
├── 视频片段:clips/(N 段)
└── 成片:output/final.mp4
成片路径:.mv/{song_name}/{theme}/output/final.mp4
文件存储
./.mv/{song_name}/{theme}/output/final.mp4 # 最终成片