Penguin
Diff: PerfectDVDRips
EditPageHistoryDiffInfoLikePages

Differences between current version and predecessor to the previous major change of PerfectDVDRips.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 31 Last edited on Wednesday, February 14, 2007 9:38:09 am by BenStaz
Older page: version 30 Last edited on Monday, January 15, 2007 5:46:21 pm by BenStaz Revert
@@ -93,369 +93,10 @@
 SPACE pause 
 f vo_fullscreen 
 </verbatim> 
  
-So Here It Is:  
-  
-<verbatim>  
-# !/bin/bash  
-  
-calculate_ar_error()  
-{  
- resized_ar=$(echo "scale=10;$1/$2" | bc )  
- ar_error=$(echo "scale=4; (($crop_ar - $resized_ar) / $resized_ar) * 100" | bc )  
-}  
-  
-function best_mult16()  
-{  
- calculate_ar_error $1 $2  
- ar_error_1=$ar_error  
- calculate_ar_error $1 $3  
- ar_error_2=$ar_error  
-  
- echo "AR Error $1 x $2 : ${ar_error_1}%"  
- echo "AR Error $1 x $3 : ${ar_error_2}%"  
-  
- if [ `echo "${ar_error_2#-} < ${ar_error_1#-}" | bc ` -eq 1 ]; then  
- best_error=$ar_error_2  
- return ;  
- else  
- best_error=$ar_error_1  
- return 1;  
- fi  
-}  
-  
-function find_best_height()  
-{  
- #Find Closest Multiple of 16  
- perfect_height=$(echo "scale=10; $1 / $crop_ar" | bc)  
- round_down_mult16=$(echo "$perfect_height - ($perfect_height % 16)" | bc)  
- round_down_mult16=${round_down_mult16%%.*}  
- best_mult16 $1 $round_down_mult16 $(echo "$round_down_mult16 + 16" | bc)  
-  
- if [ $? -eq 0 ]; then  
- best_height=$(expr $round_down_mult16 + 16)  
- else  
- best_height=$round_down_mult16  
- fi  
- echo "The Best height out of $round_down_mult16 and $(expr $round_down_mult16 + 16) is $best_height"  
-}  
-  
-echo "Welcome to Staz's XviD Video Encoder"  
-echo "At the moment this can only be used to encode PAL DVD Movies to XviD"  
-echo "Email any bugs/fixes to ben.staz@gmail.com"  
-echo "-------------------------------------"  
-  
-#Create Constants To Be Used In Script (Could use 'readonly foo==moo', 'declare -r foo=moo' or 'typeset -r foo=moo'  
-readonly CD_SIZE=716800  
-readonly PAL_MIN_RUNTIME_PER_CD=6000  
-readonly NTSC_MIN_RUNTIME_PER_CD=5220  
-readonly FILM_MIN_RUNTIME_PER_CD=6300  
-  
-#First argument supplied is the directory containing the vobs.  
-if [ -d $1 ]; then  
- vob_dir=$1;  
-  
- if [ "${vob_dir ::1}" != " /" ]; then  
- echo "This vob dir is relevant to the PWD"  
- if [ "$vob_dir" == "." ]; then  
- vob_dir=${PWD} /  
- else  
- vob_dir=${PWD}/${vob_dir#./}  
- fi  
- else  
- echo "The vob dir is a full path."  
- fi  
-  
- echo "Vob Dir : $vob_dir";  
- echo "Vob Files:"  
-  
- for i in ${vob_dir}/*.[Vv][Oo][Bb] ;  
- do  
- echo $i;  
- done;  
-  
-  
- #Check if the supplied vob directory is a mounted DVD.  
- #The 2> /dev/null part avoids the 'unary operator' message when it is not a mounted DVD dir.  
-  
- if [ `df -T $vob_dir | awk '$2 == "udf" || $2 == "iso9660" {print ""}'` -eq 0 ]; then  
- echo "This is a mounted DVD. Will use ${PWD}/ as the working directory"  
- working_dir=${PWD}/  
- else  
- echo "Will use $vob_dir as the working directory"  
- working_dir=$vob_dir  
- fi 2> /dev/null  
-else  
- echo "Error : You did not supply a valid directory!"  
-fi;  
-  
-shift;  
-#Set the default arguments (If user does not specify otherwise)  
-max_ar_error=3  
-  
-  
-echo "-------------------------------------"  
-echo " User Chosen Options"  
-echo "-------------------------------------"  
-  
-#Following variables are used to make sure the two compulsory options (title and output) are supplied.  
-t=1  
-o=1  
-  
-while test "$1" != "";  
-do  
- case $1 in  
- --list-titles|-l)  
- echo "-------------------------------------"  
- echo " Listing Titles"  
- echo "-------------------------------------"  
- lsdvd $vob_dir 2> /dev/null  
- echo "Choose a Title by using --title <n>"  
- echo "-------------------------------------"  
- exit  
- ;;  
- --title|-t)  
- #TODO: WE WILL BE ABLE TO SUPPLY MULTIPLE TITLES HERE  
- t=  
- echo "Chosen Title : $2"  
- title=$2  
- tmp=$(lsdvd -v $vob_dir 2> /dev/null )  
- length=$(echo "$tmp" | egrep -o '[-9]{2}:[-9]{2}:[-9]{2}' | sed -n "${title}p")  
- ar=$(echo "$tmp" | egrep -o '[-9]+/[-9]+' | sed -n "${title}p")  
- echo "Title Length : $length"  
- echo "Title AR : $ar"  
- length_seconds=$(echo $length | { IFS='[:.]'; read h m s; echo "(${h##} * 3600) + (${m##} * 60) + ${s##}" | bc; } )  
- echo "Length in Seconds : $length_seconds"  
- shift  
- ;;  
- --max-ar-error|-e)  
- echo "Max AR % Error : ${2}%"  
- max_ar_error=$2  
- shift  
- ;;  
- --output|-o)  
- o=;  
- echo "Output File : $2"  
- output_file=$2  
- output_name=${2%.[Aa][Vv][Ii]}  
- shift  
- ;;  
- *)  
-  
- echo "Invalid Argument : $1"  
- echo "Will print usage in the future"  
- exit 1  
- ;;  
- esac  
- shift  
-done  
-  
-#Check that both the title and output options have been supplied.  
-  
-if [ "$t" -eq 1 -o "$o" -eq 1 ] ; then  
- #Uh oh something is missing  
- echo "-------------------------------------"  
- echo "ERRORS!"  
- if [ "$t" -eq 1 ]; then  
- echo "You need To specify a Title. Usage : -t <title>"  
- fi  
- if [ "$o" -eq 1 ]; then  
- echo "You need to specify an Output File. Usage : -o <output file>"  
- fi  
- echo "-------------------------------------"  
- exit  
-fi  
-  
-echo "-------------------------------------"  
-echo " Source Information"  
-echo "-------------------------------------"  
-  
-#Calculate Source Video Format/Resolution/Framerate by parsing lsdvd's output.  
-  
-video_format=$(lsdvd $vob_dir -v 2> /dev/null | egrep -o '(PAL|NTSC)' | tail -1 )  
-echo "Video Format......: $video_format"  
-  
-case $video_format in  
- PAL)  
- frame_rate=25  
- source_width=720  
- source_height=576  
- min_runtime_per_cd=$PAL_MIN_RUNTIME_PER_CD  
- ;;  
- NTSC)  
- frame_rate=29 .97  
- source_width=720  
- source_height=480  
- min_runtime_per_cd=$NTSC_MIN_RUNTIME_PER_CD  
- ;;  
-esac  
-  
-echo "Source Resolution .: $source_width x $source_height"  
-echo "Source FrameRate ..: $frame_rate"  
-  
-echo "-------------------------------------"  
-echo " Crop Information"  
-echo "-------------------------------------"  
-  
-#Calculate Cropping Values /Resolution based on parsed mplayer output.  
-crop_values=$(mplayer -dvd-device $vob_dir dvd: //${title} -aid 128 -vf rectangle=720:576 -input conf=cropping.conf 2> /dev/null | egrep -o '[-9]+:[-9]+:[-9]+:[-9]+' | tail -1 )  
-  
-echo "Crop Vals : $crop_values"  
-  
-left_right_crop=$((source_width - $(echo "$crop_values" | cut -d ':' -f 1) ));  
-top_bottom_crop=$((source_height - $(echo "$crop_values" | cut -d ':' -f 2) ));  
-  
-echo "Total Left/Right Cropping : $left_right_crop"  
-echo "Total Top/Bottom Cropping : $top_bottom_crop"  
-  
-crop_ar=$(echo "scale=10;(($source_width - $left_right_crop) / $source_width) * ($source_height / ($source_height - $top_bottom_crop)) * ($ar)" | bc )  
-echo "Crop AR : $crop_ar"  
-found_a_res=  
-  
-if [ "$ar" == "16/9" ]; then  
- for width in $(seq 672 -16 512) ;  
- do  
- echo "-------------------------------------"  
- echo "Horizontal Resolution : $width"  
- echo "-------------------------------------"  
- find_best_height $width  
- if [ `echo "${best_error#-} < $max_ar_error" | bc` -eq 1 ]; then  
- final_width=$width  
- final_height=$best_height  
- found_a_res=1;  
- break;  
- fi  
- done;  
-elif [ "$ar" == "4/3" ]; then  
- for width in $(seq 576 -16 448) ;  
- do  
- echo "-------------------------------------"  
- echo "Horizontal Resolution : $width"  
- echo "-------------------------------------"  
- find_best_height $width  
- if [ `echo "${best_error#-} < $max_ar_error" | bc` -eq 1 ]; then  
- final_width=$width  
- final_height=$best_height  
- found_a_res=1;  
- break;  
- fi  
- done;  
-fi  
-  
-#Check We Have Finally Came Up With a Resolution  
-  
-if [ $found_a_res -eq 1 ]; then  
- echo "The Final Resolution is : $final_width x $final_height"  
- echo "The AR Error Is: ${best_error}%"  
-else  
- echo "Couldn't Find A Resolution!"  
- echo "Try Lowering the max AR Error %"  
-fi  
-  
-echo "-------------------------------------"  
-  
-#Work Out How Many CDS Our Encode Will Take Up  
-  
-if [ "$length_seconds" -le "$min_runtime_per_cd" ]; then  
- num_cds=1;  
-else  
- num_cds=$(( ($length_seconds / $min_runtime_per_cd) + 1 ));  
-fi  
-  
-echo "Number of CDS : $num_cds"  
-if [ $num_cds -eq 1 ]; then  
- #Now We Rip The DVD Audio Stream To PCM .wav (Uncompressed Audio)  
- mplayer -dvd-device $vob_dir dvd://${title} -aid 128 -vo null -vc dummy -mc 0 -ao pcm:file=${working_dir}${output_name}.wav  
- #Use Lame to Encode to VBR MP3 (-V 3 --vbr-new seems to result in a bitrate close to 128 which I am after)  
- lame -h -V 3 --vbr-new ${working_dir}${output_name}.wav ${working_dir}${output_name}.mp3  
-  
- #Time To Apply Some Gain Or Else Our Movie Is Far Too Quiet!  
- #The switches will make sure that mp3gain applies the maximum gain possible WITHOUT any clipping  
- mp3gain -r -k ${working_dir}${output_name}.mp3  
- audio_format=mp3  
-else  
- echo "We are ripping to AC3 Audio NOW...."  
- tmp=$(mencoder -dvd-device $vob_dir dvd://${title} -aid 128 -oac copy -of rawaudio -ovc copy -mc 0 -o ${working_dir}${output_name}.ac3 2> /dev/null | grep 'audio stream: ' | grep -o '(.*)' )  
- #I DONT KNOW THE OUTPUT OF MPLAYER IF THE AUDIO STREAM IS MONO. WILL HAVE TO FIND A DVD WITH A MONO AUDIO STREAM.  
- num_channels=$(echo "$tmp" | sed -e 's/(5.1)/6/' -e 's/(stereo)/2/' )  
- echo "Number Of Channels : $num_channels"  
- audio_format=ac3  
-fi  
-  
-#Time To Calculate Overhead  
-  
-echo "-------------------------------------"  
-echo "Overhead Calculations"  
-echo "-------------------------------------"  
-  
-if [ "$audio_format" == "mp3" ]; then  
- frames_per_chunk=1  
- audio_overhead=$(echo "scale=10; ($length_seconds*1000) / (24*$frames_per_chunk)" | bc)  
- audio_size=$(du -k ${working_dir}${output_name}.mp3 | cut -f 1)  
-elif [ "$audio_format" == "ac3" ]; then  
- frames_per_chunk=2  
- audio_overhead=$(echo "scale=10; ($length_seconds*1000) / (32*$frames_per_chunk)" | bc)  
- audio_size=$(du -k ${working_dir}${output_name}.ac3 | cut -f 1)  
-fi  
-  
-echo "Audio Overhead : ${audio_overhead%%.*}"  
-  
-  
-if [ $num_cds -ge 3 ]; then  
- #We will get an OPEN-DML .avi (with or without a legacy index?? will have to ask the mplayer devs)  
- overhead_kilobytes=$(echo "scale=10; (16 * $audio_overhead) / 1024" | bc )  
-else  
- #We will get a standard avi output.  
- echo "STANDARD AVI OUTPUT"  
- overhead_kilobytes=$(echo "scale=10; (24 * $audio_overhead) / 1024" | bc )  
-fi  
-  
-echo "Total Overhead (Kilobytes) : ${overhead_kilobytes%.*}"  
-echo "-------------------------------------"  
-  
-echo "Audio Size : $audio_size Kb's"  
-video_size=$(((num_cds*CD_SIZE) - audio_size - ${overhead_kilobytes%%.*} ))  
-echo "Video Size : $video_size kb's"  
-  
-#We Now Have All The Info Needed To Start The XviD Encode.  
-#Note: -nosound disables processing the audio stream.  
-  
-#First Pass  
-mencoder -dvd-device $vob_dir dvd://${title} -nosound -vf crop=${crop_values},scale=${final_width}:${final_height} -sws 9 -ovc xvid -passlogfile ${working_dir}${output_name}_2pass.log -xvidencopts pass=1:quant_type=h263:nogmc:noqpel:bitrate=-${video_size} -mc 0 -noskip -o /dev/null  
-  
-pass1_filesize=$(echo "$(cat ${working_dir}${output_name}_2pass.log | awk '$6 ~ "^[-9]" { total += $6; print $total} END { print total } ') / 1024" | bc)  
-echo "At a constant quantizer value of 2, the output filesize is $pass1_filesize Kb's in size"  
-  
-#Here we can easily change the XviD encoding options.  
-xvidencopts=pass=2:quant_type=h263:min_pquant=1:min_iquant=1:min_bquant=1:nogmc:noqpel:bitrate=-${video_size}  
-  
-#Second Pass:  
-mencoder -dvd-device $vob_dir dvd://${title} -nosound -vf crop=${crop_values},scale=${final_width}:${final_height} -sws 9 -ovc xvid -passlogfile ${working_dir}${output_name}_2pass.log -xvidencopts $xvidencopts -mc 0 -noskip -o ${working_dir}${output_name}_nosound.avi  
-  
-#ITS MUXING TIME!!!  
-  
-if [ "$audio_format" == "mp3" ]; then  
- mencoder ${working_dir}${output_name}_nosound.avi -ovc copy -oac copy -audiofile ${working_dir}${output_name}.mp3 -mc 0 -noskip -o ${working_dir}${output_name}.avi  
-else  
- #GET AC3 INFO AND THEN MUX  
- midentify ${working_dir}${output_name}.ac3 | sed -ne '/ID_AUDIO_BITRATE/p' -ne '/ID_AUDIO_RATE/p' | head -2 | awk -F '=' '{ print $2 }' | { read audio_bitrate; read audio_rate; mencoder ${working_dir}${output_name}_nosound.avi -ovc copy -oac copy -audiofile ${working_dir}${output_name}.ac3 -audio-demuxer 20 -rawaudio format=0x2000:channels=${num_channels}:rate=${audio_rate}:bitrate=${audio_bitrate} -mc 0 -noskip -o ${working_dir}${output_name}.avi; }  
-fi  
-  
-#If We Encoded To 2CDS+ then we will want to split the encoded video into the appropriate number of parts.  
-  
-if [ "$num_cds" -gt 1 ]; then  
- #Split into $num_cds parts  
- avisplit -i ${working_dir}${output_name}.avi -o ${working_dir}${output_name}-cd -s 700  
- counter=1;  
- for i in ${working_dir}${output_name}-cd-000[-9].avi ;  
- do  
- mv $i ${working_dir}${output_name}-cd${counter}.avi;  
- counter=$((counter+1));  
- done;  
-fi  
-exit  
-< /verbatim>  
+!Stazenc Script  
+http ://source.meta .net .nz /svn /staz /stazenc /trunk /stazenc  
  
 !!Example of Usage 
  
 *stazenc Armageddon/ -mar 2 -t 1 -o armageddon.avi