Aiwg Audio Extraction

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

install
source · Clone the upstream repo
git clone https://github.com/jmagly/aiwg
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jmagly/aiwg "$T" && mkdir -p ~/.claude/skills && cp -r "$T/agentic/code/frameworks/media-curator/skills/audio-extraction" ~/.claude/skills/jmagly-aiwg-audio-extraction-043187 && rm -rf "$T"
manifest: agentic/code/frameworks/media-curator/skills/audio-extraction/SKILL.md
source content

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 ContentExtract ToBitrateRationale
Music video (studio)Opus128kGood balance for music
Live performanceOpus128kCrowd noise doesn't need more
Studio sessionOpus192kPreserve detail
InterviewOpus96kSpeech doesn't need high bitrate
Full concert (2+ hours)Opus96kSize management
Archival source (FLAC)FLACLosslessPreserve 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