linux:rip-audio-cd
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| linux:rip-audio-cd [2026/01/26 12:14] – Wuff | linux:rip-audio-cd [2026/02/01 13:14] (current) – [Trim silence from start/end] Wuff | ||
|---|---|---|---|
| Line 34: | Line 34: | ||
| ====== Trim silence from start/end ====== | ====== Trim silence from start/end ====== | ||
| + | This reencodes the file | ||
| < | < | ||
| ffmpeg -i input.mp3 -af silenceremove=1: | ffmpeg -i input.mp3 -af silenceremove=1: | ||
| + | </ | ||
| + | |||
| + | This copies the frames without quality loss: | ||
| + | <code bash trim_mp3_silence_copy.sh> | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | # trim_mp3_silence_copy.sh | ||
| + | # | ||
| + | # Usage: | ||
| + | # | ||
| + | # | ||
| + | # Env vars you can override: | ||
| + | # | ||
| + | # | ||
| + | |||
| + | in=" | ||
| + | out=" | ||
| + | |||
| + | if [[ -z " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [[ ! -f " | ||
| + | echo "Input file not found: ${in}" >&2 | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [[ -z " | ||
| + | base=" | ||
| + | out=" | ||
| + | fi | ||
| + | |||
| + | NOISE_DB=" | ||
| + | MIN_DUR=" | ||
| + | |||
| + | # Get full duration (seconds, as float) | ||
| + | duration=" | ||
| + | |||
| + | # Run silencedetect and capture lines | ||
| + | sd="$( | ||
| + | ffmpeg -hide_banner -nostats -i " | ||
| + | -af " | ||
| + | -f null - 2>&1 | grep -E ' | ||
| + | )" | ||
| + | |||
| + | if [[ -z " | ||
| + | echo "No silence detected (noise=${NOISE_DB}, | ||
| + | cp -f -- " | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | # First silence_end => start of audio | ||
| + | start_keep=" | ||
| + | |||
| + | # Last silence_start => end of audio (trailing silence start) | ||
| + | end_keep=" | ||
| + | |||
| + | # Fallbacks / sanity | ||
| + | if [[ -z " | ||
| + | # No leading silence_end found; keep from 0 | ||
| + | start_keep=" | ||
| + | fi | ||
| + | if [[ -z " | ||
| + | # No trailing silence_start found; keep to full duration | ||
| + | end_keep=" | ||
| + | fi | ||
| + | |||
| + | # Ensure start < end (handle edge cases) | ||
| + | ok="$( | ||
| + | awk -v s=" | ||
| + | )" | ||
| + | |||
| + | if [[ " | ||
| + | echo "Could not determine a valid trim window." | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 2 | ||
| + | fi | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | |||
| + | # Stream-copy trim (no re-encode). Use -ss/-to after -i for more accurate seeking while still copying. | ||
| + | ffmpeg -hide_banner -y -i " | ||
| + | </ | ||
| + | Then use as | ||
| + | < | ||
| + | chmod +x trim_mp3_silence_copy.sh | ||
| + | ./ | ||
| + | # or | ||
| + | NOISE_DB=-35dB MIN_DUR=0.3 ./ | ||
| </ | </ | ||
linux/rip-audio-cd.1769429652.txt.gz · Last modified: by Wuff