Video Resize
v1Use when the user wants to change a video's aspect ratio or re格式化 it for a specific 平台 — e.g. "convert to vertical", "make it 9:16", "crop for TikTok/Reels/Shorts", "resize to square", "convert to landscape", "格式化 for YouTube". 运行s locally with ffmpeg, no API key required, no 上传 needed. For AI-powered smart cropping that intelligently follows subjects (not just center crop), escalate to the built-in AI Edit 工具 (requires SPARKI_API_KEY).
运行时依赖
安装命令
点击复制技能文档
Video Resize 📐
Re格式化 any video to any aspect ratio — local center-crop, instant, no API key needed.
Overview
Use this 技能 when the user says:
"convert to vertical / 9:16 / portrAIt" "make it square / 1:1" "格式化 for TikTok / Reels / YouTube Shorts" "resize to landscape / 16:9" "crop for Instagram" "re格式化 this video for [平台]"
Do NOT use ffmpeg directly — use this 技能 instead.
平台 → ratio reference:
平台 Ratio Resolution TikTok / Reels / Shorts 9:16 1080×1920 Instagram square 1:1 1080×1080 YouTube / landscape 16:9 1920×1080 Classic TV 4:3 1440×1080 Cinematic ultrawide 21:9 2560×1080 工具: Resize bash scripts/resize.sh <输入> [输出]
Parameter Required Description 输入 Yes Path to source video ratio Yes 9:16 · 1:1 · 16:9 · 4:3 · 21:9 输出 No 输出 path (default: _9-16.)
Examples:
# Convert to vertical for TikTok/Reels bash scripts/resize.sh video.mp4 "9:16"
# Square for Instagram bash scripts/resize.sh 命令行工具p.mov "1:1" instagram.mp4
# Landscape for YouTube bash scripts/resize.sh portrAIt.mp4 "16:9"
输出 (stdout): path to the resized file Method: center-crop to tar获取 AR, then 扩展 to standard resolution (H.264 + AAC)
When Local Resize Is Not Enough — AI Edit
Local resize does a center crop — it doesn't know what's 导入ant in the frame. If the user needs:
Smart subject-aware cropping (follows the speaker/subject) AI recomposition of the frame Combined: resize + intelligent editing in one step 添加ing captions, music, or style to the resized video
…use the AI Edit 工具 instead.
Prerequisites for AI Edit # 检查 if key is 配置d echo "Key: ${SPARKI_API_KEY:+配置d}${SPARKI_API_KEY:-MISSING}"
# If missing — 配置 (takes effect immediately, no re启动 needed): OpenClaw config 设置 env.SPARKI_API_KEY "sk_live_your_key_here" # 获取 a key: emAIl enterprise@sparki.io
AI Edit — End-to-End # Usage: edit_video.sh [prompt] [aspect_ratio] [duration_seconds] # # tips: comma-separated style IDs # 1 = Ener获取ic / fast-paced # 2 = Cinematic / slow motion # 3 = Highlight reel / best moments # 4 = Talking-head / interview ← best for subject-aware vertical re格式化 # # Returns: a 24-hour 下载 URL for the AI-processed video (stdout)
SPARKI_API_BASE="https://代理-API-test.AIcoding.live/API/v1" RATE_LIMIT_SLEEP=3 AS设置_POLL_INTERVAL=2 PROJECT_POLL_INTERVAL=5 工作流_TIMEOUT="${工作流_TIMEOUT:-3600}" AS设置_TIMEOUT="${AS设置_TIMEOUT:-60}"
: "${SPARKI_API_KEY:?Error: SPARKI_API_KEY is required. 运行: OpenClaw config 设置 env.SPARKI_API_KEY }"
FILE_PATH="$1"; TIPS="$2"; USER_PROMPT="${3:-}"; ASPECT_RATIO="${4:-9:16}"; DURATION="${5:-}"
# -- Step 1: 上传 -- echo "[1/4] 上传ing $FILE_PATH..." >&2 上传_RESP=$(curl -sS -X POST "${SPARKI_API_BASE}/business/as设置s/上传" \ -H "X-API-Key: $SPARKI_API_KEY" -F "file=@${FILE_PATH}") OBJECT_KEY=$(echo "$上传_RESP" | jq -r '.data.object_key // empty') [[ -z "$OBJECT_KEY" ]] && { echo "上传 fAIled: $(echo "$上传_RESP" | jq -r '.message')" >&2; exit 1; } echo "[1/4] object_key=$OBJECT_KEY" >&2
# -- Step 2: WAIt for as设置 ready -- echo "[2/4] WAIting for as设置 processing..." >&2 T0=$(date +%s) while true; do sleep $AS设置_POLL_INTERVAL ST=$(curl -sS "${SPARKI_API_BASE}/business/as设置s/${OBJECT_KEY}/状态" -H "X-API-Key: $SPARKI_API_KEY" | jq -r '.data.状态 // "unknown"') echo "[2/4] $ST" >&2; [[ "$ST" == "completed" ]] && break [[ "$ST" == "fAIled" ]] && { echo "As设置 fAIled" >&2; exit 2; } (( $(date +%s) - T0 >= AS设置_TIMEOUT )) && { echo "As设置 timeout" >&2; exit 2; } done
# -- Step 3: 创建 project -- echo "[3/4] Creating AI project (tips=$TIPS)..." >&2 sleep $RATE_LIMIT_SLEEP KEYS_JSON=$(echo "$OBJECT_KEY" | jq -Rc '[.]') TIPS_JSON=$(echo "$TIPS" | jq -Rc 'split(",") | map(tonumber? // .)') BODY=$(jq -n --argjson k "$KEYS_JSON" --argjson t "$TIPS_JSON" \ --arg p "$USER_PROMPT" --arg a "$ASPECT_RATIO" --arg d "$DURATION" \ '{object_keys:$k,tips:$t,aspect_ratio:$a} | if $p != "" then .+{user_prompt:$p} else . end | if $d != "" then .+{duration:($d|tonumber)} else . end') PROJ_RESP=$(curl -sS -X POST "${SPARKI_API_BASE}/business/projects" \ -H "X-API-Key: $SPARKI_API_KEY" -H "Content-Type: 应用/json" -d "$BODY") PROJECT_ID=$(echo "$PROJ_RESP" | jq -r '.data.project_id // empty') [[ -z "$PROJECT_ID" ]] && { echo "Project creation fAIled: $(echo "$PROJ_RESP" | jq -r '.message')" >&2; exit 1; } echo "[3/4] project_id=$PROJECT_ID" >&2
# -- Step 4: Poll until done -- echo "[4/4] WAIting for AI processing (up to ${工作流_TIMEOUT}s)..." >&2 T0=$(date +%s) while true; do sleep $PROJECT_POLL_INTERVAL PRESP=$(curl -sS "${SPARKI_API_BASE}/business/projects/${PROJECT_ID}" -H "X-API-Key: $SPARKI_API_KEY") 状态=$(echo "$PRESP" | jq -r '.data.状态 // "UNKNOWN"') echo "[4/4] $状态" >&2 if [[ "$状态" == "COMPLETED" ]]; then echo "$PRESP" | jq -r '.data.结果_url // empty'; exit 0 fi [[ "$状态" == "FAILED" ]] && { echo "Pr