Gsd-skill-creator av-studio
Audio/video studio production — multi-track editing, color grading, motion graphics, compositing, live streaming, screen recording, YouTube publishing.
install
source · Clone the upstream repo
git clone https://github.com/Tibsfox/gsd-skill-creator
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Tibsfox/gsd-skill-creator "$T" && mkdir -p ~/.claude/skills && cp -r "$T/examples/skills/media/av-studio" ~/.claude/skills/tibsfox-gsd-skill-creator-av-studio && rm -rf "$T"
manifest:
examples/skills/media/av-studio/SKILL.mdsource content
AV Studio Production Skill
Combines ffmpeg-media (codecs/formats), audio-engineering (mastering/mixing), and gource-visualizer (repo visualization) into a unified production toolkit for video content creation, live streaming, and multimedia publishing.
Production Templates
YouTube Video Pipeline
# 1. Screen recording (with audio) ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \ -f pulse -i default \ -c:v libx264 -preset ultrafast -crf 18 \ -c:a aac -b:a 192k \ raw_recording.mkv # 2. Trim to content ffmpeg -ss 00:00:05 -i raw_recording.mkv -to 00:45:00 -c copy trimmed.mkv # 3. Add intro + outro cat > concat.txt << EOF file 'intro.mp4' file 'trimmed.mkv' file 'outro.mp4' EOF ffmpeg -f concat -safe 0 -i concat.txt -c:v libx264 -c:a aac assembled.mp4 # 4. Color grade + normalize audio ffmpeg -i assembled.mp4 \ -vf "eq=brightness=0.04:contrast=1.1:saturation=1.15,unsharp=5:5:0.5" \ -af "loudnorm=I=-14:TP=-1:LRA=11" \ -c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p \ -c:a aac -b:a 192k \ -movflags +faststart \ final.mp4 # 5. Generate thumbnail ffmpeg -i final.mp4 -ss 00:00:30 -frames:v 1 \ -vf "scale=1280:720" thumbnail.jpg
Presentation Recording
# Record screen + webcam PiP ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \ -f v4l2 -video_size 320x240 -framerate 30 -i /dev/video0 \ -f pulse -i default \ -filter_complex "[0:v][1:v]overlay=W-w-20:H-h-20[out]" \ -map "[out]" -map 2:a \ -c:v libx264 -preset fast -crf 22 \ -c:a aac -b:a 128k \ presentation.mp4
Tutorial / Screencast
# Record with mouse cursor highlight ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 \ -draw_mouse 1 -i :0.0 \ -f pulse -i default \ -c:v libx264 -preset fast -crf 20 \ -c:a aac -b:a 128k \ tutorial.mp4 # Add chapter markers (for YouTube) ffmpeg -i tutorial.mp4 -c copy \ -metadata:c:0 title="Introduction" \ -metadata:c:0 timebase=1/1000 \ chaptered.mp4
Color Grading
LUT Application
# Apply a 3D LUT (cube format) ffmpeg -i input.mp4 -vf "lut3d=cinematic.cube" graded.mp4 # Apply with blend (50% strength) ffmpeg -i input.mp4 -vf "split[a][b];[b]lut3d=cinematic.cube[c];[a][c]blend=all_opacity=0.5" graded.mp4
Manual Color Correction
# Lift/Gamma/Gain (shadows/midtones/highlights) ffmpeg -i input.mp4 -vf "\ colorbalance=rs=0.1:gs=-0.05:bs=0.15:\ rm=0:gm=0:bm=0:\ rh=-0.05:gh=0:bh=0.05" \ corrected.mp4 # White balance correction (warm up) ffmpeg -i input.mp4 -vf "colortemperature=temperature=6500" warm.mp4 # Curves (S-curve for contrast) ffmpeg -i input.mp4 -vf "curves=master='0/0 0.25/0.15 0.5/0.5 0.75/0.85 1/1'" contrast.mp4
Motion Graphics
Text Animations
# Fade-in title card (2 seconds) ffmpeg -i input.mp4 -vf "\ drawtext=text='Episode Title':\ fontsize=72:fontcolor=white@0.0:\ x=(w-text_w)/2:y=(h-text_h)/2:\ alpha='if(lt(t,1),t,if(lt(t,3),1,if(lt(t,4),4-t,0)))'" \ titled.mp4 # Lower third (name + title) ffmpeg -i input.mp4 -vf "\ drawbox=x=0:y=ih-120:w=500:h=120:color=black@0.7:t=fill,\ drawtext=text='Jane Doe':fontsize=36:fontcolor=white:x=20:y=ih-110,\ drawtext=text='Software Engineer':fontsize=24:fontcolor=0xcccccc:x=20:y=ih-65" \ lower_third.mp4
Transitions
# Crossfade between two clips (1 second overlap) ffmpeg -i clip1.mp4 -i clip2.mp4 \ -filter_complex "\ [0:v]trim=0:10,setpts=PTS-STARTPTS[v0];\ [1:v]trim=0:10,setpts=PTS-STARTPTS[v1];\ [v0][v1]xfade=transition=fade:duration=1:offset=9[vout];\ [0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0];\ [1:a]atrim=0:10,asetpts=PTS-STARTPTS[a1];\ [a0][a1]acrossfade=d=1[aout]" \ -map "[vout]" -map "[aout]" crossfade.mp4 # Available xfade transitions: # fade, wipeleft, wiperight, wipeup, wipedown, slideleft, slideright, # slideup, slidedown, circlecrop, circleopen, circleclose, dissolve, # pixelize, diagtl, diagtr, diagbl, diagbr, hlslice, hrslice, # vuslice, vdslice, hblur, fadegrays, squeezeh, squeezev
Picture-in-Picture
# Webcam overlay (bottom right, 25% size) ffmpeg -i screen.mp4 -i webcam.mp4 \ -filter_complex "\ [1:v]scale=iw/4:ih/4[pip];\ [0:v][pip]overlay=W-w-20:H-h-20" \ -c:v libx264 -crf 22 -c:a aac pip.mp4 # Animated PiP (slides in from right) ffmpeg -i screen.mp4 -i webcam.mp4 \ -filter_complex "\ [1:v]scale=320:240[pip];\ [0:v][pip]overlay=x='if(lt(t,1),W,W-w-20)':y=H-h-20" \ animated_pip.mp4
Video Stabilization
# Two-pass stabilization with vidstab # Pass 1: analyze ffmpeg -i shaky.mp4 -vf vidstabdetect=shakiness=5:accuracy=15 -f null - # Pass 2: apply ffmpeg -i shaky.mp4 -vf vidstabtransform=smoothing=10:input=transforms.trf stabilized.mp4
Timelapse / Slow Motion
# Timelapse from photos (one frame per image) ffmpeg -framerate 30 -pattern_type glob -i 'photos/*.jpg' \ -c:v libx264 -crf 18 -pix_fmt yuv420p timelapse.mp4 # Speed ramp (normal → 4x → normal) ffmpeg -i input.mp4 -filter_complex "\ [0:v]trim=0:10,setpts=PTS-STARTPTS[v1];\ [0:v]trim=10:30,setpts=0.25*(PTS-STARTPTS)[v2];\ [0:v]trim=30:40,setpts=PTS-STARTPTS[v3];\ [v1][v2][v3]concat=n=3:v=1:a=0[out]" \ -map "[out]" speed_ramp.mp4 # Smooth slow motion (frame interpolation with minterpolate) ffmpeg -i input.mp4 -vf "minterpolate=fps=120:mi_mode=mci:mc_mode=aobmc:vsbmc=1" \ -r 30 slowmo.mp4
Live Streaming
# Stream to YouTube via RTMP ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \ -f pulse -i default \ -c:v libx264 -preset veryfast -maxrate 4500k -bufsize 9000k \ -pix_fmt yuv420p -g 60 \ -c:a aac -b:a 128k -ar 44100 \ -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY" # Stream to Twitch ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \ -f pulse -i default \ -c:v libx264 -preset veryfast -maxrate 6000k -bufsize 12000k \ -pix_fmt yuv420p -g 60 \ -c:a aac -b:a 160k -ar 44100 \ -f flv "rtmp://live.twitch.tv/app/YOUR_STREAM_KEY"
Aspect Ratios
| Format | Ratio | Resolution | Use |
|---|---|---|---|
| Widescreen | 16:9 | 1920x1080 | YouTube, presentations |
| Vertical | 9:16 | 1080x1920 | TikTok, Reels, Shorts |
| Square | 1:1 | 1080x1080 | Instagram feed |
| Ultrawide | 21:9 | 2560x1080 | Cinematic |
| Classic | 4:3 | 1440x1080 | Legacy, some webcams |
| Cinema | 2.39:1 | 2048x858 | Film standard |
Letterboxing / Pillarboxing
# Add letterbox (16:9 → 21:9 cinematic bars) ffmpeg -i input.mp4 -vf "pad=iw:iw*9/21:(ow-iw)/2:(oh-ih)/2:black" cinematic.mp4 # Convert vertical to horizontal (blur background) ffmpeg -i vertical.mp4 -filter_complex "\ [0:v]scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,boxblur=20[bg];\ [0:v]scale=-1:1080[fg];\ [bg][fg]overlay=(W-w)/2:0" \ horizontal_blurbg.mp4
YouTube Publishing Checklist
- Video specs: H.264, 1080p+, -14 LUFS audio, thumbnail 1280x720
- faststart:
for progressive download-movflags +faststart - Pixel format:
for compatibility-pix_fmt yuv420p - Chapters: Include in description (00:00 Intro, 01:30 Topic, etc.)
- Thumbnail: High-contrast, readable text at small sizes, faces perform well
- Subtitles: SRT file or burn-in with
filterdrawtext - End screen: Last 20 seconds reserved for cards/end screen elements
Related Skills & Agents
| Asset | Role |
|---|---|
skill | Codec/format foundation |
skill | Audio mastering/mixing |
agent | Format conversion |
agent | Audio mastering |
agent | Podcast pipeline |
agent | Audio analysis |
skill | Repository visualization → video |
When This Skill Activates
- Video editing, trimming, concatenation with transitions
- Color grading and correction
- Motion graphics, titles, lower thirds
- Screen recording and screencasts
- Live streaming (YouTube, Twitch)
- Picture-in-picture compositing
- Video stabilization
- Timelapse and slow motion
- Aspect ratio conversion
- YouTube video publishing workflow