Mercurial > mplayer.hg
view TOOLS/mencvcd.sh @ 27518:e54c9b7eb0d8
Revert bad changes to SSA/ASS subtitle packet format
The following commits are reverted partially or completely:
"a valid ASS line contains 9 ',' before actual text"
"demux_mkv: output correctly formated ASS packets"
"libass: add a new ass_process_data() to process demuxed subtitle packets"
These commits converted the internal representation of SSA/ASS
subtitle packets from the format used by Matroska to a custom format
where each packet has contents exactly matching one line in complete
SSA script files. AFAIK no files natively use such a format for muxed
subtitles. The stated reason for this change was to use a format that
could in principle be muxed into a maximal number of containers. SSA
subtitles do not have an implicit duration so both start time and
duration or end time need to be specified explicitly; the new format
moved timing information inside the codec packet data so it could be
muxed without modification into containers that can represent only
start time at the container level. However such a change is wrong from
the viewpoint of program architecture. Timing information belongs to
the demuxer level, but these commits moved not only the duration but
also the authoritative value of the start time to inside the codec
data. Additionally the new format lost the value of the Matroska
ReadOrder field which is used by MPlayer.
This commit changes the internal packet format back to that used by
Matroska and makes the internal Matroska demuxer output that format
again. Libavformat still outputs the "new" format; it could be
converted back to the Matroska format in demux_lavf.c, but I'm not
adding that code at least yet. The current lavf code has similar
problems as the reverted code in MPlayer, and it also currently fails
to provide any way to access the value of the ReadOrder field. I hope
that the lavf side will be improved; if it isn't conversion can be
added later. For now I'll make MPlayer default to the internal Matroska
demuxer instead of the lavf one in a separate commit.
author | uau |
---|---|
date | Mon, 08 Sep 2008 21:26:22 +0000 |
parents | abd0a4e9daa0 |
children | 0f1b5b68af32 |
line wrap: on
line source
#!/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=$asr / 1000)) ((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