【AI Agent实战】 0 成本视频处理全流程:ffmpeg + whisper 实现去水印、双语字幕、品牌片尾 | 实战SOP
0 成本视频处理全流程ffmpeg whisper 实现去水印、双语字幕、品牌片尾 | 实战SOP不用 Sora不用剪映会员不用任何视频生成大模型。一个 7 分 40 秒的英文教程视频15 分钟完成去水印 → 英文识别 → 中文翻译 → 双语字幕 → 品牌片尾替换 → 叮声音效合成。全程命令行。目录一、技术背景二、环境准备三、去水印ffmpeg delogo 滤镜四、语音识别whisper turbo五、翻译与双语字幕合并六、自定义片尾合成七、主视频处理与拼接八、软字幕挂载九、完整 SOP 与踩坑记录十、常见问题一、技术背景需求场景手头有一个视频需要同时完成四件事去除右下角的 NotebookLM 水印生成中英双语字幕视频是英文内容目标受众是中文替换结尾为自定义品牌片尾带二维码、提示音保持原画质和音频无损为什么不用剪辑软件方案问题剪映/Premiere/DaVinciGUI 操作无法脚本化字幕一句一句对齐费时不可复用Sora/Runway 等视频生成模型这些是创造视频的不是处理视频的用错方向在线去水印网站有水印残留、上传限制、隐私风险ffmpeg whisper本方案免费、开源、可脚本化、100% 本地运行、可嵌入 Agent 工作流核心工具栈输入视频 (MP4) ↓ ┌─────────────────────────────────┐ │ ffmpeg delogo → 去水印 │ │ ffmpeg extract → 抽音频 │ │ whisper turbo → 语音识别 │ │ AI / DeepL → 翻译 │ │ ffmpeg generate → 片尾合成 │ │ ffmpeg concat → 拼接 │ │ ffmpeg mov_text → 软字幕挂载 │ └─────────────────────────────────┘ ↓ 最终视频 (MP4 双语字幕流)二、环境准备安装依赖# macOSbrewinstallffmpeg pip3installopenai-whisper# Ubuntu/Debiansudoapt-getinstallffmpeg pip3installopenai-whisper# Windows推荐用 WSL2原生 ffmpeg 配置复杂# 或直接从 https://www.gyan.dev/ffmpeg/builds/ 下载静态编译版验证环境ffmpeg-versionwhisper--help可选GPU 加速Whisper 默认使用 CPU如果有 NVIDIA GPU安装 PyTorch CUDA 版本可以加速 3-5 倍pip3installtorch --index-url https://download.pytorch.org/whl/cu121三、去水印ffmpeg delogo 滤镜原理delogo滤镜通过周围像素插值填补指定矩形区域。原理类似于图像修复inpainting用邻域像素的梯度平滑过渡。视觉效果水印区域变成轻微模糊的色块肉眼可察但不影响观看。Step 1定位水印坐标# 提取视频第 N 秒的一帧用于确认水印位置ffmpeg-ss19-iinput.mp4-vframes1frame.png用系统预览工具打开frame.png测量水印坐标。本案例视频为 1280×720NotebookLM 水印位于右下角左上角: (x1100, y650) 宽高: w160, h50Step 2应用 delogo 滤镜ffmpeg-iinput.mp4\-vfdelogox1100:y650:w160:h50\-c:acopy\output.mp4参数说明参数作用-vfvideo filter只处理视频流delogoxX:yY:wW:hH指定去水印区域-c:a copy音频直接复制不重编码节省时间 10x为什么不用裁剪crop滤镜会改变视频尺寸1280×720 → 1280×670上传平台会被识别为非标尺寸导致平台二次转码降低质量。delogo保持原尺寸兼容性更好。delogo 的局限如果水印占比过大超过 10% 画面模糊区域会非常明显如果水印是动态移动的需要用enablebetween(t,0,5)分段处理对于透明度很高的水印效果一般这种情况下可以先用unsharp加锐化再去四、语音识别whisper turbo为什么选 turboWhisper 官方模型对比模型参数量速度7分钟视频WER英文下载大小tiny39M~30s9.5%75MBbase74M~45s7.8%142MBsmall244M~2min5.5%466MBmedium769M~4min4.1%1.5GBlarge-v31550M~10min3.2%3GBturbo809M~5min3.5%1.5GBturbo 是目前最佳平衡点接近 large-v3 的准确度速度接近 small。Step 1提取音频ffmpeg-iinput.mp4\-vn\-acodecpcm_s16le\-ar16000\-ac1\audio.wav参数作用-vn丢弃视频流-acodec pcm_s16le16-bit PCM 无损-ar 16000采样率 16kHzwhisper 内部采样率避免重采样-ac 1单声道Step 2运行 whisperwhisper audio.wav\--modelturbo\--languageen\--output_formatjson\--output_dir.第一次运行会下载模型1.5GB模型缓存到~/.cache/whisper/。之后秒起。Step 3JSON 转 SRTwhisper 的 JSON 输出包含每段的精确时间戳importjsondefts(s):秒数转 SRT 时间戳格式HH:MM:SS,mmmhint(s//3600)mint((s%3600)//60)secs%60returnf{h:02d}:{m:02d}:{sec:06.3f}.replace(.,,)withopen(audio.json)asf:datajson.load(f)lines[]fori,seginenumerate(data[segments],1):textseg[text].strip()lines.append(f{i}\n{ts(seg[start])}--{ts(seg[end])}\n{text}\n)withopen(en.srt,w,encodingutf-8)asf:f.write(\n.join(lines))print(f生成{len(data[segments])}条字幕)whisper 常见问题问题解决方案中英混合识别不准用large-v3而不是turbo或拆分场景分别识别专业术语错译用--initial_prompt LLM, token, context, agent提供领域词表背景噪音大先用ffmpeg -af afftdn做降噪再识别识别时间戳偏移用--word_timestamps True获取更精细时间戳五、翻译与双语字幕合并翻译方案对比方案优点缺点大模型 APIGPT-4/Claude上下文理解好、术语准付费小量约 $0.1/视频DeepL API译质高免费额度 500K 字符/月Google Translate Python 库免费有时被 rate limit本地 LLMLlama/Qwen零成本长文本翻译慢推荐方案直接把整个en.srt扔给 AI 对话窗口要求保持时间戳不变、只替换文本行。一次对话处理几百条字幕。Prompt 模板请将下面的英文 SRT 字幕翻译为中文。要求 1. 保持 SRT 格式编号、时间戳完全不变 2. AI 领域术语保留英文并加中文解释如 LLM大语言模型 3. 翻译要自然不要字面翻译 4. 保持每条字幕简短手机屏幕友好 原文 [粘贴 en.srt 内容]合并双语字幕importredefparse_srt(path):withopen(path,encodingutf-8)asf:contentf.read()entries[]forblockincontent.strip().split(\n\n):linesblock.strip().split(\n)iflen(lines)3:idx,timinglines[0],lines[1]text\n.join(lines[2:])entries.append((idx,timing,text))returnentries enparse_srt(en.srt)zhparse_srt(zh.srt)bilingual[]foriinrange(len(en)):idx,timing,en_texten[i]zh_textzh[i][2]ifilen(zh)else# 中文在第一行渲染时在下方更显眼英文在第二行bilingual.append(f{idx}\n{timing}\n{zh_text}\n{en_text}\n)withopen(bilingual.srt,w,encodingutf-8)asf:f.write(\n.join(bilingual))双语字幕显示效果1 00:00:02,000 -- 00:00:05,000 在这个视频中我们会构建一个 AI 助手 In this video were building an AI assistant播放器会按行顺序渲染视觉上形成上中文下英文的双语效果。六、自定义片尾合成Step 1HTML 生成片尾图用 HTML Chrome headless好处是完全可编程——改字、换二维码、换配色都只改 CSS不需要打开任何 GUI 工具。ending.html示例结构!DOCTYPEhtmlhtmlheadstylebody{margin:0;width:1280px;height:720px;background:linear-gradient(135deg,#0a0f1a,#1a3260);display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:PingFang SC;}h1{color:#fff;font-size:72px;}h2{color:#60a5fa;font-size:36px;}.qr{width:240px;margin-top:40px;}/style/headbodyh1一深思AI/h1h2DEEPTHINK AI/h2imgclassqrsrcqrcode.pngpstylecolor:#94a3b8;margin-top:30px;关注获取更多 AI 硬核知识/p/body/html渲染为 PNG/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\--headless--disable-gpu\--window-size1280,720\--screenshotending.png\file://$(pwd)/ending.htmlStep 2生成叮提示音用 ffmpeg 的lavfi虚拟设备生成正弦波ffmpeg-flavfi-isinefrequency1200:duration0.4\-afvolume0.7,aecho0.8:0.9:60:0.3,afadetin:st0:d0.005,afadetout:st0.2:d0.2\-ar44100-ac1\ding.wav音频滤镜拆解滤镜作用sinefrequency1200:duration0.4生成 1200Hz 正弦波时长 0.4 秒volume0.7音量 70%避免爆音aecho0.8:0.9:60:0.3回声输入增益 0.8输出增益 0.9延迟 60ms衰减 0.3afadetin:st0:d0.005前 5ms 淡入避免爆音afadetout:st0.2:d0.20.2 秒开始淡出 0.2 秒铃铛尾音Step 3静态图 音频合成 5 秒片尾视频# 3.1 先合成 5 秒音频前置叮声 静音填充ffmpeg-flavfi-ianullsrcr44100:clmono:d5\-iding.wav\-filter_complex[0:a][1:a]amixinputs2:durationfirst:dropout_transition0\-ar44100-ac1\ending-audio.wav# 3.2 静态图 loop 成 5 秒视频 配音频ffmpeg-loop1-iending.png\-iending-audio.wav\-c:vlibx264-t5-pix_fmtyuv420p-r24\-vfscale1280:720\-c:aaac-b:a128k\-shortest\ending.mp4关键参数作用-loop 1单张图片循环-t 5限制输出时长 5 秒-pix_fmt yuv420p兼容几乎所有播放器的像素格式-r 24固定帧率 24fps与主视频一致-shortest以最短流为准避免画面长音频短或反之七、主视频处理与拼接Step 1去水印 截取前 N 秒砍掉原视频最后的 NotebookLM 默认片尾约 9 秒ffmpeg-iinput.mp4\-t450\-vfdelogox1100:y650:w160:h50\-c:vlibx264-presetfast-pix_fmtyuv420p-r24\-c:aaac-b:a128k\main.mp4Step 2concat 拼接主视频 自定义片尾ffmpeg-imain.mp4-iending.mp4\-filter_complex[0:v][0:a][1:v][1:a]concatn2:v1:a1[v][a]\-map[v]-map[a]\-c:vlibx264-presetfast\-c:aaac-b:a128k\final-no-subs.mp4concat 滤镜的关键要求两段视频的编码参数必须完全一致否则拼接处会卡顿甚至失败参数必须统一分辨率两段都是 1280×720帧率两段都是 24fps像素格式两段都是 yuv420p音频采样率两段都是 44100Hz音频声道数两段都是单声道上一步的 main.mp4 生成时就统一了这些参数所以 concat 能无缝拼接。两种拼接方式对比方式特点适用场景concatfilter本文重编码强制统一参数两段编码参数不同concatdemuxer无损拼接不重编码两段编码参数完全一致demuxer 方式作为备选# 创建拼接清单catlist.txtEOF file main.mp4 file ending.mp4 EOF# 无损拼接ffmpeg-fconcat-safe0-ilist.txt-ccopy output.mp4八、软字幕挂载软字幕 vs 硬字幕类型原理优点缺点软字幕字幕作为独立流存入容器原画质不受损、可开关、可提取翻译抖音/视频号等会重编码丢失硬字幕字幕直接烧录到画面像素所有平台兼容不可关闭、画面多一层字幕实战建议做双份——软字幕版存档和发 B 站/YouTube硬字幕版发抖音/视频号。MP4 软字幕挂载ffmpeg-ifinal-no-subs.mp4-ibilingual.srt\-c:vcopy-c:acopy\-c:smov_text\-metadata:s:s:0languagezho\-metadata:s:s:0title中英双语\final.mp4参数作用-c:s mov_textMP4 容器的字幕编码格式-metadata:s:s:0 languagezho给第 0 个字幕流打语言标签ISO 639-2-metadata:s:s:0 title字幕流显示名硬字幕方案需要 libass如果你的 ffmpeg 编译时带了 libass 支持ffmpeg-ifinal-no-subs.mp4\-vfsubtitlesbilingual.srt:force_styleFontNamePingFang SC,FontSize18,PrimaryColourH00FFFFFF,OutlineColourH00000000,BorderStyle1,Outline2,MarginV30,Alignment2\-c:acopy\final-hardsub.mp4踩坑记录Homebrew 默认的 ffmpeg bottle 版没有 libass需要brew tap homebrew-ffmpeg/ffmpeg brewinstallhomebrew-ffmpeg/ffmpeg/ffmpeg或者用 evermeet.cx 提供的静态编译版。九、完整 SOP 与踩坑记录完整命令清单按顺序执行# 输入 INPUTinput.mp4WORK./_workmkdir-p$WORKcd$WORK# 1. 去水印 截取ffmpeg-i../$INPUT-t450\-vfdelogox1100:y650:w160:h50\-c:vlibx264-presetfast-pix_fmtyuv420p-r24\-c:aaac-b:a128k main.mp4# 2. 提取音频ffmpeg-i../$INPUT-vn-acodecpcm_s16le-ar16000-ac1audio.wav# 3. whisper 识别whisper audio.wav--modelturbo--languageen--output_formatjson--output_dir.# 4. JSON → SRTPython 脚本python3 json2srt.py audio.json en.srt# 5. AI 翻译 en.srt → zh.srt对话式或 API# 6. 合并双语字幕python3 merge_bilingual.py en.srt zh.srt bilingual.srt# 7. 生成片尾图/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\--headless--disable-gpu --window-size1280,720\--screenshotending.png file://$(pwd)/ending.html# 8. 生成叮声ffmpeg-flavfi-isinefrequency1200:duration0.4\-afvolume0.7,aecho0.8:0.9:60:0.3,afadetout:st0.2:d0.2\ding.wav# 9. 合成 5 秒片尾视频ffmpeg-flavfi-ianullsrcr44100:clmono:d5-iding.wav\-filter_complex[0:a][1:a]amixinputs2:durationfirstending-audio.wav ffmpeg-loop1-iending.png-iending-audio.wav\-c:vlibx264-t5-pix_fmtyuv420p-r24\-c:aaac-b:a128k-shortestending.mp4# 10. 拼接主视频 片尾ffmpeg-imain.mp4-iending.mp4\-filter_complex[0:v][0:a][1:v][1:a]concatn2:v1:a1[v][a]\-map[v]-map[a]\-c:vlibx264-presetfast-c:aaac-b:a128k\final-no-subs.mp4# 11. 挂载软字幕ffmpeg-ifinal-no-subs.mp4-ibilingual.srt\-c:vcopy-c:acopy-c:smov_text\-metadata:s:s:0languagezho\../final.mp4踩坑记录坑现象解决concat 拼接处卡顿主视频和片尾帧率不一致统一-r 24重编码-c:a copy报错源音频流参数与目标容器不兼容用-c:a aac重编码whisper 识别语言识别错自动检测把中英混合识别为日语显式--language ensubtitles 滤镜报错ffmpeg 编译没带 libass换 homebrew-ffmpeg tap 版mov_text 字幕乱码SRT 不是 UTF-8 编码保存时显式encodingutf-8静态图 loop 视频黑屏没加-pix_fmt yuv420p强制指定像素格式音频淡出太突兀没加 afade 滤镜前后各加 5ms/200ms 淡入淡出性能数据基于 M1 Mac7 分 40 秒 720p 视频步骤耗时whisper turbo 第一次下载模型5 分钟一次性whisper turbo 识别5 分钟ffmpeg delogo 截取重编码45 秒片尾合成图音视频10 秒concat 拼接重编码50 秒软字幕挂载无重编码2 秒总计首次含下载约 12 分钟总计第二次起约 7 分钟十、常见问题Q1whisper 识别中文效果如何中文效果在 medium 及以上模型是可用的。turbo 模型对中文支持也很好WER 约 5% 左右基于 Common Voice 评测。识别普通话讲座、播客、访谈都没问题。识别中文的注意事项显式指定--language zh如果包含专业术语用--initial_prompt提供词表方言支持有限闽南话/粤语建议用 PaddleSpeechQ2如何批量处理多个视频写成 shell 脚本遍历目录#!/bin/bashforvideoinvideos/*.mp4;doname$(basename$video.mp4)./process_video.sh$videooutput/${name}_processed.mp4done这就是 ffmpeg 方案相对剪辑软件的降维打击——GUI 软件没法批处理 100 个视频。Q3如何嵌入到 AI Agent 工作流把这套 SOP 封装成一个 Skillvideo-processor/ ├── SKILL.md # 方法论和触发词 ├── scripts/ │ ├── remove-watermark.sh │ ├── transcribe.sh │ └── merge-bilingual.py └── templates/ └── ending.htmlAgent 收到处理这个视频指令后探测视频参数ffprobe询问用户水印位置并行执行去水印 提取音频 whisper 识别翻译 合并字幕生成片尾 拼接 挂字幕Q4如果 ffmpeg 编译没带 libass 怎么办硬字幕需要 libass。三种解决方案Homebrew 完整版brew install homebrew-ffmpeg/ffmpeg/ffmpeg静态编译版从 evermeet.cx 下载 macOS 版Docker 方案docker run -v $(pwd):/work jrottenberg/ffmpeg:latest ...Q5视频上传平台后字幕丢失了抖音、视频号等平台会对上传视频做二次转码丢弃mov_text字幕流。两种对策上传带硬字幕版libass 烧录利用平台原生字幕功能上传 SRT 文件B 站、YouTube 会保留软字幕优先选这些平台。参考资料ffmpeg 官方文档 - FiltersOpenAI Whisper GitHubWhisper Turbo 技术报告libass 渲染文档SRT 格式规范结语三条可以带走的硬结论视频处理不需要视频生成大模型。Sora/Runway 是用来创造的。处理工作用 ffmpeg 就够。命令行方案的价值是可编程性。批处理、自动化、嵌入 Agent 工作流——GUI 软件做不到。学会 ffmpeg 的 ROI 远高于买剪辑会员。一次学习终身使用可脚本化。下次拿到一个视频想改点什么先问一句「这事 ffmpeg 能不能干」90% 的情况是能。作者路易乔布斯· 一深思AI如有帮助请点赞收藏技术讨论评论区见。