mpv/TOOLS/mencvcd.sh

441 lines
12 KiB
Bash
Executable File

#!/bin/bash
#
# Version: 0.2.2
#
# Licence: GPL
#
# 2002/09/21 Jürgen Hammelmann <juergen.hammelmann@gmx.de>
#
# Script: MPlayer Sources (DVD) to (S)VCD ripping and burning
#
# requires: mplayer
# mjpegtools
# vcdimager
# cdrdao
# lame (optionally)
# toolame (optionally)
# sox (optionally)
for exe in mplayer mpeg2enc mp2enc mplex yuvscaler ; do
if [ -z "`which $exe`" ]; then
echo "ERROR: $exe must be in your path $PATH!"
exit 1
fi
done
for exe in vcdimager lame cdrdao yuvdenoise sox toolame normalize; do
if [ -z "`which $exe`" ]; then
echo "WARNING: $exe is not found in your path $PATH!"
fi
done
################################################################################
#
# 2002/04/11 v0.1.0: first version
# 2002/04/12 v0.1.1:
# 2002/04/14 v0.1.2:
# - handles now multiple vcd's
# - support's mp3 audio as option
# - use of mp2enc/lame instead of toolame because of support
# of resampling and mp3
# 2002/04/16 v0.1.3:
# - new option "-burnonly"
# - new option "-vbr"
# - removes mpg file after mastering cd image
# (mplayer can read bin images!)
# - bugfixes
# 2002/04/22 v0.1.4
# - bugfixes / changes
# - more options
# 2002/05/06 v0.1.5
# - new option "-norm"
# 2002/05/08 v0.1.6
# - bugfixes
# - new option "-vfr"
# - "-norm" renamed to "-vnorm"
# 2002/05/15 v0.1.7
# - bugfixes
# - more help
# 2002/05/26 v0.1.8
# - new option "-sync"
# 2002/06/19 v0.1.9
# - new option "-mpgonly"
# 2002/09/21 v0.1.10
# - bug fixes
# - tests now, if the commands are in path and give warnings
# and errors.
# 2002/11/01 v0.2
# - bug fixes
# - new options: "-sox", "-volume", "-toolame"
# - renamed "-mpg" to "-mpegsrc"
# - default cd size changed to 800mb
# 2002/11/18 v0.2.1
# - aspect ratio for vcd's, too
# - pulldown mode...
# 2002/12/01 v0.2.2
# - -normalize
#
################################################################################
#
# global config section, change them to your needs!
TMPDIR="." # path to directory for creating temporary files, recommended 2-3GB space
CDDRV="generic-mmc" # cdrdao: cdwriter driver
CDDEV="--device 0,1,0" # or comment out and create link /dev/cdrecorder
# to your cdwriter dev
CDMAXSIZE=800
################################################################################
AUDIO="audiodump.wav"
VIDEO="stream.yuv"
VCDMODE=2
SVCDMODE=5
################################################################################
usage() {
echo "Usage: $HOWCALLED <basename> [$HOWCALLED options] [mplayer options]"
echo
echo " <basename> is used as basename of the resulting mpg/bin files."
echo
echo "For mplayer options see mplayer help and manual."
echo
echo "$HOWCALLED options:"
echo
echo "-?|-h help."
echo "-a <n> sets the aspect ratio (for SVCD):"
echo " 1 - 1:1 display"
echo " 2 - 4:3 display"
echo " 3 - 16:9 display"
echo " 4 - 2.21:1 display"
echo "-abr <n> output audio bitrate in kbs [224]."
echo "-asr <n> output audio sample rate in Hz [44100]."
echo "-blank cleans cd-rw before burning."
echo "-burnonly burn only the premastered <name>*.cue/<name>*.bin images."
echo "-cdsize <n> maximal size of cd images [800 = 80min raw cd]."
echo "-denoise denoises mpeg stream."
echo "-mp3 outputs audio in mp3 instead of mp2 format."
echo "-mpegsrc don't encode from source, multiplex/burn the "
echo " encoded mpg stream."
echo "-mpgonly do only encoding to mpeg 1/2 format."
echo "-noburn disables burning."
echo "-normalize use 'normalize'."
echo "-overburn enables overburning a cd."
echo "-pulldown enable pulldown mode in output."
echo "-ratio <s> output ratio size of frames, see yuvscaler (1)."
echo "-size <X>x<Y> sets output size of frames."
echo "-sox use sox for audio resampling."
echo "-svcdout encode to SVCD format [VCD default]."
echo "-sync <n> set the presentation timestamp offset of video"
echo " stream w.r.t. audio stream (video-audio) in mSec."
echo "-toolame use toolame instead of mp2enc."
echo "-v <volume> change amplitude (floating point); less than 1.0"
echo " decreases, greater than 1.0 increases. Use that only"
echo " together with sox!"
echo "-vbr <n> output video bitrate in kbs [VCD:1152, SVCD:2500]."
echo "-vfr <n> sets the frame-rate of the output-stream. Currently"
echo " only the standard MPEG rates are supported:"
echo " 0 - illegal"
echo " 1 - 24000.0/1001.0 (NTSC 3:2 pulldown converted FILM)"
echo " 2 - 24.0 (NATIVE FILM)"
echo " 3 - 25.0 (PAL/SECAM VIDEO / converted FILM)"
echo " 4 - 30000.0/1001.0 (NTSC VIDEO)"
echo " 5 - 30.0"
echo " 6 - 50.0 (PAL FIELD RATE)"
echo " 7 - 60000.0/1001.0 (NTSC FIELD RATE)"
echo " 8 - 60.0"
echo "-vnorm <p|n|s> sets the input video norm p, n or s:"
echo " forces the input stream to be treated as PAL|NTSC|SECAM"
echo " regardless of what the stream header might suggest."
echo "-w outputs in wide screen format 16:9."
echo
echo "examples:"
echo
echo "'$HOWCALLED teneriffa teneriffa.avi'"
echo "this creates a VCD from an avi file."
echo
echo "'$HOWCALLED crazy dvd://3 -w':"
echo "encodes and burns dvd title 3 to VCD in 16:9."
echo
echo "'$HOWCALLED carter dvd://1 -sid 0 -aid 128 -ss 3:00 -frames 1500 \\"
echo " -noburn -vnorm n -vfr 1':"
echo "this encodes 1500 frames of dvd title 1 with subtitle 0 and audio stream"
echo "128 starting from 3:00 with frame rate 29.97 fps and input video norm NTSC"
echo "and output frame rate 23.98 fps because of the 3:2 pulldown method in NTSC."
echo
echo "'$HOWCALLED bj -size 640x272 -vf expand=640:480:0:104:0 \\"
echo " -cdsize 645 -noburn bj.avi'"
echo "this example above shows you, how to deal with movies which are not"
echo "created with aspect ratios of 4:3 or 16:9."
}
HOWCALLED=`basename $0`
if [ $# -le 1 ]; then
usage
exit 1
fi
case $1 in
-*)
usage
exit 1
;;
*)
NAME=$1
shift 1
;;
esac
cd $TMPDIR
rm -f $VIDEO
rm -f $AUDIO
# create a named pipe for video stream
mkfifo -m 660 $VIDEO
# some inits
sub=""
size=""
aratio=""
ratio=""
params=""
wide=""
blank=0
burn=1
burnonly=0
mp3=0
mpgonly=0
mkstream=1
abr=224
abrset=0
asr=44100
vbr=1152
vbrset=0
denoise="cat -"
vnorm="VCD"
mplexnorm="-f $VCDMODE -m 1 -V -b 46"
imaget="-t vcd2"
yuvin=""
framerate=""
sync=""
sox=0
toolame=0
volume="1.0"
overburn=""
pd=""
norm=0
while [ "$1"x != "x" ]; do
case $1 in
-a)
aratio="-a $2"
shift 1
;;
-w)
wide="-M WIDE2STD"
;;
-h|-?)
usage
exit 0
;;
-abr)
abr=$2
abrset=1
shift 1
;;
-asr)
asr=$2
shift 1
;;
-cdsize)
CDMAXSIZE=$2
shift 1
;;
-blank)
blank=1
;;
-noburn)
burn=0
;;
-burnonly)
burnonly=1
burn=1
;;
-overburn)
overburn="--overburn"
;;
-pulldown)
pd="-p"
;;
-vfr)
framerate="-F $2"
shift 1
;;
-mp3)
mp3=1
;;
-mpegsrc)
mkstream=0
;;
-mpgonly)
mpgonly=1
;;
-normalize)
norm=1
;;
-vnorm)
yuvin="-n $2"
shift 1
;;
-volume)
volume="$2"
shift 1
;;
-denoise)
denoise="yuvdenoise"
;;
-ratio)
ratio=$2
shift 1
;;
-sid) # mplayer option: have to set vf expand, too!!!
sub="-vf pp,expand=-1:-1:-1:-1:1 -sid $2"
shift 1
;;
-size)
size=$2
shift 1
;;
-svcdout)
vnorm="SVCD"
;;
-sync)
sync="-O $2"
shift 1
;;
-sox)
sox=1
;;
-toolame)
toolame=1
;;
-vbr)
vbr=$2
vbrset=1
shift 1
;;
*)
params="$params $1"
;;
esac
shift 1
done
# some configs
mpegnorm="-f $VCDMODE -b $vbr -B 260 -V 46"
if [ "$vnorm" = "SVCD" ]; then
[ $vbrset -eq 0 ] && vbr=2500
mplexnorm="-f $SVCDMODE -m 2 -V -b 230"
mpegnorm="-f $SVCDMODE -b $vbr -B 260 -V 230"
imaget="-t svcd"
fi
# ratio overwrites wide sizing, size overwrites default frame size
[ -n "$ratio" ] && wide="-M $ratio"
[ -n "$size" ] && size="-O SIZE_$size"
# with mp3 audio set the default audio bitrate to 128 kbs
[ $mp3 -eq 1 -a $abrset -eq 0 ] && abr=128
# audio sample rate in kHz
a=$(($a=$asr / 1000))
b=$(($b=$asr % 1000))
[ $b -le 9 ] && b="00$b00"
[ $b -le 99 ] && b="0$b00"
kasr="$a.$b"
# start de-/encoding
if [ $burnonly -eq 0 ]; then
# encode streams
if [ $mkstream -eq 1 ]; then
# start mplayer
command="mplayer -noframedrop -vo yuv4mpeg -ao pcm:waveheader -v -osdlevel 0 $sub $params"
echo "$command"
$command &
# mjpegtools
($denoise < $VIDEO | \
yuvscaler -v 0 $wide -O $vnorm $size $yuvin | \
mpeg2enc -v 0 -s $mpegnorm $aratio -S $CDMAXSIZE -g 6 -G 15 -r 16 \
$pd $framerate $yuvin -4 2 -2 1 -o $NAME.mpv) &
# wait for finishing the subprocesses
wait
# normalize sound
[ $norm -eq 1 ] && (echo "normalizing sound..."; normalize $AUDIO)
# do resampling with sox
if [ $sox -ne 0 ]; then
echo "wait, do resampling with sox..."
sox $AUDIO -v $volume -r $asr $NAME.wav resample -qs
mv -f $NAME.wav $AUDIO
fi
if [ $toolame -ne 0 -a $mp3 -eq 0 ]; then
# do mp2 encoding with toolame
echo "wait, encoding to mp2 audio with toolame..."
toolame -b $abr $AUDIO
mv -f `basename $AUDIO .wav`.mp2 $NAME.mpa
elif [ $toolame -eq 0 -a $mp3 -eq 0 ]; then
# mp2enc/lame can't read audiodump.wav directly from named pipe,
# we have to read the whole file.
echo "wait, encoding to mp2 audio with mp2enc..."
mp2enc -b $abr -r $asr -o $NAME.mpa < $AUDIO
elif [ $mp3 -ne 0 ]; then
echo "wait, encoding to mp3 audio with lame..."
lame -b $abr --resample $kasr - $NAME.mpa < $AUDIO
fi
fi
# remove wav file, won't need anymore!
rm -f $AUDIO
# multiplex streams
[ -f $NAME.mpv -a -f $NAME.mpa ] || exit 1
rm -f ${NAME}*.mpg
mplex $mplexnorm $sync $NAME.mpv $NAME.mpa -o ${NAME}%d.mpg
# remove pipe, won't need anymore!
rm -f $VIDEO
# should i create only the mpeg file?
[ $mpgonly -eq 1 ] && exit 0
# create cd images
for mpg in ${NAME}*.mpg; do
[ -f $mpg ] || exit 1
cue="`basename $mpg .mpg`.cue"
bin="`basename $mpg .mpg`.bin"
rm -f $cue $bin
vcdimager $imaget -c $cue -b $bin $mpg
[ -f $bin -a -f $cue ] && rm -f $mpg
done
# end of streaming/mastering
fi
# burn the (s)vcd's
[ $burn -eq 0 ] && exit 0
for cue in ${NAME}*.cue; do
bin="`basename $cue .cue`.bin"
[ -f $bin -a -f $cue ] || exit 1
echo "please insert a cd in your cdwriter, after a keypress we start:"
read -n 1 i
if [ $blank -eq 1 ]; then
cdrdao blank --reload $CDDEV --driver $CDDRV --blank-mode minimal
fi
cdrdao write $overburn --reload $CDDEV --driver $CDDRV $cue
done
exit 0