详细分析 ▾
运行时依赖
版本
- 用 templates/node_patterns.txt 替换 scripts/ffmpeg_runner.js,将 Node.js 用法模式与示例迁移至模板文件。 - 更新 SKILL.md,引用新的 templates/node_patterns.txt,提供可直接复制的 Node.js、spawn 及 fluent-ffmpeg 片段。 - 删除 SKILL.md 内的 Node.js 脚本示例,统一收至模板,便于复用。 - 未对技能逻辑或行为造成破坏性变更。
安装命令
点击复制技能文档
本技能将 ffmpeg-static(一个以 npm 包形式分发的独立 FFmpeg 二进制)接入每次助手交互。若系统也安装了 FFmpeg,优先使用系统版本(通常更新且支持 GPU);否则回退到自带二进制。两条路径均支持 FFmpeg 全部功能。
无需修改 PATH。require('ffmpeg-static')返回二进制绝对路径;脚本直接传给child_process.spawn即可。
---
安全提示
ffmpeg-static会在npm install时从 GitHub Releases 下载预编译二进制,请在 npmjs.com/package/ffmpeg-static 验证包。- 切勿在未校验的情况下将不受信任的文件名或 URL 直接传入 FFmpeg 命令——FFmpeg 支持读取 URL 与任意协议。
- 自带二进制不含 GPU 加速编码器(nvenc、vaapi、videotoolbox)。如需硬件加速,请使用系统 FFmpeg。
---
安装
最小安装(仅自带 FFmpeg 二进制)
``bash
npm install ffmpeg-static
` 项目安装含 ffprobe(推荐)
`bash
npm install ffmpeg-static ffprobe-static
` 验证二进制路径
`bash
node -e "console.log(require('ffmpeg-static'))"
# 例:/path/to/node_modules/ffmpeg-static/ffmpeg
` 查看最终使用的二进制(自带 vs 系统)
`bash
node scripts/resolve_ffmpeg.js
` ---
二进制解析逻辑
按以下优先级解析 FFmpeg 二进制:
FFMPEG_PATH环境变量——显式指定,优先级最高系统 FFmpeg——遍历PATH目录并用fs.accessSync检测;若存在则优先(更新、支持硬件加速)自带二进制——require('ffmpeg-static')返回的绝对路径;npm install后必定存在
`js
// 标准解析方式——所有脚本统一使用
const { resolveFfmpeg } = require('./scripts/resolve_ffmpeg');
const ffmpegPath = resolveFfmpeg(); // 找不到则抛错
`
---
常用操作
转码为 H.264/AAC MP4
`bash
$(node -e "process.stdout.write(require('ffmpeg-static'))") \
-i input.mkv -c:v libx264 -crf 23 -preset fast \
-c:a aac -b:a 128k output.mp4
` 在指定时间点提取缩略图
`bash
ffmpeg -ss 00:01:30 -i input.mp4 -frames:v 1 -q:v 2 thumb.jpg
` 音频转 MP3
`bash
ffmpeg -i input.flac -q:a 2 output.mp3
` 仅提取音频流
`bash
ffmpeg -i input.mp4 -vn -c:a copy audio.aac
` 无损裁剪
`bash
ffmpeg -ss 00:00:10 -to 00:01:00 -i input.mp4 -c copy trimmed.mp4
` 拼接文件
`bash
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
`
filelist.txt 格式:
`
file '/abs/path/clip1.mp4'
file '/abs/path/clip2.mp4'
` 缩放视频(保持比例)
`bash
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:a copy scaled.mp4
` 生成动态 GIF
`bash
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
` HLS 流打包
`bash
ffmpeg -i input.mp4 -codec: copy -start_number 0 \
-hls_time 10 -hls_list_size 0 -f hls output.m3u8
` ---
在 Node.js 中使用
模板见 templates/node_patterns.txt。关键步骤:
用scripts/resolve_ffmpeg.js解析二进制(纯fs,无 shell 调用)在项目代码里用 Node 的child_process.spawn启动 FFmpeg或 使用fluent-ffmpeg——通过ffmpeg.setFfmpegPath()传入解析后的路径
`js
// 在你的项目里(非 skill 内部)
const { resolveFfmpeg } = require('ffmpeg-static-skill/scripts/resolve_ffmpeg');
const ffmpegBin = resolveFfmpeg(); // 绝对路径,可直接给 spawn 或 fluent-ffmpeg
`
详见 templates/node_patterns.txt 中的 spawn、进度、ffprobe 及 fluent-ffmpeg 示例。
---
环境变量
| 变量 | 作用 |
|------|------|
| FFMPEG_PATH | 手动指定二进制路径;优先级最高 |
| FFPROBE_PATH | 手动指定 ffprobe 路径 |
| FFMPEG_STATIC_SKIP_BINARY_DOWNLOAD | 设为 1 可跳过 npm install` 时的下载(配合系统 FFmpeg 使用) |
---