X-Git-Url: https://code.delx.au/transcoding/blobdiff_plain/48a35c1d3b975e17d4fd002145855c561cbddd46..698521ee62495859c3dab544eac316a308d983c1:/fix-pal-speedup diff --git a/fix-pal-speedup b/fix-pal-speedup index af1d30d..39c4ba4 100755 --- a/fix-pal-speedup +++ b/fix-pal-speedup @@ -1,37 +1,80 @@ #!/bin/bash -e -# Many DVDs released in Australia are sped up from 23.976fps to 25fps. +# Many DVDs released in Australia are sped up from 24fps to 25fps. # This script reverses the procedure, correcting the audio pitch. -# Input files are assumed to be mkv files with track 2 audio. -# The video framerate is adjusted without re-encoding. The audio is slowed and -# normalised then re-encoded as mp3. +# The video framerate is adjusted without re-encoding. The audio is +# slowed, volume normalised, down-mixed to stereo and encoded as mp3. if [ -z "$1" -o -z "$2" ]; then - echo "Usage: $0 destdir infile" - exit 1 + echo "Usage: $0 destdir infile [infile ...]" + exit 1 fi +set -xe FORCEFPS="24" SLOWDOWN="0.96" +function mux_replace_audio { + infile="$1" + audiofile="$2" + outfile="$3" + + trackid="$(mkvmerge -i "$infile" | grep video | sed 's/^Track ID \(.\):.*$/\1/')" + mkvmerge -o "${outfile}" --default-duration "${trackid}:${FORCEFPS}fps" --no-audio "$infile" "$audiofile" +} + +function extract_audio { + infile="$1" + + exec mpv \ + --no-terminal \ + --no-video \ + --ao pcm:waveheader:file=/dev/stdout \ + "$infile" +} + +function slow_audio { + exec sox \ + --temp "$tmpdir" \ + - \ + -t wav - \ + speed "${SLOWDOWN}" \ + gain -n \ + channels 2 +} + +function encode_audio { + outfile="$1" + exec lame \ + --preset standard \ + - \ + "${outfile}" +} + +function convert_file { + infile="$1" + outfile="$2" + tmpdir="$(mktemp -d "${TMPDIR:-/var/tmp}/pal-XXXXXXXX")" + audiofile="${tmpdir}/audio.mp3" + + extract_audio "${infile}" | slow_audio | encode_audio "${audiofile}" + mux_replace_audio "${infile}" "${audiofile}" "${outfile}" + + rm -rf "$tmpdir" +} + + destdir="$1" -infile="$2" -outfile="$destdir/$(basename "$infile")" -tmpdir="$(tempfile -p 'pal-')" -rm "$tmpdir" - -if [ -f "$outfile" ]; then - echo "Not overwriting $outfile" - exit 0 -fi +shift + +for infile in "$@"; do + outfile="$destdir/$(basename "$infile")" -set -x -mkdir "$tmpdir" -mkvextract tracks "$infile" 2:"${tmpdir}/audio" -mplayer -ao pcm:file="${tmpdir}/audio.wav" -vo null "${tmpdir}/audio" -sox "${tmpdir}/audio.wav" "${tmpdir}/audio-fixed.wav" speed "${SLOWDOWN}" gain -n -lame --preset standard "${tmpdir}/audio-fixed.wav" "${tmpdir}/audio.mp3" -mkvmerge -o "${outfile}" --default-duration "1:${FORCEFPS}fps" --no-audio "$infile" "${tmpdir}/audio.mp3" + if [ -f "$outfile" ]; then + echo "Not overwriting $outfile" + continue + fi -rm -rf "$tmpdir" + convert_file "$infile" "$outfile" +done