Skip to content

Instantly share code, notes, and snippets.

@qruf
Created May 26, 2017 00:47
Show Gist options
  • Select an option

  • Save qruf/19b0f9a0d877244800138f8505972c2f to your computer and use it in GitHub Desktop.

Select an option

Save qruf/19b0f9a0d877244800138f8505972c2f to your computer and use it in GitHub Desktop.
audio generation loss simulator
#! /bin/sh
# generation loss demonstration script
# TODO:
# - output the concatenated encoded format
# (currently outputs pcm to avoid encoder-delay gaps)
# - better progress display
set -e
# child script
if [ -n "$CH_RUNNING" ]; then
name=${1%.*}
tmpname="${name}_tmp.$CH_FORMAT"
for i in $(seq 1 $name); do
ffmpeg -v error -i "$1" -c:a $CH_ENCODER $CH_OPTS "$tmpname"
ffmpeg -y -v error -i "$tmpname" -c:a pcm_s16le "${name}.wav"
rm "$tmpname"
printf "."
done
exit 0
fi
# main script
DURATION=5
JOBS=1
OUTNAME="out.wav"
CH_ENCODER="libmp3lame"
CH_FORMAT="mp3"
CH_OPTS="-q:a 2"
CH_RUNNING=1
die() {
[ -n "$1" ] && echo >&2 "$1"
cat >&2 <<EOF
Usage: $0 [OPTIONS] FILE
Available options:
-c ENCODER audio encoder (default: $CH_ENCODER)
-d DURATION duration of each segment (default: $DURATION seconds)
-j JOBS run jobs in parallel (default: $JOBS)
-o FILENAME output filename (default: $OUTNAME)
-x OPTS extra options to ffmpeg (default: $CH_OPTS)
EOF
exit 1
}
# gettotal() {
# last=$(ls -1 [0-9][0-9][0-9].wav | tail -1)
# n=${1%.*}
# echo $((($n * $n + $n) / 2))
# }
checkuint() {
[ "$1" -ge 0 2>/dev/null ] || die "invalid argument to -$2: $1"
}
while getopts ":c:d:j:o:x:" opt; do
case $opt in
c)
CH_ENCODER="$OPTARG"
# set the intermediate format to help avoid encoder-delay gaps
case $CH_ENCODER in
libmp3lame | libshine) CH_FORMAT="mp3" ;;
libvorbis | vorbis) CH_FORMAT="ogg" ;;
libopus | opus) CH_FORMAT="opus" ;;
libfdk_aac | aac) CH_FORMAT="m4a" ;;
*) CH_FORMAT="mka" ;;
esac
;;
d)
checkuint "$OPTARG" $opt
DURATION="$OPTARG"
;;
j)
checkuint "$OPTARG" $opt
JOBS="$OPTARG"
;;
o)
OUTNAME="$OPTARG"
;;
x)
CH_OPTS="$OPTARG"
;;
\?)
die "Invalid option: -$opt"
;;
esac
done
shift $((OPTIND - 1))
[ "$#" -eq 0 ] && die
[ ! -f "$1" ] && die "File not found: $1"
echo "Splitting $1"
ffmpeg -v error -stats -i "$1" -f segment -segment_time $DURATION -segment_start_number 1 -c:a pcm_s16le -vn "%03d.wav"
echo -n "Encoding"
export CH_RUNNING CH_ENCODER CH_FORMAT CH_OPTS
for f in [0-9][0-9][0-9].wav; do printf '%s\0' "$f"; done | xargs -0 -n1 -P$JOBS -I{} $SHELL "$0" {}
echo
echo "Joining parts into $OUTNAME"
for f in [0-9][0-9][0-9].wav; do
echo "file '$f'"
done | ffmpeg -y -v error -stats -protocol_whitelist file,pipe -f concat -i - -c copy "$OUTNAME"
rm [0-9][0-9][0-9].wav
@Personontheweb1997
Copy link

hello, i'm new to github. i have no idea how to download this or use this, and idk how to put a file into the vhs thing, pls help

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment