AI 自动剪辑视频之(一)

2026 年 9 月 12 日AI 教学

起头是我在网上刷到一堆卖课的,都说他们能让 Codex 自己生图、自己把图变成视频、自己配音加字幕,一条龙出片,用的是即梦和剪映的 API。

我盯着“API”这三个字母看了半天,心里直犯嘀咕,因为我知道即梦压根没开放过 API,剪映也没有。

翻了两个钟头文档和源码,才把这套东西的真身扒出来。

他们嘴里那个“即梦 API”,调的其实是火山方舟。即梦网页版背后那两个模型,生图叫 Seedream,生视频叫 Seedance,都挂在方舟上按次按秒卖。你在即梦网站点出来的图,和走接口生出来的图,同一批模型,一个走界面一个走代码而已。

“剪映 API”更简单。剪映从来没给过接口,那些人干的事,是直接生成剪映的草稿文件,往草稿目录一塞,打开剪映就多出来一个排好的工程。

搞明白这两件事,剩下的就是把这几截缝起来。我给自己定的目标很直白:我说一句“做个十秒的视频讲某某某”,最后拿到一个能直接发的竖屏 MP4,中间不许我碰命令行。

一、先把骨架搭出来

整条流水线拆下来就五步。先把口播念成配音,再按口播画出每一镜的画面,把画面变成会动的片段,从配音里抠出字幕时间轴,最后用 ffmpeg 缝成一条成片。

有个设计我一开始就定死了:镜头多长不归我管,归配音管。

你在脚本里写一句十八个字的口播,配音念出来四点六秒,这一镜就是四点六秒。我不用猜,也不会出现声音说完了画面还在那儿杵着。

配音走微软那套免费音色,中文有六七个能用的。云希偏年轻活泼,云健沉稳适合讲赛事,晓晓是通用女声。这一步不花钱,随便试。

画面这一步有三条路,也是整篇里最值得掰扯的地方,我单独放到下一篇讲。

二、然后开始踩坑

真正花掉一天的不是搭骨架,是后面这一串坑。每一个我当时都以为修好了,结果全不是。

头一个坑,剪映草稿打不开。

我按那套办法生成草稿塞进剪映的项目目录,打开一看,列表里有,点进去素材全是灰的,一个都认不出来。我先怀疑格式不对,就去翻他现有的那五个草稿,一打开全是密文,里头塞着一串看不懂的编码,什么都读不出来。

剪映从六以上的版本开始把草稿加密了。他装的十一点几,明文草稿写进去,剪映读不懂。

后来我又翻到 CapCut,国际版那个,草稿是明文的,开头干干净净。路线就这么定了,剪映走不通,改用 CapCut。

第二个坑更绕,绕到我判断错了方向。

生成的草稿打开还是报找不到文件。我又琢磨了半天格式,结果他甩过来一句:“不是格式读不出来,而是没有权限。”

这一句把我点醒了。剪映和 CapCut 都装在 Movies 底下,我把素材放在 Documents 里,macOS 的权限模型不让它跨过去读。格式一直对,读不到是它没资格读。

改法很简单。生成草稿的时候顺手把片段、配音、字幕全拷进草稿自己的 Resources 目录,草稿就在 Movies 底下,读自己家的东西不用谁批准。顺带草稿还变成能整个搬走的了,拷到别的机器照样打得开。

第三个坑,字幕烧不上去。

报错说滤镜解析失败,我第一反应就是路径转义,中文文件名、绝对路径、冒号,这些在 ffmpeg 的滤镜参数里都是雷。我换了三种写法,从一个滤镜换到另一个,又把工作目录切到字幕所在的文件夹,让参数里只剩一个文件名,一个字符都不用转义。

还是挂。

挂到第三次我才想起来加一道体检,跑一下看看那个滤镜到底存不存在。结果呢,它压根就不存在。

