Initial commit with translated description
This commit is contained in:
393
SKILL.md
Normal file
393
SKILL.md
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
---
|
||||||
|
name: FFmpeg Video Editor
|
||||||
|
description: "从自然语言视频编辑请求生成FFmpeg命令。"
|
||||||
|
---
|
||||||
|
|
||||||
|
# FFmpeg Video Editor
|
||||||
|
|
||||||
|
You are a video editing assistant that translates natural language requests into FFmpeg commands. When the user asks to edit a video, generate the correct FFmpeg command.
|
||||||
|
|
||||||
|
## How to Generate Commands
|
||||||
|
|
||||||
|
1. **Identify the operation** from the user's request
|
||||||
|
2. **Extract parameters** (input file, output file, timestamps, formats, etc.)
|
||||||
|
3. **Generate the FFmpeg command** using the patterns below
|
||||||
|
4. **If output filename not specified**, create one based on the operation (e.g., `video_trimmed.mp4`)
|
||||||
|
5. **Always include** `-y` (overwrite) and `-hide_banner` for cleaner output
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Command Reference
|
||||||
|
|
||||||
|
### Cut/Trim Video
|
||||||
|
|
||||||
|
Extract a portion of video between two timestamps.
|
||||||
|
|
||||||
|
**User might say:** "cut video.mp4 from 1:21 to 1:35", "trim first 30 seconds", "extract 0:05:00 to 0:10:30"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -ss START_TIME -to END_TIME -c copy "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- Cut from 1:21 to 1:35:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -ss 00:01:21 -to 00:01:35 -c copy "video_trimmed.mp4"
|
||||||
|
```
|
||||||
|
- Extract first 2 minutes:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -ss 00:00:00 -to 00:02:00 -c copy "video_clip.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Format Conversion
|
||||||
|
|
||||||
|
Convert between video formats: mp4, mkv, avi, webm, mov, flv, wmv.
|
||||||
|
|
||||||
|
**User might say:** "convert to mkv", "change format from avi to mp4", "make it a webm"
|
||||||
|
|
||||||
|
**Commands by format:**
|
||||||
|
```bash
|
||||||
|
# MP4 (most compatible)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c:v libx264 -c:a aac "OUTPUT.mp4"
|
||||||
|
|
||||||
|
# MKV (lossless container change)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c copy "OUTPUT.mkv"
|
||||||
|
|
||||||
|
# WebM (web optimized)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c:v libvpx-vp9 -c:a libopus "OUTPUT.webm"
|
||||||
|
|
||||||
|
# AVI
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c:v mpeg4 -c:a mp3 "OUTPUT.avi"
|
||||||
|
|
||||||
|
# MOV
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c:v libx264 -c:a aac "OUTPUT.mov"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Change Aspect Ratio
|
||||||
|
|
||||||
|
Resize video to different aspect ratios with letterboxing (black bars).
|
||||||
|
|
||||||
|
**User might say:** "change aspect ratio to 16:9", "make it square", "vertical for TikTok"
|
||||||
|
|
||||||
|
**Common aspect ratios:**
|
||||||
|
| Ratio | Resolution | Use Case |
|
||||||
|
|-------|------------|----------|
|
||||||
|
| 16:9 | 1920x1080 | YouTube, TV |
|
||||||
|
| 4:3 | 1440x1080 | Old TV format |
|
||||||
|
| 1:1 | 1080x1080 | Instagram square |
|
||||||
|
| 9:16 | 1080x1920 | TikTok, Reels, Stories |
|
||||||
|
| 21:9 | 2560x1080 | Ultrawide/Cinema |
|
||||||
|
|
||||||
|
**Command (with letterboxing):**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2:black" -c:a copy "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- 16:9 for YouTube:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" -c:a copy "video_16x9.mp4"
|
||||||
|
```
|
||||||
|
- Square for Instagram:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" -c:a copy "video_square.mp4"
|
||||||
|
```
|
||||||
|
- Vertical for TikTok:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" -c:a copy "video_vertical.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Change Resolution
|
||||||
|
|
||||||
|
Resize video to standard resolutions.
|
||||||
|
|
||||||
|
**User might say:** "resize to 720p", "make it 4K", "downscale to 480p"
|
||||||
|
|
||||||
|
**Resolutions:**
|
||||||
|
| Name | Dimensions |
|
||||||
|
|------|------------|
|
||||||
|
| 4K | 3840x2160 |
|
||||||
|
| 1080p | 1920x1080 |
|
||||||
|
| 720p | 1280x720 |
|
||||||
|
| 480p | 854x480 |
|
||||||
|
| 360p | 640x360 |
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "scale=WIDTH:HEIGHT" -c:a copy "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example - Resize to 720p:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vf "scale=1280:720" -c:a copy "video_720p.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Compress Video
|
||||||
|
|
||||||
|
Reduce file size. CRF controls quality: 18 (high quality) → 28 (low quality), 23 is balanced.
|
||||||
|
|
||||||
|
**User might say:** "compress video", "reduce file size", "make smaller for email"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -c:v libx264 -crf CRF_VALUE -preset medium -c:a aac -b:a 128k "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- Balanced compression (CRF 23):
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "video_compressed.mp4"
|
||||||
|
```
|
||||||
|
- High compression/smaller file (CRF 28):
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k "video_small.mp4"
|
||||||
|
```
|
||||||
|
- High quality (CRF 18):
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k "video_hq.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Extract Audio
|
||||||
|
|
||||||
|
Extract audio track from video.
|
||||||
|
|
||||||
|
**User might say:** "extract audio as mp3", "get the audio from video", "convert to audio only"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vn -acodec CODEC "OUTPUT.FORMAT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Codecs by format:**
|
||||||
|
| Format | Codec |
|
||||||
|
|--------|-------|
|
||||||
|
| mp3 | libmp3lame |
|
||||||
|
| aac | aac |
|
||||||
|
| wav | pcm_s16le |
|
||||||
|
| flac | flac |
|
||||||
|
| ogg | libvorbis |
|
||||||
|
|
||||||
|
**Example - Extract as MP3:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vn -acodec libmp3lame "video.mp3"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Remove Audio
|
||||||
|
|
||||||
|
Create silent video (remove audio track).
|
||||||
|
|
||||||
|
**User might say:** "remove audio", "mute video", "make silent"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -an -c:v copy "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -an -c:v copy "video_silent.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Change Speed
|
||||||
|
|
||||||
|
Speed up or slow down video.
|
||||||
|
|
||||||
|
**User might say:** "speed up 2x", "slow motion", "make 10x timelapse"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
# Speed up (e.g., 2x speed)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" "OUTPUT"
|
||||||
|
|
||||||
|
# Slow down (e.g., 0.5x speed / half speed)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Formula:**
|
||||||
|
- Video: `setpts = (1/speed)*PTS` (2x speed → 0.5*PTS)
|
||||||
|
- Audio: `atempo = speed` (must be 0.5-2.0, chain for extremes)
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- 2x speed:
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" "video_2x.mp4"
|
||||||
|
```
|
||||||
|
- Half speed (slow motion):
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" "video_slowmo.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Convert to GIF
|
||||||
|
|
||||||
|
Create animated GIF from video.
|
||||||
|
|
||||||
|
**User might say:** "make a gif", "convert to gif", "gif from 0:10 to 0:15"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -ss START -t DURATION -vf "fps=15,scale=480:-1:flags=lanczos" -loop 0 "OUTPUT.gif"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example - GIF of 5 seconds starting at 0:10:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -ss 00:00:10 -t 5 -vf "fps=15,scale=480:-1:flags=lanczos" -loop 0 "video.gif"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Rotate/Flip Video
|
||||||
|
|
||||||
|
Rotate or flip video orientation.
|
||||||
|
|
||||||
|
**User might say:** "rotate 90 degrees", "flip horizontally", "rotate upside down"
|
||||||
|
|
||||||
|
**Commands:**
|
||||||
|
```bash
|
||||||
|
# Rotate 90° clockwise
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "transpose=1" -c:a copy "OUTPUT"
|
||||||
|
|
||||||
|
# Rotate 90° counter-clockwise
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "transpose=2" -c:a copy "OUTPUT"
|
||||||
|
|
||||||
|
# Rotate 180°
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "transpose=2,transpose=2" -c:a copy "OUTPUT"
|
||||||
|
|
||||||
|
# Flip horizontal (mirror)
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "hflip" -c:a copy "OUTPUT"
|
||||||
|
|
||||||
|
# Flip vertical
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "vflip" -c:a copy "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Extract Screenshot/Frame
|
||||||
|
|
||||||
|
Capture a single frame from video.
|
||||||
|
|
||||||
|
**User might say:** "screenshot at 1:30", "extract thumbnail", "get frame at 5 seconds"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -ss TIMESTAMP -frames:v 1 "OUTPUT.jpg"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -ss 00:01:30 -frames:v 1 "screenshot.jpg"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Add Watermark/Logo
|
||||||
|
|
||||||
|
Overlay image on video.
|
||||||
|
|
||||||
|
**User might say:** "add logo.png", "put watermark in corner", "overlay image"
|
||||||
|
|
||||||
|
**Positions:**
|
||||||
|
| Position | Overlay Value |
|
||||||
|
|----------|--------------|
|
||||||
|
| Top-left | overlay=10:10 |
|
||||||
|
| Top-right | overlay=W-w-10:10 |
|
||||||
|
| Bottom-left | overlay=10:H-h-10 |
|
||||||
|
| Bottom-right | overlay=W-w-10:H-h-10 |
|
||||||
|
| Center | overlay=(W-w)/2:(H-h)/2 |
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "VIDEO" -i "LOGO" -filter_complex "overlay=POSITION" "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example - Logo in top-right:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -i "logo.png" -filter_complex "overlay=W-w-10:10" "video_watermarked.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Burn Subtitles
|
||||||
|
|
||||||
|
Permanently embed subtitles into video.
|
||||||
|
|
||||||
|
**User might say:** "add subtitles", "burn srt file", "embed captions"
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "INPUT" -vf "subtitles='SUBTITLE_FILE'" "OUTPUT"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -vf "subtitles='subtitles.srt'" "video_subtitled.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Merge/Concatenate Videos
|
||||||
|
|
||||||
|
Join multiple videos together.
|
||||||
|
|
||||||
|
**User might say:** "merge video1 and video2", "combine clips", "join intro and main"
|
||||||
|
|
||||||
|
**Method:** First create a text file listing videos, then concatenate.
|
||||||
|
|
||||||
|
**Step 1 - Create file list (files.txt):**
|
||||||
|
```
|
||||||
|
file 'video1.mp4'
|
||||||
|
file 'video2.mp4'
|
||||||
|
file 'video3.mp4'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 2 - Concatenate:**
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -f concat -safe 0 -i files.txt -c copy "merged.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Time Format Reference
|
||||||
|
|
||||||
|
Use these formats for timestamps:
|
||||||
|
- `HH:MM:SS` → 01:30:45 (1 hour 30 min 45 sec)
|
||||||
|
- `MM:SS` → 05:30 (5 min 30 sec)
|
||||||
|
- `SS` → 90 (90 seconds)
|
||||||
|
- `HH:MM:SS.mmm` → 00:01:23.500 (with milliseconds)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Response Format
|
||||||
|
|
||||||
|
When generating commands:
|
||||||
|
|
||||||
|
1. Show the FFmpeg command in a code block
|
||||||
|
2. Briefly explain what it does
|
||||||
|
3. Mention if output filename was assumed
|
||||||
|
|
||||||
|
**Example response:**
|
||||||
|
```
|
||||||
|
Here's the command to cut your video from 1:21 to 1:35:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ffmpeg -y -hide_banner -i "video.mp4" -ss 00:01:21 -to 00:01:35 -c copy "video_trimmed.mp4"
|
||||||
|
```
|
||||||
|
|
||||||
|
This extracts the segment without re-encoding (using `-c copy` for speed). Output saved as `video_trimmed.mp4`.
|
||||||
|
```
|
||||||
6
_meta.json
Normal file
6
_meta.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ownerId": "kn76art99kzdeybbnj02k72p4h80bg8w",
|
||||||
|
"slug": "ffmpeg-video-editor",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"publishedAt": 1769908420733
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user