Config Validator
验证 OpenClaw 配置字段与值的正确性,提供官方 schema 参考和示例。
基于 npm 包的 FFmpeg 静态二进制,支持视频音频转码与格式转换。
openclaw skills install @fantox/ffmpeg-static命令、参数、文件名以原文为准
此技能将 [ffmpeg-static](https://github.com/eugeneware/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](https://www.npmjs.com/package/ffmpeg-static) 上验证该包。npm install ffmpeg-staticnpm install ffmpeg-static ffprobe-staticnode -e "console.log(require('ffmpeg-static'))"
# 例如:/path/to/node_modules/ffmpeg-static/ffmpegnode scripts/resolve_ffmpeg.js该技能按以下优先级顺序解析 FFmpeg 二进制文件:
FFMPEG_PATH 环境变量** — 显式覆盖,始终优先PATH 目录并使用 fs.accessSync 查找;若存在则优先使用(支持更新的编解码器和硬件加速)require('ffmpeg-static') 返回的绝对路径;在 npm install 后保证存在// 标准解析方式 —— 所有脚本应使用此模式
const { resolveFfmpeg } = require('./scripts/resolve_ffmpeg');
const ffmpegPath = resolveFfmpeg(); // 若未找到则抛出异常$(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.mp4ffmpeg -ss 00:01:30 -i input.mp4 -frames:v 1 -q:v 2 thumb.jpgffmpeg -i input.flac -q:a 2 output.mp3ffmpeg -i input.mp4 -vn -c:a copy audio.aacffmpeg -ss 00:00:10 -to 00:01:00 -i input.mp4 -c copy trimmed.mp4ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4filelist.txt 格式:
file '/abs/path/clip1.mp4'
file '/abs/path/clip2.mp4'ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:a copy scaled.mp4ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gifffmpeg -i input.mp4 -codec: copy -start_number 0 \
-hls_time 10 -hls_list_size 0 -f hls output.m3u8const { spawn } = require('child_process');
const { resolveFfmpeg } = require('./scripts/resolve_ffmpeg');
function runFfmpeg(args) {
return new Promise((resolve, reject) => {
const proc = spawn(resolveFfmpeg(), args, { stdio: ['ignore', 'pipe', 'pipe'] });
let stderr = '';
proc.stderr.on('data', d => { stderr += d; });
proc.on('close', code => code === 0 ? resolve() : reject(new Error(stderr)));
});
}
// 示例:转码
await runFfmpeg([
'-i', 'input.mp4',
'-c:v', 'libx264', '-crf', '23',
'-c:a', 'aac', '-b:a', '128k',
'output.mp4'
]);FFmpeg 将进度信息输出到 stderr。可通过匹配 frame= 行,或使用 -progress pipe:1 参数进行解析:
proc.stderr.on('data', d => {
const match = d.toString().match(/time=(\d{2}:\d{2}:\d{2})/);
if (match) console.log('时间:', match[1]);
});const ffmpeg = require('fluent-ffmpeg');
const ffmpegPath = require('./scripts/resolve_ffmpeg').resolveFfmpeg();
ffmpeg.setFfmpegPath(ffmpegPath);
ffmpeg('input.mp4')
.output('output.mp4')
.videoCodec('libx264')
.audioCodec('aac')
.on('end', () => console.log('完成'))
.on('error', err => console.error(err))
.run();| 变量 | 作用 |
|---|---|
FFMPEG_PATH | 覆盖二进制路径;优先级高于系统和捆绑版本 |
FFPROBE_PATH | 覆盖 ffprobe 二进制路径 |
FFMPEG_STATIC_SKIP_BINARY_DOWNLOAD | 设置为 1 可跳过 npm install 期间的下载(适用于已有系统 FFmpeg 的场景) |
在程序启动时调用一次 resolveFfmpeg() 并缓存结果 —— 不要在高频路径中重复调用 require('ffmpeg-static')。
-c copy流复制(-c copy)速度极快且无损。仅在需要更改编解码器或应用滤镜时才进行解码与编码。
-ss 时置于 -i 之前以实现快速定位-ss 00:01:00 -i input.mp4(-i 之前)使用关键帧定位(快速)。而 -i input.mp4 -ss 00:01:00(-i 之后)需从头解码(准确但对大文件较慢)。
-y-y 参数可自动覆盖输出文件,无需用户确认。若不加此参数,FFmpeg 在 CI 或后台任务中会因等待 stdin 输入而挂起。
切勿直接将用户提供的字符串插入 FFmpeg 参数。务必先通过 ffprobe 验证路径是否存在,并确认其为预期的媒体类型。
在启动时检查 ffmpeg -hwaccels,仅当系统 FFmpeg 二进制文件激活时才启用硬件加速相关路径。
-loglevel error减少标准错误输出的噪音。调试失败的转码任务时,可重新启用详细日志(-loglevel verbose)。
内置的 ffmpeg-static 二进制文件编译时包含广泛但固定的编码器集合。主要支持:
视频: H.264 (libx264)、H.265 (libx265)、VP8/VP9 (libvpx)、AV1 (libaom-av1)、MPEG-2/4、ProRes、DNxHD、Theora
音频: AAC(原生 + libfdk-aac,需授权)、MP3(libmp3lame)、Opus(libopus)、Vorbis、FLAC、PCM
容器格式: MP4、MKV、MOV、WebM、AVI、TS、HLS(m3u8)、DASH、FLV、GIF、APNG
图像格式: MJPEG、PNG、WebP(通过 lavf 支持)
硬件编码器(nvenc、qsv、vaapi、videotoolbox)不包含在内置二进制中。如需 GPU 加速,请使用系统安装的 FFmpeg。
| 问题现象 | 解决方法 |
|---|---|
Cannot find module 'ffmpeg-static' | 在项目根目录运行 npm install ffmpeg-static |
| Linux/macOS 上二进制文件不可执行 | 执行 chmod +x $(node -e "process.stdout.write(require('ffmpeg-static'))") |
Encoder libx264 not found | 内置二进制可能缺少该编码器;请安装系统 FFmpeg(apt install ffmpeg / brew install ffmpeg) |
输出路径不存在导致 No such file or directory | 运行 FFmpeg 前确保输出目录已存在 |
| CI 环境中转码卡住 | 添加 -y 参数以自动覆盖无需提示 |
| 无进度信息输出 | 使用 -progress pipe:1 将进度数据写入 stdout |
| GIF 生成速度慢 | 使用两阶段调色板生成方案(参见上方示例) |
FFMPEG_STATIC_SKIP_BINARY_DOWNLOAD 环境变量被忽略 | 请在运行 npm install 之前设置该环境变量,而非之后 |
已收录 1 个 Skill