#!/bin/sh # parameters: # 1: input file # 2: output file prefix # 3: crop override (w:h:x:y) # 4: interlace override (forcefilm, forceint, forcedeint) # 5: additional video filters (such as scale=x:y) # 6: video bitrate override # 7: audio quality override # 8: set to "mono" to force mono audio # base bitrate (720x480) bitrate=1400 # audio quality (1-10, default=3) aq=3 if [ "${7}" != "" ] then aq=${7} fi # extract, normalize, and encode audio if [ \! -e "${2}".ogg ] then echo -n "decoding audio..." mplayer -ac ac3, -ao pcm:file="${2}".wav -vo null "${1}" 2>&1 >/dev/null echo echo -n "normalizing audio..." if [ "${8}" == "mono" ] then c="-c 1" else c="" fi sox "${2}".wav ${c} "`echo ${2} | sed 's/\./_/g'` (norm)".wav vol `sox "${2}".wav -e stat -v 2>&1 | awk '{print .95*$0}'` echo echo -n "reencoding audio..." # faac -q ${aq} --mpeg-vers 4 --obj-type Main -o "${2}".aac "`echo ${2} | sed 's/\./_/g'` (norm)".wav 2>&1 >/dev/null oggenc -q ${aq} -o "${2}".ogg "${2} (norm)".wav echo # rm "${2}".wav "`echo ${2} | sed 's/\./_/g'` (norm)".wav else echo "skipping audio encoding...remove ${2}.ogg to reencode" fi # get crop parameter, framesize, framerate, & bitrate echo -n "analyzing source video..." if [ "${5}" == "" ] then mplayer -ac ac3, -frames 900 -vo null -ao null -vf cropdetect "${1}" 2>/dev/null >"${2}".stats.txt else mplayer -ac ac3, -frames 900 -vo null -ao null -vf ${5},cropdetect "${1}" 2>/dev/null >"${2}".stats.txt fi if [ "${3}" != "" ] then crop="crop=${3}" else crop=`grep '[CROP]' "${2}".stats.txt | tail -1 | sed "s/.*crop=/crop=/;s/).*//"` fi x=`echo $crop | sed "s/crop=//;s/\(.*\):\(.*\):\(.*\):\(.*\)/\1/"` y=`echo $crop | sed "s/crop=//;s/\(.*\):\(.*\):\(.*\):\(.*\)/\2/"` bitrate=`echo $bitrate $x $y | awk '{print int($1*$2*$3/720/480+.5)}'` if [ "`grep demux_mpg "${2}".stats.txt | grep 24000`" != "" ] then frameratenum=24000 filters="pullup,softskip," encopts="" else frameratenum=30000 filters="" encopts="interlaced:" fi if [ "${4}" == "forcefilm" ] then frameratenum=24000 filters="pullup,softskip," encopts="" fi if [ "${4}" == "forceint" ] then frameratenum=30000 filters="" encopts="interlaced:" fi if [ "${4}" == "forcedeint" ] then frameratenum=30000 filters="yadif," encopts="" fi rm "${2}".stats.txt echo "${x}x${y} ${frameratenum}/1001 fps ${bitrate} kbps" sleep 5 if [ "${5}" != "" ] then filters="${5},${filters}" fi if [ "${6}" != "" ] then bitrate="${6}" fi # 1st pass video encode if [ \! -e "${2}.log" ] then echo -n "doing 1st-pass video encode..." mencoder -ac ac3, -passlogfile "${2}.log" -vf ${filters}${crop},harddup -ofps ${frameratenum}/1001 -ovc x264 -x264encopts ${encopts}bitrate=${bitrate}:pass=1:turbo=2:keyint=240:bframes=3:direct_pred=auto:subq=1:frameref=1:b_pyramid:threads=auto -oac copy -o /dev/null "${1}" 2>&1 >/dev/null echo else echo "skipping 1st-pass video encoding...remove divx2pass.log to repeat" fi # 2nd pass video encode if [ \! -e "${2}".264 ] then echo -n "doing 2nd-pass video encode..." mencoder -ac ac3, -passlogfile "${2}.log" -vf ${filters}${crop},harddup -ofps ${frameratenum}/1001 -ovc x264 -x264encopts ${encopts}bitrate=${bitrate}:pass=2:turbo=2:keyint=240:bframes=3:direct_pred=auto:frameref=3:me=umh:partitions=all:b_pyramid:threads=auto -oac copy -of rawvideo -o "${2}".264 "${1}" 2>&1 >/dev/null echo else echo "skipping 2nd-pass video encoding...remove ${2}.264 to reencode" fi # mux if [ $frameratenum -eq 24000 ] then (echo "# timecode format v1"; echo "assume 23.976") >"${2}".timecode else (echo "# timecode format v1"; echo "assume 29.97") >"${2}".timecode fi if [ \! -e "${2}".mkv ] then echo -n "muxing audio & video..." mkvmerge -o "${2}".mkv --timecodes 0:"${2}".timecode "${2}".264 "${2}".ogg 2>&1 >/dev/null echo else echo "skipping muxing...remove ${2}.mkv to remux" fi rm "${2}".timecode