Skip to main content
AI/MLjmagly

Audio Extraction

ffmpeg patterns for extracting audio from video files and transcoding between formats

Stars
141
Source
jmagly/aiwg
Updated
2026-05-31
Slug
jmagly--aiwg--audio-extraction
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/jmagly/aiwg/HEAD/agentic/code/frameworks/media-curator/skills/audio-extraction/SKILL.md -o .claude/skills/audio-extraction.md

Drops the SKILL.md into .claude/skills/audio-extraction.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

Audio Extraction

Patterns for extracting audio tracks from video files and transcoding between audio formats using ffmpeg.

Extract Audio from Video

To Opus (Recommended for collections)

# Standard quality (128k) - good balance of size and quality
ffmpeg -y -i input.mp4 -vn -acodec libopus -b:a 128k output.opus

# High quality (192k) - for studio sessions and interviews
ffmpeg -y -i input.mp4 -vn -acodec libopus -b:a 192k output.opus

# Lower quality (96k) - for long-form content like full concerts
ffmpeg -y -i input.mp4 -vn -acodec libopus -b:a 96k output.opus

To FLAC (Lossless preservation)

ffmpeg -y -i input.mp4 -vn -acodec flac output.flac

To MP3 (Maximum compatibility)

# VBR quality 2 (~190kbps, excellent quality)
ffmpeg -y -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3

# CBR 320kbps (maximum quality)
ffmpeg -y -i input.mp4 -vn -acodec libmp3lame -b:a 320k output.mp3

Batch Extraction

All Videos in Directory to Opus

for f in video/*.mp4; do
  [ -f "$f" ] || continue
  base=$(basename "${f%.mp4}")
  [ -f "audio/${base}.opus" ] && continue  # Skip existing
  ffmpeg -y -i "$f" -vn -acodec libopus -b:a 128k "audio/${base}.opus"
done

Parallel Batch Extraction (GNU parallel)

find video/ -name "*.mp4" -print0 | \
  xargs -0 -P 4 -I{} sh -c '
    base=$(basename "${1%.mp4}")
    [ -f "audio/${base}.opus" ] || \
    ffmpeg -y -i "$1" -vn -acodec libopus -b:a 128k "audio/${base}.opus"
  ' _ {}

Format Transcoding

FLAC to Opus

ffmpeg -y -i input.flac -acodec libopus -b:a 128k output.opus

FLAC to MP3

ffmpeg -y -i input.flac -acodec libmp3lame -q:a 2 output.mp3

Opus to MP3 (when Opus not supported by target)

ffmpeg -y -i input.opus -acodec libmp3lame -q:a 2 output.mp3

M4A to Opus

ffmpeg -y -i input.m4a -acodec libopus -b:a 128k output.opus

Quality Verification

Check Audio Bitrate

ffprobe -v quiet -show_entries format=bit_rate \
  -of default=noprint_wrappers=1:nokey=1 input.opus

Check Audio Format Details

ffprobe -v quiet -show_entries stream=codec_name,sample_rate,channels,bit_rate \
  -of json input.opus

Detect Clipping/Distortion

ffmpeg -i input.opus -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume
# If max_volume > 0 dB, audio is clipping

Check Duration

ffprobe -v quiet -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.opus

Format Selection Guide

Source Content Extract To Bitrate Rationale
Music video (studio) Opus 128k Good balance for music
Live performance Opus 128k Crowd noise doesn't need more
Studio session Opus 192k Preserve detail
Interview Opus 96k Speech doesn't need high bitrate
Full concert (2+ hours) Opus 96k Size management
Archival source (FLAC) FLAC Lossless Preserve original quality

Segment Handling

Concatenate Audio Segments

# Create file list
for f in segments/*.opus; do
  echo "file '$f'" >> filelist.txt
done

# Concatenate without re-encoding
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.opus

Split Long Recording into Tracks

# Split at specific timestamps (from setlist)
ffmpeg -i concert.opus -ss 00:00:00 -to 00:04:30 -c copy "01 - Jumpsuit.opus"
ffmpeg -i concert.opus -ss 00:04:30 -to 00:08:15 -c copy "02 - Levitate.opus"

Thumbnail/Frame Extraction

Extract Video Thumbnail (for cover art)

# Extract frame at 5 seconds
ffmpeg -y -ss 5 -i video.mp4 -vframes 1 -q:v 2 cover.jpg

# Extract frame as WebP (smaller)
ffmpeg -y -ss 5 -i video.mp4 -vframes 1 cover.webp

References

  • @$AIWG_ROOT/agentic/code/addons/aiwg-utils/rules/human-authorization.md — Seek explicit authorization before overwriting existing audio files
  • @$AIWG_ROOT/agentic/code/frameworks/media-curator/skills/acquire/SKILL.md — Acquisition skill that invokes audio extraction via --extract-audio flag
  • @$AIWG_ROOT/agentic/code/frameworks/media-curator/skills/integrity-verification/SKILL.md — Verify extracted audio file integrity after processing
  • @$AIWG_ROOT/agentic/code/frameworks/media-curator/skills/metadata-tagging/SKILL.md — Tag extracted audio files with correct metadata after extraction