27199
|
1 #!/bin/bash
|
27198
|
2 #
|
|
3 # Version: 0.2.2
|
|
4 #
|
|
5 # Licence: GPL
|
|
6 #
|
|
7 # 2002/09/21 Jürgen Hammelmann <juergen.hammelmann@gmx.de>
|
|
8 #
|
|
9 # Script: MPlayer Sources (DVD) to (S)VCD ripping and burning
|
|
10 #
|
|
11 # requires: mplayer
|
|
12 # mjpegtools
|
|
13 # vcdimager
|
|
14 # cdrdao
|
|
15 # lame (optionally)
|
|
16 # toolame (optionally)
|
|
17 # sox (optionally)
|
|
18
|
|
19 for exe in mplayer mpeg2enc mp2enc mplex yuvscaler ; do
|
|
20 if [ -z "`which $exe`" ]; then
|
|
21 echo "ERROR: $exe must be in your path $PATH!"
|
|
22 exit 1
|
|
23 fi
|
|
24 done
|
|
25 for exe in vcdimager lame cdrdao yuvdenoise sox toolame normalize; do
|
|
26 if [ -z "`which $exe`" ]; then
|
|
27 echo "WARNING: $exe is not found in your path $PATH!"
|
|
28 fi
|
|
29 done
|
|
30
|
|
31 ################################################################################
|
|
32 #
|
|
33 # 2002/04/11 v0.1.0: first version
|
|
34 # 2002/04/12 v0.1.1:
|
|
35 # 2002/04/14 v0.1.2:
|
|
36 # - handles now multiple vcd's
|
|
37 # - support's mp3 audio as option
|
|
38 # - use of mp2enc/lame instead of toolame because of support
|
|
39 # of resampling and mp3
|
|
40 # 2002/04/16 v0.1.3:
|
|
41 # - new option "-burnonly"
|
|
42 # - new option "-vbr"
|
|
43 # - removes mpg file after mastering cd image
|
|
44 # (mplayer can read bin images!)
|
|
45 # - bugfixes
|
|
46 # 2002/04/22 v0.1.4
|
|
47 # - bugfixes / changes
|
|
48 # - more options
|
|
49 # 2002/05/06 v0.1.5
|
|
50 # - new option "-norm"
|
|
51 # 2002/05/08 v0.1.6
|
|
52 # - bugfixes
|
|
53 # - new option "-vfr"
|
|
54 # - "-norm" renamed to "-vnorm"
|
|
55 # 2002/05/15 v0.1.7
|
|
56 # - bugfixes
|
|
57 # - more help
|
|
58 # 2002/05/26 v0.1.8
|
|
59 # - new option "-sync"
|
|
60 # 2002/06/19 v0.1.9
|
|
61 # - new option "-mpgonly"
|
|
62 # 2002/09/21 v0.1.10
|
|
63 # - bug fixes
|
|
64 # - tests now, if the commands are in path and give warnings
|
|
65 # and errors.
|
|
66 # 2002/11/01 v0.2
|
|
67 # - bug fixes
|
|
68 # - new options: "-sox", "-volume", "-toolame"
|
|
69 # - renamed "-mpg" to "-mpegsrc"
|
|
70 # - default cd size changed to 800mb
|
|
71 # 2002/11/18 v0.2.1
|
|
72 # - aspect ratio for vcd's, too
|
|
73 # - pulldown mode...
|
|
74 # 2002/12/01 v0.2.2
|
|
75 # - -normalize
|
|
76 #
|
|
77 ################################################################################
|
|
78 #
|
|
79 # global config section, change them to your needs!
|
|
80
|
|
81 TMPDIR="." # path to directory for creating temporary files, recommended 2-3GB space
|
|
82
|
|
83 CDDRV="generic-mmc" # cdrdao: cdwriter driver
|
|
84 CDDEV="--device 0,1,0" # or comment out and create link /dev/cdrecorder
|
|
85 # to your cdwriter dev
|
|
86 CDMAXSIZE=800
|
|
87
|
|
88 ################################################################################
|
|
89 AUDIO="audiodump.wav"
|
|
90 VIDEO="stream.yuv"
|
|
91 VCDMODE=2
|
|
92 SVCDMODE=5
|
|
93 ################################################################################
|
|
94
|
|
95 usage() {
|
|
96 echo "Usage: $HOWCALLED <basename> [$HOWCALLED options] [mplayer options]"
|
|
97 echo
|
|
98 echo " <basename> is used as basename of the resulting mpg/bin files."
|
|
99 echo
|
|
100 echo "For mplayer options see mplayer help and manual."
|
|
101 echo
|
|
102 echo "$HOWCALLED options:"
|
|
103 echo
|
|
104 echo "-?|-h help."
|
|
105 echo "-a <n> sets the aspect ratio (for SVCD):"
|
|
106 echo " 1 - 1:1 display"
|
|
107 echo " 2 - 4:3 display"
|
|
108 echo " 3 - 16:9 display"
|
|
109 echo " 4 - 2.21:1 display"
|
|
110 echo "-abr <n> output audio bitrate in kbs [224]."
|
|
111 echo "-asr <n> output audio sample rate in Hz [44100]."
|
|
112 echo "-blank cleans cd-rw before burning."
|
|
113 echo "-burnonly burn only the premastered <name>*.cue/<name>*.bin images."
|
|
114 echo "-cdsize <n> maximal size of cd images [800 = 80min raw cd]."
|
|
115 echo "-denoise denoises mpeg stream."
|
|
116 echo "-mp3 outputs audio in mp3 instead of mp2 format."
|
|
117 echo "-mpegsrc don't encode from source, multiplex/burn the "
|
|
118 echo " encoded mpg stream."
|
|
119 echo "-mpgonly do only encoding to mpeg 1/2 format."
|
|
120 echo "-noburn disables burning."
|
|
121 echo "-normalize use 'normalize'."
|
|
122 echo "-overburn enables overburning a cd."
|
|
123 echo "-pulldown enable pulldown mode in output."
|
|
124 echo "-ratio <s> output ratio size of frames, see yuvscaler (1)."
|
|
125 echo "-size <X>x<Y> sets output size of frames."
|
|
126 echo "-sox use sox for audio resampling."
|
|
127 echo "-svcdout encode to SVCD format [VCD default]."
|
|
128 echo "-sync <n> set the presentation timestamp offset of video"
|
|
129 echo " stream w.r.t. audio stream (video-audio) in mSec."
|
|
130 echo "-toolame use toolame instead of mp2enc."
|
|
131 echo "-v <volume> change amplitude (floating point); less than 1.0"
|
|
132 echo " decreases, greater than 1.0 increases. Use that only"
|
|
133 echo " together with sox!"
|
|
134 echo "-vbr <n> output video bitrate in kbs [VCD:1152, SVCD:2500]."
|
|
135 echo "-vfr <n> sets the frame-rate of the output-stream. Currently"
|
|
136 echo " only the standard MPEG rates are supported:"
|
|
137 echo " 0 - illegal"
|
|
138 echo " 1 - 24000.0/1001.0 (NTSC 3:2 pulldown converted FILM)"
|
|
139 echo " 2 - 24.0 (NATIVE FILM)"
|
|
140 echo " 3 - 25.0 (PAL/SECAM VIDEO / converted FILM)"
|
|
141 echo " 4 - 30000.0/1001.0 (NTSC VIDEO)"
|
|
142 echo " 5 - 30.0"
|
|
143 echo " 6 - 50.0 (PAL FIELD RATE)"
|
|
144 echo " 7 - 60000.0/1001.0 (NTSC FIELD RATE)"
|
|
145 echo " 8 - 60.0"
|
|
146 echo "-vnorm <p|n|s> sets the input video norm p, n or s:"
|
|
147 echo " forces the input stream to be treated as PAL|NTSC|SECAM"
|
|
148 echo " regardless of what the stream header might suggest."
|
|
149 echo "-w outputs in wide screen format 16:9."
|
|
150 echo
|
|
151 echo "examples:"
|
|
152 echo
|
|
153 echo "'$HOWCALLED teneriffa teneriffa.avi'"
|
|
154 echo "this creates a VCD from an avi file."
|
|
155 echo
|
|
156 echo "'$HOWCALLED crazy dvd://3 -w':"
|
|
157 echo "encodes and burns dvd title 3 to VCD in 16:9."
|
|
158 echo
|
|
159 echo "'$HOWCALLED carter dvd://1 -sid 0 -aid 128 -ss 3:00 -frames 1500 \\"
|
|
160 echo " -noburn -vnorm n -vfr 1':"
|
|
161 echo "this encodes 1500 frames of dvd title 1 with subtitle 0 and audio stream"
|
|
162 echo "128 starting from 3:00 with frame rate 29.97 fps and input video norm NTSC"
|
|
163 echo "and output frame rate 23.98 fps because of the 3:2 pulldown method in NTSC."
|
|
164 echo
|
|
165 echo "'$HOWCALLED bj -size 640x272 -vf expand=640:480:0:104:0 \\"
|
|
166 echo " -cdsize 645 -noburn bj.avi'"
|
|
167 echo "this example above shows you, how to deal with movies which are not"
|
|
168 echo "created with aspect ratios of 4:3 or 16:9."
|
|
169 }
|
|
170
|
|
171 HOWCALLED=`basename $0`
|
|
172 if [ $# -le 1 ]; then
|
|
173 usage
|
|
174 exit 1
|
|
175 fi
|
|
176 case $1 in
|
|
177 -*)
|
|
178 usage
|
|
179 exit 1
|
|
180 ;;
|
|
181 *)
|
|
182 NAME=$1
|
|
183 shift 1
|
|
184 ;;
|
|
185 esac
|
|
186
|
|
187 cd $TMPDIR
|
|
188 rm -f $VIDEO
|
|
189 rm -f $AUDIO
|
|
190 # create a named pipe for video stream
|
|
191 mkfifo -m 660 $VIDEO
|
|
192
|
|
193 # some inits
|
|
194 sub=""
|
|
195 size=""
|
|
196 aratio=""
|
|
197 ratio=""
|
|
198 params=""
|
|
199 wide=""
|
|
200 blank=0
|
|
201 burn=1
|
|
202 burnonly=0
|
|
203 mp3=0
|
|
204 mpgonly=0
|
|
205 mkstream=1
|
|
206 abr=224
|
|
207 abrset=0
|
|
208 asr=44100
|
|
209 vbr=1152
|
|
210 vbrset=0
|
|
211 denoise="cat -"
|
|
212 vnorm="VCD"
|
|
213 mplexnorm="-f $VCDMODE -m 1 -V -b 46"
|
|
214 imaget="-t vcd2"
|
|
215 yuvin=""
|
|
216 framerate=""
|
|
217 sync=""
|
|
218 sox=0
|
|
219 toolame=0
|
|
220 volume="1.0"
|
|
221 overburn=""
|
|
222 pd=""
|
|
223 norm=0
|
|
224
|
|
225 while [ "$1"x != "x" ]; do
|
|
226 case $1 in
|
|
227 -a)
|
|
228 aratio="-a $2"
|
|
229 shift 1
|
|
230 ;;
|
|
231 -w)
|
|
232 wide="-M WIDE2STD"
|
|
233 ;;
|
|
234 -h|-?)
|
|
235 usage
|
|
236 exit 0
|
|
237 ;;
|
|
238 -abr)
|
|
239 abr=$2
|
|
240 abrset=1
|
|
241 shift 1
|
|
242 ;;
|
|
243 -asr)
|
|
244 asr=$2
|
|
245 shift 1
|
|
246 ;;
|
|
247 -cdsize)
|
|
248 CDMAXSIZE=$2
|
|
249 shift 1
|
|
250 ;;
|
|
251 -blank)
|
|
252 blank=1
|
|
253 ;;
|
|
254 -noburn)
|
|
255 burn=0
|
|
256 ;;
|
|
257 -burnonly)
|
|
258 burnonly=1
|
|
259 burn=1
|
|
260 ;;
|
|
261 -overburn)
|
|
262 overburn="--overburn"
|
|
263 ;;
|
|
264 -pulldown)
|
|
265 pd="-p"
|
|
266 ;;
|
|
267 -vfr)
|
|
268 framerate="-F $2"
|
|
269 shift 1
|
|
270 ;;
|
|
271 -mp3)
|
|
272 mp3=1
|
|
273 ;;
|
|
274 -mpegsrc)
|
|
275 mkstream=0
|
|
276 ;;
|
|
277 -mpgonly)
|
|
278 mpgonly=1
|
|
279 ;;
|
|
280 -normalize)
|
|
281 norm=1
|
|
282 ;;
|
|
283 -vnorm)
|
|
284 yuvin="-n $2"
|
|
285 shift 1
|
|
286 ;;
|
|
287 -volume)
|
|
288 volume="$2"
|
|
289 shift 1
|
|
290 ;;
|
|
291 -denoise)
|
|
292 denoise="yuvdenoise"
|
|
293 ;;
|
|
294 -ratio)
|
|
295 ratio=$2
|
|
296 shift 1
|
|
297 ;;
|
|
298 -sid) # mplayer option: have to set vf expand, too!!!
|
|
299 sub="-vf pp,expand=-1:-1:-1:-1:1 -sid $2"
|
|
300 shift 1
|
|
301 ;;
|
|
302 -size)
|
|
303 size=$2
|
|
304 shift 1
|
|
305 ;;
|
|
306 -svcdout)
|
|
307 vnorm="SVCD"
|
|
308 ;;
|
|
309 -sync)
|
|
310 sync="-O $2"
|
|
311 shift 1
|
|
312 ;;
|
|
313 -sox)
|
|
314 sox=1
|
|
315 ;;
|
|
316 -toolame)
|
|
317 toolame=1
|
|
318 ;;
|
|
319 -vbr)
|
|
320 vbr=$2
|
|
321 vbrset=1
|
|
322 shift 1
|
|
323 ;;
|
|
324 *)
|
|
325 params="$params $1"
|
|
326 ;;
|
|
327 esac
|
|
328 shift 1
|
|
329 done
|
|
330
|
|
331 # some configs
|
|
332 mpegnorm="-f $VCDMODE -b $vbr -B 260 -V 46"
|
|
333 if [ "$vnorm" = "SVCD" ]; then
|
|
334 [ $vbrset -eq 0 ] && vbr=2500
|
|
335 mplexnorm="-f $SVCDMODE -m 2 -V -b 230"
|
|
336 mpegnorm="-f $SVCDMODE -b $vbr -B 260 -V 230"
|
|
337 imaget="-t svcd"
|
|
338 fi
|
|
339
|
|
340 # ratio overwrites wide sizing, size overwrites default frame size
|
|
341 [ -n "$ratio" ] && wide="-M $ratio"
|
|
342 [ -n "$size" ] && size="-O SIZE_$size"
|
|
343
|
|
344 # with mp3 audio set the default audio bitrate to 128 kbs
|
|
345 [ $mp3 -eq 1 -a $abrset -eq 0 ] && abr=128
|
|
346
|
|
347 # audio sample rate in kHz
|
|
348 ((a=$asr / 1000))
|
|
349 ((b=$asr % 1000))
|
|
350 [ $b -le 9 ] && b="00$b00"
|
|
351 [ $b -le 99 ] && b="0$b00"
|
|
352 kasr="$a.$b"
|
|
353
|
|
354 # start de-/encoding
|
|
355 if [ $burnonly -eq 0 ]; then
|
|
356 # encode streams
|
|
357 if [ $mkstream -eq 1 ]; then
|
|
358 # start mplayer
|
|
359 command="mplayer -noframedrop -vo yuv4mpeg -ao pcm:waveheader -v -osdlevel 0 $sub $params"
|
|
360 echo "$command"
|
|
361 $command &
|
|
362
|
|
363 # mjpegtools
|
|
364 ($denoise < $VIDEO | \
|
|
365 yuvscaler -v 0 $wide -O $vnorm $size $yuvin | \
|
|
366 mpeg2enc -v 0 -s $mpegnorm $aratio -S $CDMAXSIZE -g 6 -G 15 -r 16 \
|
|
367 $pd $framerate $yuvin -4 2 -2 1 -o $NAME.mpv) &
|
|
368
|
|
369 # wait for finishing the subprocesses
|
|
370 wait
|
|
371
|
|
372 # normalize sound
|
|
373 [ $norm -eq 1 ] && (echo "normalizing sound..."; normalize $AUDIO)
|
|
374
|
|
375 # do resampling with sox
|
|
376 if [ $sox -ne 0 ]; then
|
|
377 echo "wait, do resampling with sox..."
|
|
378 sox $AUDIO -v $volume -r $asr $NAME.wav resample -qs
|
|
379 mv -f $NAME.wav $AUDIO
|
|
380 fi
|
|
381
|
|
382 if [ $toolame -ne 0 -a $mp3 -eq 0 ]; then
|
|
383 # do mp2 encoding with toolame
|
|
384 echo "wait, encoding to mp2 audio with toolame..."
|
|
385 toolame -b $abr $AUDIO
|
|
386 mv -f `basename $AUDIO .wav`.mp2 $NAME.mpa
|
|
387 elif [ $toolame -eq 0 -a $mp3 -eq 0 ]; then
|
|
388 # mp2enc/lame can't read audiodump.wav directly from named pipe,
|
|
389 # we have to read the whole file.
|
|
390 echo "wait, encoding to mp2 audio with mp2enc..."
|
|
391 mp2enc -b $abr -r $asr -o $NAME.mpa < $AUDIO
|
|
392 elif [ $mp3 -ne 0 ]; then
|
|
393 echo "wait, encoding to mp3 audio with lame..."
|
|
394 lame -b $abr --resample $kasr - $NAME.mpa < $AUDIO
|
|
395 fi
|
|
396 fi
|
|
397
|
|
398 # remove wav file, won't need anymore!
|
|
399 rm -f $AUDIO
|
|
400
|
|
401 # multiplex streams
|
|
402 [ -f $NAME.mpv -a -f $NAME.mpa ] || exit 1
|
|
403 rm -f ${NAME}*.mpg
|
|
404 mplex $mplexnorm $sync $NAME.mpv $NAME.mpa -o ${NAME}%d.mpg
|
|
405
|
|
406 # remove pipe, won't need anymore!
|
|
407 rm -f $VIDEO
|
|
408
|
|
409 # should i create only the mpeg file?
|
|
410 [ $mpgonly -eq 1 ] && exit 0
|
|
411
|
|
412 # create cd images
|
|
413 for mpg in ${NAME}*.mpg; do
|
|
414 [ -f $mpg ] || exit 1
|
|
415 cue="`basename $mpg .mpg`.cue"
|
|
416 bin="`basename $mpg .mpg`.bin"
|
|
417 rm -f $cue $bin
|
|
418 vcdimager $imaget -c $cue -b $bin $mpg
|
|
419 [ -f $bin -a -f $cue ] && rm -f $mpg
|
|
420 done
|
|
421
|
|
422 # end of streaming/mastering
|
|
423 fi
|
|
424
|
|
425 # burn the (s)vcd's
|
|
426 [ $burn -eq 0 ] && exit 0
|
|
427
|
|
428 for cue in ${NAME}*.cue; do
|
|
429 bin="`basename $cue .cue`.bin"
|
|
430 [ -f $bin -a -f $cue ] || exit 1
|
|
431
|
|
432 echo "please insert a cd in your cdwriter, after a keypress we start:"
|
|
433 read -n 1 i
|
|
434
|
|
435 if [ $blank -eq 1 ]; then
|
|
436 cdrdao blank --reload $CDDEV --driver $CDDRV --blank-mode minimal
|
|
437 fi
|
|
438 cdrdao write $overburn --reload $CDDEV --driver $CDDRV $cue
|
|
439 done
|
|
440 exit 0
|