1#!/usr/local/bin/bash 2# 3# QEPDVCD 4# 5# Most of this stuff comes straight from MPlayer documentation. 6# Options are limited only to a small useful subset, if you 7# want more control, RTFM and DIY. 8# 9# Version: 0.1 10# 11# Licence: GPL 12# 13# Author: Reynaldo H. Verdejo Pinochet <reynaldo@opendot.cl> 14# 15# Script: MPlayer Sources. Anything supported to vcd/svcd pal/ntsc 16# 17# requires: mencoder 18# 19# sugests: vcdimager / cdrecord 20# 21# Thanks to: Carlos Navarro Salas - name author ;) 22# 23# 24 25# Defaults 26 27MYNAME=`basename $0` 28TARGET="svcd" 29ENCQ="2" 30ABPS="224" 31VBPS="2000" 32NORM="NTSC" 33SPLIT="0" 34TOLERANCE="85" 35OUTNAME="mencodedvcd" 36SUBFILENAME=0 37 38EDLFILENAME="pass.edl" 39HAVESUB=0 40WORKDIR="." 41RATIOX=4 42RATIOY=3 43 44OPTIONS="INPUTFILENAME TARGET ENCQ ABPS VBPS NORM SPLIT TOLERANCE OUTNAME" 45 46usage() 47{ 48echo "" 49echo "usage $MYNAME inputfile [options]" 50echo "" 51echo "Options: [Default value]" 52echo "" 53echo "-t Target svcd|vcd [svcd]" 54echo "-q Encoding quality 0|1|2 [2]" 55echo "-a Audio bitrate in kbps [224]" 56echo "-v Video bitrate in kbps [2000 For SVCD, 1150 For VCD]" 57echo "-n Norm NTSC|PAL [NTSC]" 58echo "-d Divide/split movie at given times time1:time2:... [no split]" 59echo "-s Shitty TV screen tolerance %, afects subtitle positioning [85]" 60echo "-u Subtitle file name [No subtitle]" 61echo "-o Output basename [mencodedvcd]" 62echo "" 63echo "In case you want to use -a/-v please read:" 64echo "http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-vcd-dvd.html" 65echo "" 66} 67 68test_needed() 69{ 70 71for i in mencoder; do 72 if [ -z "`which $i`" ]; then 73 echo "[ERROR] mencoder not found in $PATH!" 74 exit 1 75 fi 76done 77 78} 79 80test_sugested() 81{ 82 83for i in vcdimager cdrecord; do 84 if [ -z "`which $i`" ]; then 85 echo "[WARNING] $i not found in $PATH!" 86 echo "You'll likely need it after we finish." 87 exit 1 88 fi 89done 90} 91 92test_needed 93test_sugested 94 95if [ $# -lt 1 ]; then 96 echo "" 97 echo "[ERROR] Input filename parameter is mandatory." 98 echo "" 99 usage 100 exit 1 101fi 102 103case $1 in 104 -*) 105 usage 106 exit 1 107 ;; 108 *) 109 INPUTFILENAME=$1 110 shift 1 111 ;; 112esac 113 114while [ "$1"x != "x" ]; do 115 case $1 in 116 -t) 117 TARGET=$2 118 shift 1 119 ;; 120 -q) 121 ENCQ=$2 122 shift 1 123 ;; 124 -a) 125 ABPS=$2 126 shift 1 127 ;; 128 -v) 129 VBPS=$2 130 shift 1 131 ;; 132 -n) 133 NORM=$2 134 shift 1 135 ;; 136 -d) 137 SPLIT=$2 138 shift 1 139 ;; 140 -s) 141 TOLERANCE=$2 142 shift 1 143 ;; 144 -u) 145 SUBFILENAME="$2" 146 HAVESUB=1 147 shift 1 148 ;; 149 -o) 150 OUTNAME=$2 151 shift 1 152 ;; 153 esac 154 shift 1 155done 156 157echo "" 158echo "[STATUS] Will re-encode using the following parameters:" 159echo "" 160for i in $OPTIONS ; do 161 echo "$i ${!i}"; 162done 163 164# Parameter Sanity Check ########################################### 165# We need to check supplied params against known format constraints 166#################################################################### 167 168if [ $TARGET = "svcd" ]; then 169 if [ $ABPS -gt 384 ]; then 170 echo "[ERROR] SVCD maximum abitrate is 384kbps." 171 exit 1 172 fi 173 if [ $VBPS -gt 2600 ]; then 174 echo "[ERROR] SVCD maximum vbitrate is 2600kbps." 175 exit 1 176 fi 177else [ $TARGET = "vcd" ] 178 if [ $ABPS -eq 224 ]; then 179 echo "[ERROR] VCD abitrate must be 224kbps." 180 exit 1 181 fi 182 if [ $VBPS -gt 1150 ]; then 183 echo "[ERROR] VCD maximum vbitrate is 1150kbps." 184 exit 1 185 fi 186fi 187 188# Set encoding options ############################################## 189 190if [ $TARGET = "svcd" ]; then 191 FORMAT="xsvcd" 192 VCODEC="mpeg2video" 193 VRCMINRATE=4 194 VRCMAXRATE=2500 195 VRCBUFSIZE=917 196 if [ $NORM = "NTSC" ]; then 197 SCALEX=480 198 SCALEY=480 199 KEYINT=18 200 OFPS="24000/1001" 201 TELECINE=":telecine" 202 else [ $NORM = "PAL" ] 203 SCALEX=480 204 SCALEY=576 205 KEYINT=15 206 OFPS=25 207 fi 208else [ $TARGET = "vcd" ] 209 FORMAT="xvcd" 210 VCODEC="mpeg1video" 211 VRCMINRATE=$VBPS 212 VRCMAXRATE=$VBPS 213 VRCBUFSIZE=327 214 if [ $NORM = "NTSC" ]; then 215 SCALEX=352 216 SCALEY=240 217 KEYINT=18 218 OFPS="24000/1001" 219 else [ $NORM = "PAL" ] 220 SCALEX=352 221 SCALEY=288 222 KEYINT=15 223 OFPS=25 224 fi 225fi 226 227# Start reencoding ################################################### 228 229cd $WORKDIR 230 231if [ $(($HAVESUB+1)) -eq 1 ]; then 232 SUBTITLESTRING="/dev/null" 233else 234 SUBTITLESTRING="$SUBFILENAME" 235fi 236 237if [ $SPLIT = "0" ]; then 238 CICLES=0 239 TIMESTRING="" 240else 241 if [ -e $EDLFILENAME ]; then 242 echo "[ERROR]" 243 echo "The -d option needs to generate a temporary file called" 244 echo "$EDLFILENAME. You already have one in this directory," 245 echo "please remove/rename it and run $MYNAME again." 246 echo "" 247 exit 1 248 else 249 EDLSTRING=$(echo $SPLIT | sed -e s/:/' '/g) 250 EDLARRAY=($EDLSTRING) 251 CICLES=$(echo $EDLSTRING | wc -w) 252 TIMESTRING="-edl $EDLFILENAME -hr-edl-seek" 253 fi 254fi 255 256 257for j in $(seq 0 $CICLES); do 258 259 NEWNAME=$OUTNAME"_PART"$j".mpg" 260 echo "" 261 echo "Making $NEWNAME, wish me luck ;-)" 262 echo "" 263 264# Create EDLFILENAME ################################################# 265 266 if [ $CICLES -ge 1 ]; then 267 for i in $(seq 0 $CICLES) 268 do 269 if [ $i -eq $j ]; then 270 if [ $j -ne 0 ]; then 271 echo "0 ${EDLARRAY[$(($i-1))]} 0" > $EDLFILENAME 272 fi 273 if [ $i -ne $CICLES ]; then 274 echo "${EDLARRAY[$(($i))]} 999999 0" >> $EDLFILENAME 275 fi 276 fi 277 done 278 fi 279 280# Mencoder Time ;-) ################################################### 281 282mencoder \ 283-ovc lavc -oac lavc -vf expand=:::::$RATIOX/$RATIOY:1,scale=$SCALEX:$SCALEY,harddup \ 284-srate 44100 -af lavcresample=44100 -lavcopts acodec=mp2:abitrate=$ABPS:vcodec=$VCODEC:\ 285vbitrate=$VBPS:keyint=$KEYINT:mbd=$ENCQ:vrc_buf_size=$VRCBUFSIZE:vrc_maxrate=$VRCMAXRATE:\ 286vrc_minrate=$VRCMINRATE:vi_qfactor=0.1:vi_qoffset=1.5:aspect=$RATIOX/$RATIOY -of mpeg \ 287-mpegopts format=$FORMAT$TELECINE -sub $SUBTITLESTRING -subpos $TOLERANCE -subwidth \ 288$TOLERANCE -ofps $OFPS $TIMESTRING -o $NEWNAME $INPUTFILENAME 289 290echo "Encoding of $NEWNAME finished." 291echo "Run vcdimager -t svcd/vcd $NEWNAME and burn with cdrecord." 292 293done 294 295echo "$(($CICLES+1)) VCD/SVCD file(s) created!!!" 296echo "Happy to be of some help ;-) have fun." 297exit 0 298