OpenClaw 媒体处理:视频、图片、GIF 全搞定
视频要截图、GIF 要搜索、图片要处理…媒体处理任务繁琐又重复。OpenClaw 集成 video-frames、gifgrep、canvas 等技能,让你自动化处理各种媒体需求。
01 媒体处理自动化是什么?
媒体处理自动化 是指通过 OpenClaw 集成 video-frames、gifgrep、canvas 等技能,实现视频截图、GIF 搜索、数据可视化等媒体任务的自动化处理。
核心能力: – 🎬 视频处理 — 关键帧提取、缩略图生成、格式转换 – 🎭 GIF 处理 — 搜索、下载、转换静态图 – 📊 数据可视化 — Canvas 生成图表、报告 – 🔄 批量处理 — 脚本组合,流水线作业
02 媒体处理场景
03 视频处理(video-frames)
环境准备
# 安装 ffmpeg
brew install ffmpeg
# 验证
ffmpeg -version
基础用法
# 提取第一帧
~/.openclaw/skills/video-frames/scripts/frame.sh video.mp4 --out frame.jpg
# 提取特定时间帧
~/.openclaw/skills/video-frames/scripts/frame.sh video.mp4 \
--time 00:01:30 \
--out frame-90s.jpg
实战案例 1:视频内容审核
#!/bin/bash
# video-review.sh
VIDEO="$1"
OUTPUT_DIR="./frames/$(basename $VIDEO .mp4)"
mkdir -p $OUTPUT_DIR
# 每隔 30 秒提取一帧
duration=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$VIDEO")
duration=${duration%.*}
for ((i=0; i<duration; i+=30)); do
timestamp=$(printf "%02d:%02d:%02d" $((i/3600)) $((i%3600/60)) $((i%60)))
~/.openclaw/skills/video-frames/scripts/frame.sh "$VIDEO" \
--time $timestamp \
--out "$OUTPUT_DIR/frame-$(printf "%04d" $i).jpg"
done
echo " 已提取 $((duration/30)) 帧到 $OUTPUT_DIR"
实战案例 2:生成视频缩略图网格
#!/bin/bash
# video-thumbnail-grid.sh
VIDEO="$1"
OUTPUT="${VIDEO%.mp4}-grid.jpg"
# 使用 ffmpeg 生成 3x3 网格
ffmpeg -i "$VIDEO" -vf "fps=1/10,scale=320:180,tile=3x3" -frames:v 1 "$OUTPUT"
echo " 缩略图已生成: $OUTPUT"
04 GIF 处理(gifgrep)
安装 gifgrep
# 安装 gifgrep
brew install steipete/tap/gifgrep
# 或使用 go
go install github.com/steipete/gifgrep/cmd/gifgrep@latest
基础用法
# 搜索 GIF
gifgrep "hello"
# 限制结果数
gifgrep "congrats" --max 5
# JSON 输出
gifgrep "party" --json | jq '.[0].url'
# TUI 模式
gifgrep tui "thank you"
# 下载 GIF
gifgrep "awesome" --download --max 1
实战案例 3:自动回复 GIF
#!/bin/bash
# auto-gif-reply.sh
KEYWORD="$1"
# 搜索并下载 GIF
URL=$(gifgrep "$KEYWORD" --max 1 --format url)
if [-n "$URL"]; then
# 下载
curl -s "$URL" -o /tmp/reply.gif
# 发送到聊天(使用 message 工具)# 注意:实际使用时需要替换为正确的 channel ID
# message --target "channel_id" --media /tmp/reply.gif
echo " 已发送 GIF: $KEYWORD"
else
echo " 未找到相关 GIF"
fi
实战案例 4:GIF 转静态图
#!/bin/bash
# gif-to-still.sh
GIF="$1"
# 提取第 1.5 秒的帧(使用 action 参数)gifgrep --action still "$GIF" --at 1.5s -o still.png
# 生成帧网格(9 帧,3 列)gifgrep --action sheet "$GIF" --frames 9 --cols 3 -o sheet.png
echo " 已生成静态图和帧网格 "
05 Canvas 可视化
基础用法
# 生成简单图表(使用 canvas 工具)# canvas action="eval" --javascript "..."
# 示例 JavaScript 代码:const canvas = document.createElement('canvas');
canvas.width = 800;
canvas.height = 400;
const ctx = canvas.getContext('2d');
// 绘制柱状图
const data = [30, 50, 80, 40, 90];
const barWidth = 100;
data.forEach((value, i) => {
ctx.fillStyle = '#3498db';
ctx.fillRect(i * 120 + 50, 350 - value * 3, barWidth, value * 3);
ctx.fillStyle = '#333';
ctx.font = '14px Arial';
ctx.fillText(value, i * 120 + 80, 370);
});
canvas.toDataURL();
实战案例 5:数据报告自动生成
#!/bin/bash
# data-report.sh
# 假设有数据文件
cat > /tmp/data.json << 'JSON'
{"labels": ["Q1", "Q2", "Q3", "Q4"],
"values": [120, 190, 300, 250]
}
JSON
# 生成图表(使用 canvas 工具)# canvas action="eval" --javascript "..." --out /tmp/chart.png
# 示例 JavaScript 代码:const data = {"labels": ["Q1", "Q2", "Q3", "Q4"], "values": [120, 190, 300, 250]};
const canvas = document.createElement('canvas');
canvas.width = 800;
canvas.height = 400;
const ctx = canvas.getContext('2d');
// 背景
ctx.fillStyle = '#f8f9fa';
ctx.fillRect(0, 0, 800, 400);
// 标题
ctx.fillStyle = '#333';
ctx.font = 'bold 24px Arial';
ctx.fillText('季度销售数据', 50, 40);
// 柱状图
const max = Math.max(...data.values);
const barWidth = 120;
const spacing = 40;
data.values.forEach((value, i) => {const height = (value / max) * 280;
const x = 80 + i * (barWidth + spacing);
const y = 350 - height;
// 柱子
const gradient = ctx.createLinearGradient(x, y, x, y + height);
gradient.addColorStop(0, '#667eea');
gradient.addColorStop(1, '#764ba2');
ctx.fillStyle = gradient;
ctx.fillRect(x, y, barWidth, height);
// 数值
ctx.fillStyle = '#333';
ctx.font = '16px Arial';
ctx.fillText(value, x + barWidth/2 - 15, y - 10);
// 标签
ctx.fillText(data.labels[i], x + 40, 380);
});
canvas.toDataURL();
echo " 图表已生成: /tmp/chart.png"
06 综合实战
案例 6:视频内容摘要
#!/bin/bash
# video-summary.sh
VIDEO="$1"
OUTPUT="summary.md"
# 1. 提取关键帧(每 60 秒)FRAME_DIR="./frames"
mkdir -p $FRAME_DIR
ffmpeg -i "$VIDEO" -vf "fps=1/60,scale=640:360" "$FRAME_DIR/frame-%04d.jpg"
# 2. 用 AI 分析每帧(简化示例)echo "# 视频摘要 " > $OUTPUT
echo "" >> $OUTPUT
for frame in $FRAME_DIR/*.jpg; do
# 这里可以调用 AI 分析图片
echo "" >> $OUTPUT
echo "" >> $OUTPUT
done
# 3. 提取音频转文字(如果有)ffmpeg -i "$VIDEO" -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/audio.wav
~/.openclaw/skills/openai-whisper-api/scripts/transcribe.sh /tmp/audio.wav --out transcript.txt
echo "## 转录 " >> $OUTPUT
cat transcript.txt >> $OUTPUT
echo " 摘要已生成: $OUTPUT"
案例 7:社交媒体素材包
#!/bin/bash
# social-media-kit.sh
VIDEO="$1"
BASE_NAME=$(basename "$VIDEO" .mp4)
OUTPUT_DIR="./$BASE_NAME-kit"
mkdir -p $OUTPUT_DIR
echo "🎬 生成社交媒体素材包: $BASE_NAME"
# 1. 方形视频(Instagram)ffmpeg -i "$VIDEO" -vf "crop=min(iw\,ih):min(iw\,ih),scale=1080:1080" \
-c:v libx264 -crf 23 "$OUTPUT_DIR/${BASE_NAME}-square.mp4"
# 2. 竖版视频(抖音 /TikTok)ffmpeg -i "$VIDEO" -vf "crop=iw*9/16:ih,scale=1080:1920" \
-c:v libx264 -crf 23 "$OUTPUT_DIR/${BASE_NAME}-vertical.mp4"
# 3. 封面图
~/.openclaw/skills/video-frames/scripts/frame.sh "$VIDEO" \
--time 00:00:05 \
--out "$OUTPUT_DIR/${BASE_NAME}-cover.jpg"
# 4. GIF 预览(前 3 秒)ffmpeg -i "$VIDEO" -t 3 -vf "fps=10,scale=480:-1:flags=lanczos" \
"$OUTPUT_DIR/${BASE_NAME}-preview.gif"
# 5. 缩略图网格
ffmpeg -i "$VIDEO" -vf "fps=1/5,scale=320:180,tile=3x3" \
-frames:v 1 "$OUTPUT_DIR/${BASE_NAME}-grid.jpg"
echo "✅ 素材包已生成: $OUTPUT_DIR/"
ls -lh $OUTPUT_DIR
07 常见问题
Q1: ffmpeg 命令找不到
解决:
# macOS
brew install ffmpeg
# Ubuntu
sudo apt install ffmpeg
Q2: 视频提取帧质量差
优化:
# 使用高质量设置
ffmpeg -i video.mp4 -ss 00:01:00 -vframes 1 -q:v 2 output.jpg
Q3: gifgrep 搜索不到结果
检查:
# 确认 API Key
export GIPHY_API_KEY="your_key"
export TENOR_API_KEY="your_key"
Q4: Canvas 生成图片失败
解决:
# 确保在支持的环境中运行
# 或使用 headless 浏览器
08 总结
下一步: – 建立媒体处理流水线 – 结合 AI 实现智能内容分析 – 探索与飞书 /Slack 的媒体分享
本文是 OpenClaw 进阶技能系列第 9 篇,下一篇:《OpenClaw 安全运维:自动化巡检与加固》
#OpenClaw #媒体处理 #视频 #GIF #Canvas #ffmpeg IF #Canvas #ffmpeg 频 #GIF #Canvas #ffmpeg 频 #GIF #Canvas #ffmpeg**
正文完