All pastes #91082 Raw Edit

dvd2h264

public shellscript v1 · immutable
#91082 ·published 2006-07-18 08:54 UTC
rendered paste body
# By: Ahmad Khayyat <akhayyat@gmail.com># TODO: Check for required tools# TODO: Automate -ofps & -vf for interlaced, telecined, progressive, ... etc.# TODO: Handle automatic detection failure# TODO: Rip subtitlesDVD_DEVICE=/home/ahmad/downloads/mov/isoOUTPUT_FILE_BASE=piratesTITLE="Pirates of the Caribbean"YEAR=2003# Compression QualityCQ=0.16#SCALE=688:384FPS=24000/1001SS=50FRAMES=1000# To rip a short sample clip rather than the whole title,# uncomment the following line:DURATION_OPTS="-ss $SS -frames $FRAMES"AUDIO_FILE_BASE=`if [ "$DURATION_OPTS" ] ; then echo part; else echo audio; fi`echoecho "############################################################"echoif [ "$DURATION_OPTS" ] ; then  echo "Ripping a $FRAMES frames sample starting at $SS seconds"else  echo "Ripping the whole title"fiechoecho "############################################################"function CALCULATE_RESOLUTION() {        Y=$(($Y_FACTOR * 16))        echo -e "Y_FACTOR = $Y_FACTOR\tY = $Y"        X_FACTOR=`echo "($Y * $AR / 16)" | bc -l | cut -d. -f1`        X=$(($X_FACTOR * 16))        echo -e "X_FACTOR = $X_FACTOR\tX = $X"}function ADJUST_X() {  RATIO_1=`echo "$X/$Y/$AR" | bc -l`  if [[ $RATIO_1 > 1 ]]; then    X_2=$(($X - 16));    RATIO_2=`echo "$AR/$X_2*$Y" | bc -l`  else    X_2=$(($X + 16));    RATIO_1=`echo "$AR/$X*$Y" | bc -l`    RATIO_2=`echo "$X_2/$Y/$AR" | bc -l`  fi  echo -e "X = $X\tY=$Y\tAspect ratio error = $RATIO_1"  echo -e "X = $X_2\tY=$Y\tAspect ratio error = $RATIO_2"  if [[ $RATIO_2 < $RATIO_1 ]]; then    X=$X_2;  fi}# Extract chaptersechosleep 3;echo "Extracting chapters.."echo "====================="sleep 1;dvdxchap $DVD_DEVICE > chapters.txtechoecho "Done extracting chapters"echoecho "############################################################"# Test for existing audio file for complete ripsif [[ ! "$DURATION_OPTS" && -f audio.ogg ]] ; then  echo "############################################################"  echo  echo "audio.ogg found.. Not ripping audio"  echo  echo "############################################################"else  # Rip audio to WAVechosleep 3;echo "Extracting audio.."echo "=================="sleep 1;mplayer dvd://1 \-dvd-device $DVD_DEVICE \-ao pcm:file=$AUDIO_FILE_BASE.wav:fast \-vc null \-vo null \-alang en \$DURATION_OPTS 2>/dev/nullechoecho "Done extracting aduio"echoecho "############################################################"# Normalize audioechosleep 3;echo "Normalizing audio.."echo "==================="sleep 1;normalize-audio $AUDIO_FILE_BASE.wavechoecho "Done normalizing audio"echoecho "############################################################"# Encode audioechosleep 3;echo "Encoding audio.."echo "================"sleep 1;oggenc -q4 $AUDIO_FILE_BASE.wav -o $AUDIO_FILE_BASE.ogg#lame --vbr-new -h -m j $AUDIO_FILE_BASE.wav $AUDIO_FILE_BASE.mp3#lame --preset fast medium $AUDIO_FILE_BASE.wav $AUDIO_FILE_BASE.mp3rm $AUDIO_FILE_BASE.wavechoecho "Done encoding audio"echoecho "############################################################"fi# Continue here if audio.ogg was found# Detect crop parametersechoecho "Detecting crop parameters.."echo "==========================="sleep 1;CROP=`mplayer dvd://1 \-dvd-device $DVD_DEVICE \-vf cropdetect \-nosound \-benchmark \-ss 200 \-frames 300 \2>/dev/null \| awk -F'[=)]' '\/-vf crop=/ \{ \if (crop == $2) count++; \else count = 1; \crop = $2 \} \END \{ if (count > 200) print crop; else print UNKNOWN}'`if [ $CROP == UNKNOWN ] ;then echo "Cannot determine crop parameters.. Exiting"; exit;else echo "Using crop=$CROP";fiechoecho "Done detecting crop parameters"echoecho "############################################################"# Calculate bitrateechosleep 3;echo "Calculating bitrate.."echo "====================="sleep 1;if [ -f audio.ogg ]; then  LENGTH=`mplayer -dvd-device $DVD_DEVICE dvd://1 -identify -frames 0 2>/dev/null | awk -F'[=.]'  '/ID_LENGTH=/ {print $2}'`  echo "Movie length: $LENGTH seconds"  AUDIO_SIZE=`ls -l audio.ogg | awk '{print $5}'`  echo "Audio size: $(($AUDIO_SIZE/1024/1024)) MB"  BITRATE=$(((700*1024*1024-$AUDIO_SIZE)*8/1000/$LENGTH))else  echo "audio.ogg not found.. Using default bitrate"  BITRATE=1000fiecho "Using bitrate=$BITRATE kb/s"echoecho "Done calculating bitrate"echoecho "############################################################"# Calculate resolutionechosleep 3echo "Calculating resolution.."echo "========================"sleep 1;if [ $SCALE ] ; then  echo "Using preset SCALE=$SCALE";else  WIDTH=`echo $CROP | cut -d: -f1`  HEIGHT=`echo $CROP | cut -d: -f2`  AR=`echo "($WIDTH * (16/9 / 1.5)) / $HEIGHT" | bc -l`  Y_FACTOR=`echo "sqrt(1000*$BITRATE/25/$AR/$CQ)/16" | bc -l | cut -d. -f1`  CALCULATE_RESOLUTION;  while [[ $X > $WIDTH ]] ; do    echo "X too big";    Y_FACTOR=$(($Y_FACTOR - 1))    CALCULATE_RESOLUTION;  done  ADJUST_X;  SCALE=$X:$Y  echo "Using scale=$SCALE"fiechoecho "Done calculating resolution"echoecho "############################################################"# Encode video - first passechosleep 3;echo "Encoding video - first pass.."echo "============================="sleep 1;rm -f *.logmencoder dvd://1 \-dvd-device $DVD_DEVICE \-ofps $FPS \-alang en \-oac copy \-o /dev/null \-vf pp=ac,crop=$CROP,scale=$SCALE,hqdn3d=2:1:2 \-ovc x264 \-x264encopts bitrate=$BITRATE:pass=1:subq=7:frameref=8:4x4mv:bframes=4:weight_b:b_pyramid:mixed_refs:nofast_pskip:brdo:bime:direct_pred=3:trellis=2:me=3:cqm=jvt \$DURATION_OPTSechoecho "Done encoding video - first pass"echoecho "############################################################"# Encode video - second passechosleep 3;echo "Encoding video - second pass.."echo "=============================="sleep 1;mencoder dvd://1 \-dvd-device $DVD_DEVICE \-ofps $FPS \-alang en \-oac copy \-info name="$TITLE" \-o $OUTPUT_FILE_BASE-ac3.avi \-vf pp=ac,crop=$CROP,scale=$SCALE,hqdn3d=2:1:2 \-ovc x264 \-x264encopts bitrate=$BITRATE:pass=2:subq=7:frameref=8:4x4mv:bframes=4:weight_b:b_pyramid:mixed_refs:nofast_pskip:brdo:bime:direct_pred=3:trellis=2:me=3:cqm=jvt \$DURATION_OPTSechoecho "Done encoding video - second pass"echoecho "############################################################"# Mux audio and videoechosleep 3;echo "Muxing audio & video.."echo "======================"sleep 1;#mencoder \#-oac copy \#-ovc copy \#-o $OUTPUT_FILE_BASE-mp3.avi \#-audiofile $AUDIO_FILE_BASE.mp3 \#$OUTPUT_FILE_BASE-ac3.aviogmmerge -o $OUTPUT_FILE_BASE.ogg chapters.txt -c "LANGUAGE=English" $AUDIO_FILE_BASE.ogg -c "TITLE=$TITLE" -c "YEAR=$YEAR" --noaudio $OUTPUT_FILE_BASE-ac3.avi#mkvmerge --default-language eng --chapters chapters.txt --title $TITLE -o $OUTPUT_FILE_BASE.mkv --noaudio $OUTPUT_FILE_BASE.avi $AUDIO_FILE_BASE.ogg#rm $OUTPUT_FILE_BASE-ac3.aviechoecho "############################################################"echoecho "Done! Enjoy"echoecho "############################################################"