#! /bin/sh
set -ue
die() {
[ -n "$1" ] && echo >&2 "$1"
cat >&2 <<EOF
Usage: $0 [OPTIONS] FILE
Available options:
-d DURATION duration of each chunk (default: 5 seconds)
-v QUALITY mp3 quality, like lame -V (default: 2)
EOF
exit 1
}
encode() {
in=$1
name="${in%.*}"
[ $2 -gt 1 ] && in=${name}.mp3
ffmpeg -v error -i "$in" -c:a libmp3lame -q:a $QUALITY "${name}_tmp.mp3"
mv "${name}_tmp.mp3" "$name.mp3"
}
DURATION=5
QUALITY=2
while getopts ":d:v:" opt; do
case $opt in
d)
[ ! "$OPTARG" -ge 0 2>/dev/null ] && die "Invalid duration: $OPTARG"
DURATION="$OPTARG"
;;
v)
[ ! "$OPTARG" -ge 0 2>/dev/null ] && die "Invalid quality: $OPTARG"
QUALITY="$OPTARG"
;;
\?)
die "Invalid option: -$opt"
;;
esac
done
shift $((OPTIND - 1))
[ ! -f "$1" ] && die "File not found: $1"
ffmpeg -v error -stats -i "$1" -f segment -segment_time $DURATION -segment_start_number 1 -vn "%03d.wav"
for f in [0-9][0-9][0-9].wav; do
num=${f%.*}
for j in $(seq 1 $num); do
printf >&2 "%s: pass %d\r" "$f" "$j"
encode "$f" "$j"
done
echo >&2
echo "file '${num}.mp3'"
done | ffmpeg -y -v error -stats -protocol_whitelist pipe,file -f concat -i - out.wav
rm [0-9][0-9][0-9].mp3 [0-9][0-9][0-9].wav