371 lines
12 KiB
Bash
Executable File
371 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# DVD2DivX
|
|
#
|
|
# (C) 2004-2009 Arnaud G. Gibert
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# $RCSfile: dvd2divx,v $
|
|
# $Revision: 1.10 $
|
|
# $Name: $
|
|
# $Date: 2009/10/20 07:08:49 $
|
|
# $Author: agibert $
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# This file is part of DVD2DivX
|
|
#
|
|
# DVD2DivX is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public Licence as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# DVD2DivX is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with DVD2DivX; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
# Usage exemple
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# #!/bin/bash
|
|
# # divx_root divx_title input dvd_device dvd_title chapter angle alang slang audio abr asrate stereo volume sub video vcodec vqual vbr crop xsize aspect deint threads vopts
|
|
# #---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
# dvd2divx cobra 1 dbo /dev/cdrom1 10 1- 1 fr - - - - - - - - - - - - - - - -
|
|
# dvd2divx cobra 1 b - - - - - - fvp 128 - n 10 - 2a xvid 3 1000 - 480 4/3 y 4 cartoon
|
|
|
|
|
|
|
|
divx_root=${1} #
|
|
divx_title=${2} #
|
|
#------------------------------------------------------------------------------
|
|
input=${3} # d|db|dbo|b (d: read directly from disk | db: bufferize and continue | dbo: bufferize only | b: read from a preexisting buffer)
|
|
dvd_device=${4} # -|/dev/dvd|...
|
|
title=${5} #
|
|
chapter=${6} #
|
|
angle=${7} #
|
|
alang=${8} # -|en|fr|...|0|1|... (lang or id)
|
|
slang=${9} # -|en|fr|...|0|1|... (lang or id)
|
|
#------------------------------------------------------------------------------
|
|
audio=${10} # ap|avp|fvp|n (ap: compress audio during audio pass | avp: compress audio during all video pass | fvp: compress audio during final video pass | no: use input audio stream)
|
|
abr=${11} #
|
|
asrate=${12} # -|xxx (resample audio)
|
|
stereo=${13} # y|n
|
|
volume=${14} # -|... # other acodec options
|
|
#------------------------------------------------------------------------------
|
|
sub=${15} # -|f|o (-: no subtitles | f: file subtitles | o: OSD subtitles)
|
|
#------------------------------------------------------------------------------
|
|
video=${16} # 1|2a|2s|n (1: compress video in 1 pass | 2a: compress video in 2 assymetric passes | 2s: compress video in 2 symetric passes | no: use input video stream)
|
|
vcodec=${17} # -|lavc|xvid|x264
|
|
vquality=${18} # 0|1|2|3 (0: realtime | 1: fast | 2: High quality | 3: very high quality)
|
|
vbr=${19} #
|
|
crop=${20} # -|width:height:x:y
|
|
xsize=${21} # -|...
|
|
aspect=${22} # -|4/3|16/9|...
|
|
deint=${23} # y|n
|
|
threads=${24} # -|1..
|
|
vopts=${25} # -|... # other vcodec options
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
tmpdir_name=$divx_root-$divx_title.tmp
|
|
divx_name=../$divx_root-$divx_title.avi
|
|
tmp_name=../$divx_root-$divx_title.vob
|
|
out_name=../$divx_root-$divx_title
|
|
|
|
echo "DivX: [$divx_name] title: ($title)"
|
|
echo "Input: [$input] device: [$dvd_device] title: ($title) chapter: ($chapter) angle: ($angle) alang: ($alang) slang: ($slang)"
|
|
echo "Audio: [$audio] abr: ($abr) asrate: ($asrate) stereo: ($stereo) volume: (${volume})"
|
|
echo "Sub: [$sub]"
|
|
echo "Video: [$video] vcodec: [$vcodec] vquality: [$vquality] vbr: ($vbr) crop: ($crop) xsize: ($xsize) aspect: ($aspect) deint: ($deint) threards: ($threads) vopts: [${vopts}]"
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# DVDRip Setup
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
shopt -s extglob
|
|
|
|
if [ "$dvd_device" != "-" ]
|
|
then
|
|
device_opt="-dvd-device $dvd_device"
|
|
fi
|
|
|
|
if [ "$sub" == "-" ]
|
|
then
|
|
slang_opt=""
|
|
else
|
|
if [ "$slang" != "-" ]
|
|
then
|
|
if [[ "$slang" == +([[:digit:]]) ]]
|
|
then
|
|
slang_opt="-sid $slang"
|
|
else
|
|
slang_opt="-slang $slang"
|
|
fi
|
|
|
|
if [ "$sub" == "f" ]
|
|
then
|
|
slang_opt+=" -vobsubout $out_name -vobsuboutid $slang -vobsuboutindex 0"
|
|
else
|
|
if [ "$sub" == "o" ]
|
|
then
|
|
slang_opt+=" -ass"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ "$alang" != "-" ]
|
|
then
|
|
if [[ "$alang" == +([[:digit:]]) ]]
|
|
then
|
|
alang_opt="-aid $alang"
|
|
else
|
|
alang_opt="-alang $alang"
|
|
fi
|
|
else
|
|
alang_opt=""
|
|
fi
|
|
|
|
|
|
read_dvd_opt="$device_opt dvd://$title -chapter $chapter -dvdangle $angle $alang_opt $slang_opt"
|
|
read_buf_opt="$tmp_name"
|
|
|
|
case "$input"
|
|
in
|
|
d)
|
|
read_opt2="${read_dvd_opt}"
|
|
;;
|
|
|
|
db)
|
|
read_opt1="${read_dvd_opt}"
|
|
read_opt2="${read_buf_opt}"
|
|
;;
|
|
|
|
dbo)
|
|
read_opt1="${read_dvd_opt}"
|
|
;;
|
|
|
|
b)
|
|
read_opt2="${read_buf_opt}"
|
|
;;
|
|
esac
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# Audio Setup
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
if [ "$asrate" == "-" ]
|
|
then
|
|
aresample=""
|
|
else
|
|
aresample="-srate $asrate -af-add lavcresample=$asrate"
|
|
fi
|
|
|
|
if [ "$stereo" == "y" ]
|
|
then
|
|
stereo_mode=0
|
|
else
|
|
stereo_mode=3
|
|
fi
|
|
|
|
if [ "${volume}" == "-" ]
|
|
then
|
|
vol_opt=""
|
|
else
|
|
vol_opt="-af-add volume=$volume:0"
|
|
fi
|
|
|
|
audio_comp_opt="-oac mp3lame -lameopts cbr:br=$abr:aq=0:mode=$stereo_mode $aresample $vol_opt"
|
|
audio_copy_opt="-oac copy"
|
|
|
|
if [ "$audio" != "n" ]
|
|
then
|
|
if [ "$video" == "1" ]
|
|
then
|
|
audio_opt1="$audio_comp_opt"
|
|
else
|
|
if [ "$video" == "2" ]
|
|
then
|
|
if [ "$audio" == "avp" ]
|
|
then
|
|
audio_opt1="$audio_comp_opt"
|
|
audio_opt2="$audio_comp_opt"
|
|
else
|
|
if [ "$audio" == "fvp" ]
|
|
then
|
|
audio_opt1="$audio_copy_opt"
|
|
audio_opt2="$audio_comp_opt"
|
|
fi
|
|
fi
|
|
else
|
|
audio_opt1="$audio_comp_opt"
|
|
fi
|
|
fi
|
|
else
|
|
audio_opt1="$audio_copy_opt"
|
|
audio_opt2="$audio_copy_opt"
|
|
fi
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# Video Setup
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
video_lavc_header_11="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbr"
|
|
video_lavc_header_21="-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=$vbr"
|
|
video_lavc_header_22="-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=$vbr"
|
|
|
|
video_lavc_body_0="mbd=2:turbo"
|
|
video_lavc_body_1="mbd=2:trell:v4mv:turbo"
|
|
video_lavc_body_2="mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo"
|
|
video_lavc_body_3="mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2"
|
|
|
|
video_xvid_header_11="-ovc xvid -xvidencopts bitrate=$vbr"
|
|
video_xvid_header_21="-ovc xvid -xvidencopts pass=1:bitrate=$vbr"
|
|
video_xvid_header_22="-ovc xvid -xvidencopts pass=2:bitrate=$vbr"
|
|
|
|
video_xvid_body_0="turbo:nochroma_me:notrellis:max_bframes=0:vhq=0"
|
|
video_xvid_body_1="turbo:vhq=0"
|
|
video_xvid_body_2="vhq=2:bvhq=1:chroma_opt:quant_type=mpeg"
|
|
video_xvid_body_3="chroma_opt:vhq=4:bvhq=1:quant_type=mpeg"
|
|
|
|
video_x264_header_11="-ovc x264 -x264encopts bitrate=$vbr"
|
|
video_x264_header_21="-ovc x264 -x264encopts pass=1:bitrate=$vbr"
|
|
video_x264_header_22="-ovc x264 -x264encopts pass=2:bitrate=$vbr"
|
|
|
|
video_x264_body_0=""
|
|
video_x264_body_1="subq=4:bframes=2:b_pyramid:weight_b"
|
|
video_x264_body_2="subq=5:8x8dct:frameref=2:bframes=3:b_pyramid:weight_b"
|
|
video_x264_body_3="subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid:weight_b"
|
|
|
|
|
|
|
|
if [ "$video" != "n" ]
|
|
then
|
|
if [ "$video" == "1" ]
|
|
then
|
|
video_opt1=$(eval echo \${video_${vcodec}_header_11}:\${video_${vcodec}_body_${vquality}})
|
|
else
|
|
if [ "$video" == "2a" ]
|
|
then
|
|
video_opt1=$(eval echo \${video_${vcodec}_header_21}:\${video_${vcodec}_body_0})
|
|
video_opt2=$(eval echo \${video_${vcodec}_header_22}:\${video_${vcodec}_body_${vquality}})
|
|
else
|
|
video_opt1=$(eval echo \${video_${vcodec}_header_21}:\${video_${vcodec}_body_${vquality}})
|
|
fi
|
|
|
|
video_opt2=$(eval echo \${video_${vcodec}_header_22}:\${video_${vcodec}_body_${vquality}})
|
|
fi
|
|
fi
|
|
|
|
if [ "$crop" != "-" ]
|
|
then
|
|
vf_opt="-vf-add crop=$crop"
|
|
fi
|
|
|
|
if [ "$xsize" != "-" ]
|
|
then
|
|
vf_opt+=" -vf-add scale -zoom -xy $xsize"
|
|
fi
|
|
|
|
if [ "$deint" == "y" ]
|
|
then
|
|
vf_opt+=" -vf-add lavcdeint"
|
|
fi
|
|
|
|
if [ "$aspect" == "-" ]
|
|
then
|
|
video_opt1=$video_opt1":autoaspect"
|
|
video_opt2=$video_opt2":autoaspect"
|
|
else
|
|
video_opt1=$video_opt1":aspect=$aspect"
|
|
video_opt2=$video_opt2":aspect=$aspect"
|
|
fi
|
|
|
|
if [ "$threads" != "-" ]
|
|
then
|
|
video_opt1=$video_opt1":threads=$threads"
|
|
video_opt2=$video_opt2":threads=$threads"
|
|
fi
|
|
|
|
if [ "${vopts}" != "-" ]
|
|
then
|
|
video_opt1=$video_opt1":${vopts}"
|
|
video_opt2=$video_opt2":${vopts}"
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
mkdir $tmpdir_name
|
|
cd $tmpdir_name
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
echo "Cleanup..."
|
|
\rm divx2pass.log
|
|
\rm xvid-twopass.stats
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# Bufferizing
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
if [ "$input" != "d" ] && [ "$input" != "b" ]
|
|
then
|
|
echo "Bufferizing..."
|
|
mencoder $read_opt1 -oac copy -ovc copy -o $tmp_name >$out_name.1.log 2>&1
|
|
|
|
if [ "$input" == "dbo" ]
|
|
then
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
# Video Compression
|
|
#-----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
if [ "$video" != "n" ]
|
|
then
|
|
if [ "$video" == "1" ]
|
|
then
|
|
echo "Compressing DivX..."
|
|
mencoder $read_opt2 $audio_opt1 $video_opt1 $vf_opt -o $divx_name >$out_name.3.log 2>&1
|
|
else
|
|
echo "Compressing DivX pass 1..."
|
|
mencoder $read_opt2 $audio_opt1 $video_opt1 $vf_opt -o /dev/null >$out_name.3.log 2>&1
|
|
|
|
echo "Compressing DivX pass 2..."
|
|
mencoder $read_opt2 $audio_opt2 $video_opt2 $vf_opt -o $divx_name >$out_name.4.log 2>&1
|
|
fi
|
|
else
|
|
if [ "$audio" == "ap" ]
|
|
then
|
|
echo "Compressing DivX audio..."
|
|
mencoder $read_opt2 $audio_opt1 -ovc copy -o $divx_name >$out_name.3.log 2>&1
|
|
fi
|
|
fi
|