X-Git-Url: https://code.delx.au/transcoding/blobdiff_plain/48a35c1d3b975e17d4fd002145855c561cbddd46..47ae9da213b0d1ac8c5a5da0ab327dadab761490:/fix-pal-speedup diff --git a/fix-pal-speedup b/fix-pal-speedup index af1d30d..27ddd48 100755 --- a/fix-pal-speedup +++ b/fix-pal-speedup @@ -1,37 +1,88 @@ #!/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 { + local infile="$1" + local audiofile="$2" + local outfile="$3" + + local trackid="$(mkvmerge -i "$infile" | grep 'Track ID.*video' | sed 's/^Track ID \(.\):.*$/\1/')" + mkvmerge -o "${outfile}" --default-duration "${trackid}:${FORCEFPS}fps" --no-audio "$infile" "$audiofile" +} + +function extract_audio { + local infile="$1" + local outfile="$2" + + mplayer \ + -noconfig all \ + -novideo \ + -ao "pcm:waveheader:file=${outfile}" \ + "$infile" +} + +function slow_audio { + local infile="$1" + local outfile="$2" + + sox \ + --temp "$tmpdir" \ + "$infile" \ + -t wav \ + "$outfile" \ + speed "${SLOWDOWN}" \ + gain -n +} + +function encode_audio { + local infile="$1" + local outfile="$2" + + lame \ + --preset standard \ + "${infile}" "${outfile}" +} + +function convert_file { + local infile="$1" + local outfile="$2" + local audio1="${tmpdir}/audio1.wav" + local audio2="${tmpdir}/audio2.wav" + local audio3="${tmpdir}/audio3.mp3" + + extract_audio "${infile}" "${audio1}" + slow_audio "${audio1}" "${audio2}" + encode_audio "${audio2}" "${audio3}" + mux_replace_audio "${infile}" "${audio3}" "${outfile}" +} + + 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" + tmpdir="$(mktemp -d "${TMPDIR:-/var/tmp}/pal-XXXXXXXX")" + convert_file "$infile" "$outfile" + rm -rf "$tmpdir" +done