with one click
ffmpeg
Video and audio processing using FFmpeg inside a secure Docker container
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Video and audio processing using FFmpeg inside a secure Docker container
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Docker container and image management with native docker CLI integration. Use when you need to manage containers, images, networks, volumes, or run Docker Compose.
Image manipulation and conversion using ImageMagick inside a secure Docker container
MongoDB database client with Docker-based mongosh CLI
MySQL database client with Docker-based mysql CLI
PostgreSQL CLI client (psql) for database operations running inside a Docker container
Redis CLI client for cache and data store operations running inside a Docker container
Based on SOC occupation classification
| name | ffmpeg |
| description | Video and audio processing using FFmpeg inside a secure Docker container |
| runtime | docker |
Process video and audio files using FFmpeg running inside a Docker container. Convert formats, extract audio, resize videos, create thumbnails, compress media, and more - all without installing FFmpeg locally.
This skill provides access to FFmpeg's powerful media processing capabilities through a containerized runtime. All processing happens inside an isolated Docker container with resource limits and no network access, ensuring security while maintaining full FFmpeg functionality.
Use this skill when you need to:
FFmpeg runs inside a Docker container, so Docker must be installed:
# macOS (using Homebrew)
brew install --cask docker
# Or download from: https://www.docker.com/products/docker-desktop
# Linux (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install docker.io
# Start Docker service
sudo systemctl start docker
sudo systemctl enable docker
docker --version
docker ps # Should list running containers
Add to your .skill-engine.toml:
[skills.ffmpeg]
source = "docker:linuxserver/ffmpeg:latest"
runtime = "docker"
description = "FFmpeg video/audio processing"
[skills.ffmpeg.docker]
image = "linuxserver/ffmpeg:latest"
entrypoint = "ffmpeg"
volumes = ["${PWD}:/workdir"]
working_dir = "/workdir"
memory = "2g"
cpus = "4"
network = "none"
rm = true
linuxserver/ffmpeg:latest - Official FFmpeg Docker image (~200MB)ffmpeg - Directly runs FFmpeg command${PWD}:/workdir - Mounts current directory as /workdir in container/workdir - Sets container working directory2g - Limits container to 2GB RAM4 - Limits to 4 CPU coresnone - Disables network access (processes local files only)true - Automatically removes container after executionFFmpeg skill uses pass-through syntax - all arguments after -- are passed directly to FFmpeg:
skill run ffmpeg -- [ffmpeg arguments]
All file paths are relative to your current directory, which is mounted as /workdir in the container.
# MP4 to WebM
skill run ffmpeg -- -i input.mp4 output.webm
# AVI to MP4
skill run ffmpeg -- -i input.avi output.mp4
# MOV to MKV
skill run ffmpeg -- -i input.mov output.mkv
# Video to MP3 audio only
skill run ffmpeg -- -i video.mp4 -vn -acodec mp3 audio.mp3
# Extract audio from video
skill run ffmpeg -- -i video.mp4 -vn audio.mp3
# Convert audio format
skill run ffmpeg -- -i audio.wav audio.mp3
# Adjust audio bitrate
skill run ffmpeg -- -i input.mp3 -b:a 192k output.mp3
# Merge audio and video
skill run ffmpeg -- -i video.mp4 -i audio.mp3 -c copy output.mp4
# Resize to 1280x720 (720p)
skill run ffmpeg -- -i input.mp4 -vf scale=1280:720 output.mp4
# Resize to 1920x1080 (1080p)
skill run ffmpeg -- -i input.mp4 -vf scale=1920:1080 output.mp4
# Resize width to 640, maintain aspect ratio
skill run ffmpeg -- -i input.mp4 -vf scale=640:-1 output.mp4
# Resize height to 480, maintain aspect ratio
skill run ffmpeg -- -i input.mp4 -vf scale=-1:480 output.mp4
# Compress with CRF (Constant Rate Factor) - lower is higher quality
# CRF range: 0 (lossless) to 51 (worst), 23 is default, 18 is visually lossless
skill run ffmpeg -- -i input.mp4 -crf 28 output.mp4
# Compress with target bitrate
skill run ffmpeg -- -i input.mp4 -b:v 1M output.mp4
# Two-pass encoding for better quality at target size
skill run ffmpeg -- -i input.mp4 -b:v 1M -pass 1 -f mp4 /dev/null
skill run ffmpeg -- -i input.mp4 -b:v 1M -pass 2 output.mp4
# Extract single frame at 5 seconds
skill run ffmpeg -- -i video.mp4 -ss 00:00:05 -vframes 1 thumb.jpg
# Extract frame at specific time
skill run ffmpeg -- -i video.mp4 -ss 00:01:30 -vframes 1 frame.png
# Create thumbnail at 1/4 size
skill run ffmpeg -- -i video.mp4 -ss 00:00:05 -vf scale=iw/4:ih/4 -vframes 1 thumb.jpg
# Generate thumbnail every 10 seconds
skill run ffmpeg -- -i video.mp4 -vf fps=1/10 thumb%04d.jpg
# Convert video to GIF
skill run ffmpeg -- -i input.mp4 output.gif
# High quality GIF with palette optimization
skill run ffmpeg -- -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
# Simple GIF with reduced frame rate and size
skill run ffmpeg -- -i input.mp4 -vf "fps=10,scale=320:-1" output.gif
# Trim from 10s to 40s (30 second clip)
skill run ffmpeg -- -i input.mp4 -ss 00:00:10 -t 00:00:30 output.mp4
# Trim from 1 minute to end
skill run ffmpeg -- -i input.mp4 -ss 00:01:00 -c copy output.mp4
# Cut first 10 seconds
skill run ffmpeg -- -i input.mp4 -ss 00:00:10 -c copy output.mp4
# Extract specific time range (from 5s to 15s)
skill run ffmpeg -- -i input.mp4 -ss 00:00:05 -to 00:00:15 -c copy output.mp4
# Create file list
echo "file 'video1.mp4'" > filelist.txt
echo "file 'video2.mp4'" >> filelist.txt
echo "file 'video3.mp4'" >> filelist.txt
# Concatenate videos
skill run ffmpeg -- -f concat -safe 0 -i filelist.txt -c copy merged.mp4
# Rotate 90 degrees clockwise
skill run ffmpeg -- -i input.mp4 -vf "transpose=1" output.mp4
# Rotate 180 degrees
skill run ffmpeg -- -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
# Flip horizontally
skill run ffmpeg -- -i input.mp4 -vf "hflip" output.mp4
# Flip vertically
skill run ffmpeg -- -i input.mp4 -vf "vflip" output.mp4
# Speed up 2x (double speed)
skill run ffmpeg -- -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
# Slow down 0.5x (half speed)
skill run ffmpeg -- -i input.mp4 -vf "setpts=2.0*PTS" output.mp4
# Add subtitle file
skill run ffmpeg -- -i video.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
# Burn subtitles into video
skill run ffmpeg -- -i video.mp4 -vf subtitles=subtitles.srt output.mp4
# Extract subtitles
skill run ffmpeg -- -i video.mp4 -map 0:s:0 subtitles.srt
# Convert all MP4 files to WebM
for file in *.mp4; do
skill run ffmpeg -- -i "$file" "${file%.mp4}.webm"
done
# Create thumbnails for all videos
for file in *.mp4; do
skill run ffmpeg -- -i "$file" -ss 00:00:05 -vframes 1 "${file%.mp4}.jpg"
done
# High quality (larger file)
skill run ffmpeg -- -i input.mp4 -crf 18 -preset slow output.mp4
# Balanced quality/speed
skill run ffmpeg -- -i input.mp4 -crf 23 -preset medium output.mp4
# Fast encoding (lower quality)
skill run ffmpeg -- -i input.mp4 -crf 28 -preset fast output.mp4
# Very fast (lowest quality)
skill run ffmpeg -- -i input.mp4 -crf 28 -preset ultrafast output.mp4
# Instagram square (1:1, 1080x1080)
skill run ffmpeg -- -i input.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2" -c:a copy instagram.mp4
# YouTube (1080p)
skill run ffmpeg -- -i input.mp4 -vf scale=1920:1080 -c:v libx264 -preset slow -crf 18 youtube.mp4
# Twitter (720p, under 512MB)
skill run ffmpeg -- -i input.mp4 -vf scale=1280:720 -b:v 2M twitter.mp4
All file paths are relative to your current directory:
# Current directory files
cd /path/to/videos
skill run ffmpeg -- -i video.mp4 output.webm
# Subdirectory files
skill run ffmpeg -- -i input/video.mp4 output/video.webm
# Absolute paths NOT supported - use relative paths
cd /path/to/videos
skill run ffmpeg -- -i video.mp4 result.mp4 # ✓ Works
skill run ffmpeg -- -i /path/to/videos/video.mp4 result.mp4 # ✗ Won't work
$PWD/video.mp4 → Container: /workdir/video.mp4$PWD/input/file.mp4 → Container: /workdir/input/file.mp4H.264 (MP4), H.265 (HEVC), VP8, VP9, AV1, MPEG-2, MPEG-4, Theora, DivX, Xvid
AAC, MP3, Opus, Vorbis, FLAC, WAV, AC3, DTS
MP4, WebM, MKV, AVI, MOV, FLV, 3GP, OGG, M4V, WMV
Use appropriate presets:
ultrafast - Quick encoding, larger filesmedium - Balanced (default)slow - Better compression, slowerveryslow - Best compression, very slowCopy streams when possible:
skill run ffmpeg -- -i input.mp4 -c copy output.mp4 # No re-encoding
Hardware acceleration (if supported by image):
skill run ffmpeg -- -hwaccel auto -i input.mp4 output.mp4
Batch process at once rather than multiple sequential runs
# Check Docker status
docker ps
# Start Docker Desktop (macOS)
open /Applications/Docker.app
# Start Docker service (Linux)
sudo systemctl start docker
If processing large files, increase memory limit in .skill-engine.toml:
[skills.ffmpeg.docker]
memory = "4g" # Increase to 4GB
Ensure you're in the correct directory:
# Check current directory
pwd
ls -la # Verify files exist
# Change to correct directory
cd /path/to/videos
skill run ffmpeg -- -i video.mp4 output.webm
Docker container may have permission issues:
# Check file permissions
ls -la video.mp4
# Make file readable
chmod 644 video.mp4
| Error | Cause | Solution |
|---|---|---|
| "No such file" | Wrong directory or path | Use pwd and ls to verify location |
| "Permission denied" | File permissions | chmod 644 filename |
| "Killed" | Out of memory | Increase memory limit in config |
| "Cannot connect to Docker" | Docker not running | Start Docker Desktop/service |
| "Invalid codec" | Unsupported format | Check input format with ffmpeg -i file |
linuxserver/ffmpeg:latest:latest tag| Task | Command |
|---|---|
| Convert format | -i input.mp4 output.webm |
| Extract audio | -i video.mp4 -vn audio.mp3 |
| Resize | -i input.mp4 -vf scale=1280:720 output.mp4 |
| Compress | -i input.mp4 -crf 28 output.mp4 |
| Trim | -i input.mp4 -ss 00:00:10 -t 00:00:30 output.mp4 |
| Thumbnail | -i video.mp4 -ss 00:00:05 -vframes 1 thumb.jpg |
| To GIF | -i input.mp4 -vf "fps=10,scale=320:-1" output.gif |
| Merge | -f concat -safe 0 -i filelist.txt -c copy merged.mp4 |