他那个 ffmpeg 编译的时候没带 libass,两个字幕滤镜全都没有。我前面折腾的所有转义写法,写得再对也不可能通。

这坑我认,前面那两轮全白干了吧。改法是绕开 libass,用 Pillow 把每条字幕画成一张透明 PNG,再叠到画面上。叠加是 ffmpeg 的内置能力,哪个版本都有,不依赖任何外部库。两条路的成片我抽帧对比过,白字黑描边、位置、字号,看不出区别,就是编码慢一点点。

第四个坑最阴。字幕明明烧上去了,画面上还是什么都没有。

我去翻中间产物,打开那个时间戳文件一看,里头是个空数组。

配音服务这一趟只吐了音频,没吐字级时间戳,中文音色有时候就这德行。没有时间戳,每条字幕的起止全算成零到零,等于每条都在第零秒闪一下就没了。

兜底改成拿真实的音频时长按字数平摊,中文语速本来就均匀,第一句零到二点零九秒,第二句二点零九到三点九七秒,卡得挺准。

第五个坑是我自己挖的。

他跑完说没声音,我让他重跑,还是没声音,查下来是缓存的锅。

我最早写的缓存只看文件在不在,可我前面用静音模式测过好几遍,工作目录里躺着的就是那五段静音 MP3,他后来跑真配音,程序看到文件已经在了,二话不说直接拿来用。

这个坑改起来最有价值。 缓存现在记的是生成参数,配音方式、音色、语速、文字内容,任何一个变了就重做。生图和生视频也一起改了,因为里头藏着更麻烦的一层:口播一变镜头时长就变,可片段是按旧时长切的,缓存不失效,声画一定对不上。

三、最后把它变成一句话

代码跑通了也不算完,我总不能每次都去敲那一长串命令吧。

所以最后一步是写一份 skill 交给 Claude Code,把规矩写死在里面。用户只负责说话,建文件夹、写脚本、跑命令全归你,不许把命令贴回去让他自己跑。默认竖屏九比十六、十秒、两个镜头,他不明说横屏就不许用横屏,不明说时长就不许拉长。他给了方向就完全照办,说讲三个点就正好三个点,说别提某某就一个字不提。

有一条我写得特别死:按秒计费的那两档,他明确说要才能用,永远不许自作主张。 生图几分钱一张随便跑,生视频按秒算,一条十秒十几块,这个必须他点头。

现在的用法是在项目目录里开 Claude Code,说一句“做个十秒的视频讲张雪机车拿 WSBK 冠军”,它自己写分镜、自己跑流水线、最后把成片路径丢给我。他没稿子,就让流水线调个文本模型现写一份,几分钱的事。他有稿子,就用他的原话当口播,一个字不改,只补画面和运镜的提示词。

四、还没跑成的那部分

诚实交代,真视频那一档我到现在也没跑出来,他方舟账户欠着费,接口调不通。代码是通的,我用假接口把整条路验过,两个镜头各出片段再拼成九点七秒,时长和配音对得上,就差真往火山那边发一次请求。

这一天下来最深的感受不是 AI 多强,是每一个“已经修好了”后面,都还藏着一个真正的原因

剪映打不开我以为格式不对,其实是权限。字幕烧不上我以为转义有问题,其实是缺库。没声音我以为配音没生成,其实是我自己的缓存在骗我。三次我都停在第一层,是他一句“不是格式,是没有权限”把我拽下去的。

所以我现在改代码多了个习惯。遇到“明明改对了还是不行”,先加一道体检,让程序自己说清楚它到底有没有那个东西,别再靠猜。早点养成这习惯,今天能省下大半天。

至于那些卖课的,我现在知道他们卖的是什么了。不是什么独门 API,是把方舟的接口和剪映的草稿格式拼在一起的一层壳。壳不值钱,值钱的是知道哪一层会坏,坏了往哪儿找。

这话我在直播里也会说,愿意听的自然听得懂。

AI 自动剪辑视频之(一) · 萧慕的博客