#!/bin/sh USAGE=' Usage: brewdvd [-d ] [-ts ] [-nn ] [options] -o Based on mencoder and lsdvd. Check dvd content with: $ mplayer -frames 0 -identify -dvd-device /dev/sr0 dvd:// $ lsdvd Check AVI file content with: $ mediainfo Copyright © Daniel Ljunggren . Version 0.5 Aug 2009 - Sep 2014. [options]: -d : directory with VOB files or dvd-device (default /dev/sr0) -ts : video title set of the format VTS_ts_nn.VOB -nn : span of dvd titles (default is longest dvd title) or if -ts set then span of video objects (format VTS_ts_N1.VOB to VTS_ts_N2.VOB) -ac3 : use AC3 audio coding (default is MP3) -mpeg4 : use MPEG-4/DIVX (proprietary) video coding (default is Xvid open source) -ca : copy audio format from source -cv : copy video format from source -m : film length in minutes (set vbitrate targeting 700 MiB) -i : deinterlacing filter (changes framerate from 50 to 25 fps) -a : aspect ratio (4/3, 16/9), default is autoaspect -split : split each title into separate file -skip : skip first N (try N=1) seconds (fixes some problems with de/encoding) -noalang : no audio language selection (fixes some problems with de/encoding) -vol : increase volume by 12dB (default 3dB) -o : output filename ' # Problems: # No sound on dvd://1, but dvd://2 dvd://3 ok: (-alang has effect, -aid works) # $brewdvd -d Spökar_Alfons_DVD4/ -nn 1 3 -ca -cv -o test.avi # Works ok: (-alang has no effect, -aid works) # $brewdvd -d Spökar_Alfons_DVD4/ -ts 01 -nn 1 3 -ca -cv -o test.avi # Best is lossy video and audio with Alfons: # $brewdvd -d Spökar_Alfons_DVD4/ -ts 01 -nn 1 3 -o test.avi # "Cannot mix video-only..." (dvd1 no swedish found) "...with audiovideo" (dvd2 swedish ok) # or "All video files must have identical fps, resolution, and codec for -ovc copy" with option -ffourcc MPEG # $mencoder -ss 1 -alang sv -dvd-device Spökar_Alfons_DVD4/ dvd://1 dvd://2 -oac copy -ovc copy -o test.avi # Gives finish language (alang to late): # $mencoder -ss 1 -dvd-device Spökar_Alfons_DVD4/ dvd://1 dvd://2 -oac copy -alang sv,en -ovc copy -o test.avi # This playes swedish # $mplayer -alang sv -dvd-device Spökar_Alfons_DVD4/ dvd://1 # This does not play swedish # $mencoder -alang sv -dvd-device Spökar_Alfons_DVD4/ dvd://1 -oac copy -ovc copy -o test.avi SPLITFILES=false SKIP=1 TS="" NS="" NE="" ASPECT="autoaspect" FILTEROPTS="-vf harddup" VOBFILE=false AFORMAT=MP3 VFORMAT=XVID MINUTES="" VBITRATE=1800 # Minimum video bitrate kbit/s ABITRATE=320 # DVD standard seems to be 448 kbit/s, half bitrate is 224 kbit/s TARGETMiB=700 SKIPFRAMES=false DVDDEVICE=/dev/sr0 NOALANG=false VOL=false OPTIONS="-nosub -noautosub" # No subtitles # Define a calculator with max() and min() based on awk function calc () { awk "function max(a, b) { if (a > b) {return a} else {return b} }; function min(a, b) { if (a < b) {return a} else {return b} }; BEGIN { print $* ; }" } if [ $# -eq 0 ]; then echo "${USAGE}" ; exit 1; fi while [ $# -gt 0 ] do case "$1" in -d) DVDDEVICE=$2 shift 1 ;; -ts) VOBFILE=true TS=$2 shift 1 ;; -ac3) AFORMAT=AC3 ;; -mpeg4) VFORMAT=DIVX ;; -ca) AFORMAT=COPY ;; -cv) VFORMAT=COPY ;; -nn) NS=$2 NE=$3 shift 2 ;; -m) MINUTES=$2 shift 1 ;; -i) FILTEROPTS="$FILTEROPTS -vf yadif=0" ;; -a) ASPECT="aspect=$2" shift 1 ;; -skip) SKIPFRAMES=true SKIP=$2 shift 1 ;; -split) SPLITFILES=true ;; -noalang) NOALANG=true ;; -vol) VOL=true ;; -o) FILENAME=$2 shift 1 ;; -help) echo "${USAGE}" exit 0 ;; *) OPTIONS="${OPTIONS} $1" ;; #*) # break # ;; esac shift 1 done VOB_EXT=VOB ORIG_EXT=avi # Find default title to encode if [ $VOBFILE == 'false' ] && [ -z $NS ]; then NS=`lsdvd ${DVDDEVICE} | grep Longest | cut -b16-` if [ -z $NS ]; then NS=1; fi NE=$NS elif [ -z $NS ]; then NS=1 NE=$NS fi # Calculate needed video bitrate based on audio bitrate and target file size. if [ ! -z $MINUTES ]; then # VBITRATE_T=$(calc "8*1024*$TARGETMiB/(${MINUTES}*60)") # Ignore audio bitrate VBITRATE_T=$(calc "int((1024*1024*$TARGETMiB-$ABITRATE*1000*60*${MINUTES}/8)*8/(60*${MINUTES}*1000))") echo "Variable bitrate is $VBITRATE_T kbit/s" else VBITRATE_T=0 fi VBITRATE=$(calc "max(${VBITRATE_T},${VBITRATE})") if [ $AFORMAT == 'AC3' ]; then # AUDIOSWITCH="-oac lavc -lavcopts acodec=ac3:abitrate=${ABITRATE}" # Surround sound elif [ $AFORMAT == 'MP3' ]; then AUDIOSWITCH="-oac mp3lame -lameopts abr:br=${ABITRATE}:aq=0" # Stereo sound #AUDIOSWITCH="$AUDIOSWITCH:vol=8" # Volume gain specific for mp3. elif [ $AFORMAT == 'COPY' ]; then AUDIOSWITCH="-oac copy" #AUDIOSWITCH="-oac pcm" SKIPFRAMES=true # Avoid segmentation fault in mencoder fi if [ $VFORMAT == 'DIVX' ]; then # MPEG-4/DIVX VIDEOSWITCH="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=${VBITRATE}:vhq:${ASPECT}:turbo:v" elif [ $VFORMAT == 'XVID' ]; then # XVID VIDEOSWITCH="-ovc xvid -xvidencopts bitrate=${VBITRATE}:${ASPECT}:turbo:" #OPTIONS="${OPTIONS} -ffourcc XVID" elif [ $VFORMAT == 'COPY' ]; then VIDEOSWITCH="-ovc copy" #if [ $VOBFILE == "false" ]; then #OPTIONS="${OPTIONS} -ffourcc MPEG" #fi fi if [ $NOALANG == 'false' ] && [ $VOBFILE == 'false' ]; then AUDIOSWITCH="$AUDIOSWITCH -alang sv,en" # alang only works with -dvd-device and dvd://... fi if [ $SKIPFRAMES == 'true' ]; then FILTEROPTS="$FILTEROPTS -ss $SKIP" fi if [ $VOL == 'true' ]; then # Normalize sound volume, moving average compression. #FILTEROPTS="$FILTEROPTS -af volnorm" # Increase volume 12 dB FILTEROPTS="$FILTEROPTS -af volume=12" else FILTEROPTS="$FILTEROPTS -af volume=3" fi OPTIONS="-dvd-device $DVDDEVICE ${OPTIONS}" if [ $SPLITFILES == 'false' ]; then for (( N = $NS; N <= $NE; N++ )); do if [ $VOBFILE == 'true' ]; then #SOURCEDIR=`dirname $SOURCENAME` #SOURCEBASE=`basename $SOURCENAME .$VOB_EXT` INPUT="$INPUT $DVDDEVICE/VTS_${TS}_${N}.$VOB_EXT" else INPUT="$INPUT dvd://${N}" fi done echo "Options: $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH} ${OPTIONS} $INPUT -o ${FILENAME}" if [ $VFORMAT == 'COPY' ]; then mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH} ${OPTIONS} $INPUT -o ${FILENAME} else #mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH} ${OPTIONS} $INPUT -o ${FILENAME} mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH}pass=1 ${OPTIONS} $INPUT -o ${FILENAME} mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH}pass=2 ${OPTIONS} $INPUT -o ${FILENAME} rm divx2pass.log fi else for (( N = $NS; N <= $NS; N++ )); do if [ $VOBFILE == 'true' ]; then #SOURCEDIR=`dirname $SOURCENAME` #SOURCEBASE=`basename $SOURCENAME .$VOB_EXT` INPUT="$INPUT $DVDDEVICE/VTS_${TS}_${N}.$VOB_EXT" else INPUT="dvd://${N}" fi DIR=`dirname $FILENAME` BASE=`basename $FILENAME .$ORIG_EXT` NEWFILENAME="${DIR}/${BASE}_${N}.${ORIG_EXT}" if [ $VFORMAT == 'COPY' ]; then mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH} ${OPTIONS} $INPUT -o ${NEWFILENAME} else mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH}pass=1 ${OPTIONS} $INPUT -o ${NEWFILENAME} mencoder $FILTEROPTS ${AUDIOSWITCH} ${VIDEOSWITCH}pass=2 ${OPTIONS} $INPUT -o ${NEWFILENAME} rm divx2pass.log fi done fi