extract-audio
SKILL.md
Format Decision Tree
| User wants | Format | Flags | Why |
|---|---|---|---|
| Music, archive quality | FLAC | -c:a flac |
Lossless, no quality loss |
| Music, small + transparent | MP3 VBR | -c:a libmp3lame -q:a 0 |
~200kbps avg, perceptually lossless |
| Podcast / voice | MP3 128k CBR | -c:a libmp3lame -b:a 128k |
Sufficient for speech, universally compatible |
| Mobile / streaming | AAC 192k | -c:a aac -b:a 192k |
Better than MP3 at equivalent bitrate |
| DAW / editing | WAV | -c:a pcm_s16le -ar 44100 |
No encoding loss, widest DAW support |
| Source already target format | Copy | -c:a copy |
No re-encode, instant, lossless |
Process
1. Probe audio streams
ffprobe -v quiet -print_format json -show_streams "$INPUT" | \
python3 -c "
import json, sys
streams = [s for s in json.load(sys.stdin)['streams'] if s['codec_type']=='audio']
for i, s in enumerate(streams):
print(f'Stream {i}: {s[\"codec_name\"]} {s.get(\"bit_rate\",\"?\")} bps {s.get(\"channel_layout\",\"?\")}')
"
2. Determine format
Apply the decision tree above if the user didn't specify. If the source audio codec already matches the target, use -c:a copy to avoid transcoding.
If multiple audio streams exist, ask the user which to extract — or use -map 0:a to extract all. Once the user responds, apply -map 0:a:N (where N is the zero-based stream index they chose) or -map 0:a for all streams in the Phase 3 command.
3. Construct command
# General pattern (-vn drops the video stream entirely):
ffmpeg -i "$INPUT" -vn [FORMAT_FLAGS] "$OUTPUT"
# Examples:
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 0 audio.mp3 # MP3 VBR best quality
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 128k podcast.mp3 # MP3 128k CBR
ffmpeg -i video.mp4 -vn -c:a flac archive.flac # FLAC lossless
ffmpeg -i video.mp4 -vn -c:a aac -b:a 192k mobile.aac # AAC
ffmpeg -i video.mp4 -vn -c:a pcm_s16le -ar 44100 edit.wav # WAV for DAW
ffmpeg -i video.mp4 -vn -c:a copy original.m4a # Copy audio stream
4. Confirm and run
Show: detected source codec and bitrate, chosen output format, output path. Wait for approval, then run.
Report output file size and duration: ffprobe -v quiet -show_format "$OUTPUT" | grep -E "duration|size"
Key Decisions
Preserve generation quality: avoid transcoding chains that degrade source fidelity. Each decision below is an application of this principle.
- Lossy-to-lossy warning: if the source is already lossy (MP3, AAC, OGG) and the user wants a different lossy format, warn them that re-encoding degrades quality. Recommend keeping the source format or using
-c:a copywhere container compatibility allows. - For files >1 hour, ask whether the user wants the full file or a specific range — trimming can be added with
-ssand-tobefore-vn. - M4A vs AAC: AAC is the codec, M4A is the container. Use
.m4aextension for Apple device compatibility; use.aacfor a raw stream.
Weekly Installs
1
Repository
gupsammy/claudestGitHub Stars
49
First Seen
6 days ago
Security Audits
Installed on
claude-code1