[LUG.ro Mix] mpeg, svcd y otras yerbas

lugro-mix@lugro.org.ar lugro-mix@lugro.org.ar
Wed, 01 Jun 2005 17:56:46 -0300


Gente,

	No soy un activo participante de la lista... Pero creo que este script
les puede ayudar...

http://kvcd4nix.sourceforge.net/
o http://freshmeat.net/projects/mkxvcd/

	No pide muchas librerias...

Suerte,

Eugenio


El mié, 01-06-2005 a las 14:29 -0300, Sebastián D. Criado escribió:
> El Martes 31 Mayo 2005 21:29, Ulises Cerviño escribió:
> > Buenas,
> >
> > Resulta que estoy tratando de pasar algunos avis (mpegs, riff, etc.) a
> > SVCD para poder verlos en mi dvd-player (les ruego se abstengan de
> > responder "el mío los lee directamente" "el mío le pongo una feta de
> > paleta y me la lee" etc.).
> Buscando encontré otra receta que tal vez te funcione.
> http://64.233.187.104/search?q=cache:RkUy_Pce92sJ:www.frikis.org/staticp
> ages/index.php%3Fpage%3D20030115025215847+svcd+mplayer+ntsc&hl=es&client
> =firefox
> ---------------------------
> Pasando Divx a VCD, SVCD, CVCD etc.   	  
> Pasando Divx a VCD, SVCD, CVCD etc. por paranouei
> (paranouei_AT_jazzfree.com)
> 
> Esta tarea es posible hacerla bajo linux, incluso se puede automatizar
> para no 
> tener más que teclear p.ej. divx2vcd <archivo.avi>, irte un rato por
> ahí, y 
> al volver tener los archivos .bin y .cue listos para tostar.
> 
> Bien, antes de nada unos conceptos básicos:
> 
> Términos básicos:
> 
> * VCD:Video CD. Se trata de un stream MPEG-1 a 352x288 y 25 fps (PAL) o 
> 352x240 y 29.976 fps (NTSC). El bitrate es constante a 1150kbps y el
> audio es 
> MPEG layer 2 a 224 kbps. Caben tantos minutos de videos como indique el
> CD 
> (74 o 80).
> * SVCD: Super Video CD. Se trata de un stream MPEG-2 a 480x576 y 25 fps
> (PAL) 
> o 480x480 y 29.976 fps (NTSC). El bitrate puede ser variable hasta
> 2600kbps y 
> el audio tambié puede ir de 32 a 384 kbps. Los minutos de video que
> caben 
> dependen del bitrate escogido, aunque suelen estar entre 40 y 55 minutos
> por 
> CD.
> * XVCD, CVCD..:Son modificaciones del estándar con diferentes bitrates,
> etc. y 
> que pueden no funcionar en todos los reproductores DVD. Aunque hoy en
> día los 
> reproductores DVD prácticamente "se lo tragan todo".
> 
> Por ejemplo, el CVCD no es más que un VCD con bitrate variable, con lo
> que se 
> aprovechan las escenas "fáciles" para usar un bitrate más bajo, con lo
> que se 
> aprovecha mejor el espacio. De esta forma podemos meter más de 90
> minutos en 
> un CD.
> 
> 
> Herramientas:
> 
> * Mplayer. Nos servirá como filtro de input para el transcode. De esta
> forma 
> el transcode podrá "comerse" todo lo que puede comerse el mplayer (divx,
> 
> realmedia, subtitulos...).
> * Transcode. Es la herramienta principal. Sirve para transformar entre
> todos 
> los formatos imaginables..
> * MJPEG Tools. Será nuestro filtro de salida. Además, incluye
> herramientas 
> para multiplexar el mpg.
> * VCDImager. Sirve para crear las imagenes .bin .cue a partir del mpg.
> 
> A parte los scripts que incluyo utilizan algunas utilizades básicas como
> bc 
> (calculadora) y perl.
> 
> Bueno, una vez que tenemos esto, vamos al turrón. ;)
> 
> Divx2VCD:
> 
> Me he preparado el siguiente script divx2vcd, el cual se encarga de los 
> cálculos para obtener una imagen con el mismo aspecto (añadiendo bordes 
> negros si hace falta). Usa bitrate constante, de forma que es totalmente
> 
> estándar VCD. El tamaño máximo de cada archivo (para que entre en un CD,
> está 
> en la variable CDSIZE. El script se encarga de crear el video y el audio
> con 
> transcode, luego multiplexarlos con mplex, y finalmente crear las
> imágenes. 
> Lo podéis descargar aquí. Lo pego también aquí para que lo veais:
> 
> -- Inicio divx2vcd --
> 
> #!/bin/bash
> 
> # Este script pasa un Divx a VCD. Para los archivos temporales se
> # necesita al menos 4.5 Gigas (m1v y mpa, los .mpg y los .bin)
> 
> DIR=`pwd`
> TEMPFOLDER=/tmp/divx2vcd-$RANDOM
> CDSIZE=795
> VIDEORATE=1150
> AUDIORATE=224
> 
> if [ $# -eq 0 ]; then
> echo "Usage:"
> echo " divx2vcd <divxfile>"
> exit 1
> fi
> 
> FILE=$1
> if [ "$1" == "`basename $1`" ]; then
> FILE="$DIR/$1"
> fi
> 
> mkdir $TEMPFOLDER
> cd $TEMPFOLDER
> 
> tcprobe -i "$FILE" > $TEMPFOLDER/info
> 
> WIDTH=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /width=(\d+)/ ; print $1' `
> HEIGHT=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /height=(\d+)/ ; print $1' `
> FPS=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /V: (.+?) fps/ ; print $1' `
> FPS_1=`echo "scale=1 ; $FPS/1"| bc -l`
> FRAMES=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /frames=(\d+)/ ; print $1' `
> SEGUNDOS_TOTAL=`echo "scale=0 ; ($FRAMES / $FPS)"| bc -l`
> HORAS=`echo "scale=0 ; ($SEGUNDOS_TOTAL / 3600)"| bc -l`
> MINUTOS=`echo "scale=0 ; (($SEGUNDOS_TOTAL - 3600 * $HORAS)/60)"| bc -l`
> SEGUNDOS=`echo "scale=0 ; ($SEGUNDOS_TOTAL % 60)"| bc -l`
> 
> echo "*************** FILE INFO ***************"
> echo "Frame Size: ${WIDTH}x${HEIGHT} - FPS: $FPS"
> echo "Length: $FRAMES - Seconds: $SEGUNDOS_TOTAL"
> echo "$HORAS hours, $MINUTOS minutes, $SEGUNDOS seconds"
> 
> if [ $FPS_1 == "29.9" -o $FPS_1 == "30" -o $FPS_1 == "23.9" ]; then
> WIDTH_OUT=352
> HEIGHT_OUT=240
> else
> WIDTH_OUT=352
> HEIGHT_OUT=288
> fi
> 
> echo "Video Output: ${WIDTH_OUT}x${HEIGHT_OUT}"
> 
> # Ahora calculamos los valores pa los bordes.
> 
> ANCHO_1_1_OUT=`echo "($HEIGHT_OUT * 4/3)"| bc -l`
> ALTO_OUT=`echo "$HEIGHT / ($WIDTH / $ANCHO_1_1_OUT)" | bc -l`
> # Redondeamos
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT/1"| bc -l`
> # Nos aseguramos de que sea par
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT+$ALTO_OUT%2" | bc -l`
> 
> BORDE=`echo "scale=0 ; ($HEIGHT_OUT-$ALTO_OUT)/2"| bc -l`
> echo "alto sin bordes: $ALTO_OUT, con borde: $BORDE"
> 
> # Borramos Pelicula.m1v y Pelicula.mpa
> rm -f Pelicula.m1v Pelicula.mpa
> 
> 
> cd $TEMPFOLDER
> 
> echo "transcode -i "$FILE" -V -x mplayer -y mpeg2enc,mp2enc -F 1 -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 
> $AUDIORATE -o $DIR/Pelicula -w $VIDEORATE"
> transcode -i "$FILE" -V -x mplayer -y mpeg2enc,mp2enc -F 1 -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 
> $AUDIORATE -o $DIR/Pelicula -w $VIDEORATE
> 
> #transcode -i "$FILE" -V -x mplayer -y mpeg -F $MPEG_OPTIONS -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 
> $AUDIORATE -o $DIR/Pelicula
> 
> rm $TEMPFOLDER/*
> rmdir $TEMPFOLDER
> 
> cd $DIR
> 
> # Si no hay Pelicula.m1v y Pelicula.mpa salir
> [ -f Pelicula.m1v -a -f Pelicula.mpa ] || exit 1
> 
> rm -f Pelicula*.mpg
> 
> #Ahora multiplexamos el .mpg
> mplex -f 1 -m 1 -S $CDSIZE Pelicula.m1v Pelicula.mpa -o Pelicula%d.mpg
> #tcmplex -i Pelicula.m1v -p Pelicula.mpa -o Pelicula.mpg -m 1
> 
> # Y creamos las imagenes...
> for i in `ls Pelicula*mpg` ; do
> vcdimager -t vcd2 -c $i.cue -b $i.bin $i
> done
> -- Final divx2vcd --
> 
> 
> Divx2CVCD:
> 
> Nuevo script Divx2CVCD (16/12/2002). Este script obtiene toda la
> información 
> posible de el .avi, y calcula el bitrate del video automáticamente para
> que 
> quepa en un CD en formato CVCD (VCD con bitrate variable). Se pueden
> probar 
> con distintos valores de la variable QUANTUM. El Quantum, que es la
> calidad 
> (como el CQ-Constant Quality del TMPGEnc), puede ir de 2 a 31, cuanto
> más 
> cercano a 2 más calidad. Con un valor menor de 8 se obtiene buena
> calidad. 
> AUDIORATE también se puede modificar. El script lo podéis descargar de
> aquí, 
> y lo pego a continuación:
> 
> -- Inicio divx2cvcd --
> !/bin/bash
> 
> # Este script pasa un Divx a CVCD. Para los archivos temporales se
> # necesita al menos 4.5 Gigas (m1v y mpa, los .mpg y los .bin)
> 
> DIR=`pwd`
> TEMPFOLDER=/tmp/divx2vcd-$RANDOM
> TEMP_TEMPLATE=/tmp/tcmplex-template-$RANDOM
> CDSIZE=795
> QUANTUM=5
> # Maxrate ahora es automatico
> #MAXRATE=900
> AUDIORATE=128
> 
> if [ $# -eq 0 ]; then
> echo "Usage:"
> echo " divx2cvcd <divxfile>"
> exit 1
> fi
> 
> FILE=$1
> if [ "$1" == "`basename $1`" ]; then
> FILE="$DIR/$1"
> fi
> 
> mkdir $TEMPFOLDER
> cd $TEMPFOLDER
> 
> tcprobe -i "$FILE" > $TEMPFOLDER/info
> 
> WIDTH=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /width=(\d+)/ ; print $1' `
> HEIGHT=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /height=(\d+)/ ; print $1' `
> FPS=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /V: (.+?) fps/ ; print $1' `
> FPS_1=`echo "scale=1 ; $FPS/1"| bc -l`
> FRAMES=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /frames=(\d+)/ ; print $1' `
> SEGUNDOS_TOTAL=`echo "scale=0 ; ($FRAMES / $FPS)"| bc -l`
> HORAS=`echo "scale=0 ; ($SEGUNDOS_TOTAL / 3600)"| bc -l`
> MINUTOS=`echo "scale=0 ; (($SEGUNDOS_TOTAL - 3600 * $HORAS)/60)"| bc -l`
> SEGUNDOS=`echo "scale=0 ; ($SEGUNDOS_TOTAL % 60)"| bc -l`
> 
> VIDEO_RATE=`echo "scale=0 ;(($CDSIZE * 1024 - 
> ($AUDIORATE/8*$SEGUNDOS_TOTAL))*8 / $SEGUNDOS_TOTAL)"| bc -l`
> # +5%
> MAXRATE=`echo "scale=0 ; ($VIDEO_RATE * 105 / 100)" | bc -l`
> 
> echo "*************** FILE INFO ***************"
> echo "Frame Size: ${WIDTH}x${HEIGHT} - FPS: $FPS"
> echo "Length: $FRAMES - Seconds: $SEGUNDOS_TOTAL"
> echo "$HORAS hours, $MINUTOS minutes, $SEGUNDOS seconds"
> echo "Recommended averagge video bitrate: $VIDEO_RATE"
> echo "Using max video bitrate: $MAXRATE"
> 
> 
> if [ $FPS_1 == "29.9" -o $FPS_1 == "30" -o $FPS_1 == "23.9" ]; then
> WIDTH_OUT=352
> HEIGHT_OUT=240
> else
> WIDTH_OUT=352
> HEIGHT_OUT=288
> fi
> 
> echo "Video Output: ${WIDTH_OUT}x${HEIGHT_OUT}"
> 
> # Ahora calculamos los valores pa los bordes.
> 
> ANCHO_1_1_OUT=`echo "($HEIGHT_OUT * 4/3)"| bc -l`
> ALTO_OUT=`echo "$HEIGHT / ($WIDTH / $ANCHO_1_1_OUT)" | bc -l`
> # Redondeamos
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT/1"| bc -l`
> # Nos aseguramos de que sea par
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT+$ALTO_OUT%2" | bc -l`
> 
> BORDE=`echo "scale=0 ; ($HEIGHT_OUT-$ALTO_OUT)/2"| bc -l`
> 
> echo "alto sin bordes: $ALTO_OUT, con borde: $BORDE"
> 
> # Borramos Pelicula.m1v y Pelicula.mpa
> rm -f Pelicula.m1v Pelicula.mpa
> 
> 
> cd $TEMPFOLDER
> #echo "transcode -i "$FILE" -V -x mplayer -y mpeg2enc,mp2enc -F 0,"-q 7"
> -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 160 
> -o $DIR/Pelicula -w $MAXRATE"
> transcode -i "$FILE" -V -x mplayer -y mpeg2enc,mp2enc -F 2,"-q $QUANTUM"
> -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 
> $AUDIORATE -o $DIR/Pelicula -w $MAXRATE
> 
> rm $TEMPFOLDER/*
> rmdir $TEMPFOLDER
> 
> cd $DIR
> 
> 
> # Si no hay Pelicula.m1v y Pelicula.mpa salir
> [ -f Pelicula.m1v -a -f Pelicula.mpa ] || exit 1
> 
> rm -f Pelicula*.mpg
> 
> #Ahora multiplexamos el .mpg
> #mplex -f 2 -m 1 -V -S $CDSIZE -r $MAXRATE Pelicula.m1v Pelicula.mpa -o 
> Pelicula%d.mpg
> 
> echo "maxFileSize = $CDSIZE" > $TEMP_TEMPLATE
> tcmplex -i Pelicula.m1v -p Pelicula.mpa -o Pelicula.mpg -m 1 -F
> $TEMP_TEMPLATE
> rm $TEMP_TEMPLATE
> 
> 
> # Y creamos las imagenes...
> for i in `ls Pelicula*.mpg` ; do
> vcdimager -t vcd2 -c $i.cue -b $i.bin $i
> done
> 
> 
> 
> -- Final divx2cvcd --
> 
> 
> 
> Divx2SVCD:
> 
> Para pasar a SVCD es básicamente el mismo script sólo que adaptado para
> crear 
> un SVCD. Los valores que se puden modificar son CDSIZE, QUANTUM,
> MAXVIDEORATE 
> y AUDIORATE. Ya no hace falta crear un template porque lo crea 
> automáticamente. Igual que antes, os podéis descargar el script de aquí,
> y 
> además lo pego a continuación:
> 
> -- Inicio divx2svcd --
> 
> #!/bin/bash
> 
> # Este script pasa un Divx a SVCD. Para los archivos temporales se
> # necesita al menos 4.5 Gigas (m2v y mpa, los .mpg y los .bin)
> 
> DIR=`pwd`
> TEMPFOLDER=/tmp/divx2svcd-$RANDOM
> TEMPLATE=$TEMPFOLDER/template
> CDSIZE=795
> QUANTUM=7
> MAXVIDEORATE=4000000
> AUDIORATE=160
> 
> if [ $# -eq 0 ]; then
> echo "Usage:"
> echo " divx2svcd <divxfile>"
> exit 1
> fi
> 
> 
> FILE=$1
> if [ "$1" == "`basename $1`" ]; then
> FILE="$DIR/$1"
> fi
> 
> 
> mkdir $TEMPFOLDER
> cd $TEMPFOLDER
> 
> # Create a template for bbmpeg encoder
> echo "quant_value = $QUANTUM" > $TEMPLATE
> echo "max_bitrate = $MAXVIDEORATE" >> $TEMPLATE
> echo "maxFileSize = $CDSIZE" >> $TEMPLATE
> 
> echo "Dir: $DIR"
> echo "Temp: $TEMPFOLDER"
> tcprobe -i "$FILE" > $TEMPFOLDER/info
> 
> WIDTH=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /width=(\d+)/ ; print $1' `
> HEIGHT=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /height=(\d+)/ ; print $1' `
> FPS=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN> ;
> $line 
> =~ /V: (.+?) fps/ ; print $1' `
> FPS=`echo "scale=1 ; $FPS/1"| bc -l`
> FRAMES=`grep '\[avilib\] V:' $TEMPFOLDER/info | perl -e ' $line=<STDIN>
> ; 
> $line =~ /frames=(\d+)/ ; print $1' `
> SEGUNDOS_TOTAL=`echo "scale=0 ; ($FRAMES / $FPS)"| bc -l`
> HORAS=`echo "scale=0 ; ($SEGUNDOS_TOTAL / 3600)"| bc -l`
> MINUTOS=`echo "scale=0 ; (($SEGUNDOS_TOTAL - 3600 * $HORAS)/60)"| bc -l`
> SEGUNDOS=`echo "scale=0 ; ($SEGUNDOS_TOTAL % 60)"| bc -l`
> 
> echo "*************** FILE INFO ***************"
> echo "Frame Size: ${WIDTH}x${HEIGHT} - FPS: $FPS"
> echo "Length: $FRAMES - Seconds: $SEGUNDOS_TOTAL"
> echo "$HORAS hours, $MINUTOS minutes, $SEGUNDOS seconds"
> 
> if [ $FPS == "29.9" -o $FPS == "30" -o $FPS == "23.9" ]; then
> WIDTH_OUT=480
> HEIGHT_OUT=480
> MPEG_OPTIONS=s,2,$TEMPLATE
> else
> WIDTH_OUT=480
> HEIGHT_OUT=576
> MPEG_OPTIONS=s,3,$TEMPLATE
> fi
> 
> echo "Salida: $WIDTH_OUT x $HEIGHT_OUT"
> 
> # Ahora calculamos los valores pa los bordes.
> 
> ANCHO_1_1_OUT=`echo "($HEIGHT_OUT * 4/3)"| bc -l`
> ALTO_OUT=`echo "$HEIGHT / ($WIDTH / $ANCHO_1_1_OUT)" | bc -l`
> # Redondeamos
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT/1"| bc -l`
> # Nos aseguramos de que sea par
> ALTO_OUT=`echo "scale=0 ; $ALTO_OUT+$ALTO_OUT%2" | bc -l`
> 
> BORDE=`echo "scale=0 ; ($HEIGHT_OUT-$ALTO_OUT)/2"| bc -l`
> echo "alto sin bordes: $ALTO_OUT, con borde: $BORDE"
> 
> # Borramos Pelicula.m1v y Pelicula.mpa
> rm -f Pelicula.m2v Pelicula.mpa
> 
> 
> cd $TEMPFOLDER
> echo "Ejecutando: transcode -i "$FILE" -V -x mplayer -y mpeg -F
> $MPEG_OPTIONS 
> -Z ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100
> -b 
> $AUDIORATE -o $DIR/Pelicula"
> transcode -i "$FILE" -V -x mplayer -y mpeg -F $MPEG_OPTIONS -Z 
> ${WIDTH_OUT}x$ALTO_OUT -Y -$BORDE,0,-$BORDE,0 --export_asr 2 -E 44100 -b
> 
> $AUDIORATE -o $DIR/Pelicula
> rm $TEMPFOLDER/*
> rmdir $TEMPFOLDER
> 
> cd $DIR
> 
> [ -f Pelicula.m2v -a -f Pelicula.mpa ] || exit 1
> 
> rm -f Pelicula*.mpg
> 
> #Ahora multiplexamos el .mpg
> tcmplex -i Pelicula.m2v -p Pelicula.mpa -o Pelicula.mpg -m s -F
> $TEMPLATE
> 
> 
> # Y creamos las imagenes...
> for i in `ls Pelicula*mpg` ; do
> vcdimager -t svcd -c $i.cue -b $i.bin $i
> done
> 
> 
> 
> -- Final divx2svcd --
> 
> 
> 
> Subtítulos:
> 
> Si tenemos un divx en otro idioma, y a parte tenemos un archivo con 
> subtítulos, también es posible meterlos al crear el *VCD. Los subtítulos
> 
> quedarán grabados encima de la película, formando parte de ella (es
> decir, 
> que no se pueden quitar).
> 
> Bien, el método es muy sencillo, basta tener los subtítulos en un
> formato que 
> esté soportado por mplayer (subrip, microdvd... soporta casi todos), y
> poner 
> el archivo en el mismo directorio que el .avi, y renombrar el archivo de
> 
> subtítulos de forma que tenga exactamente el mismo nombre que el .avi
> (salvo 
> la extensión, claro). De esta forma conseguimos que mplayer reproduzca 
> automáticamente los subtítulos. Si queréis podeis comprobar antes de 
> "transcodear" que al lanzar mplayer <archivo.avi> los subtítulos son 
> cargados.
> 
> Bueno, espero que os haya servido de ayuda esta mini-guía y los scripts.
> ----------------------------
> Saludos.-
> Saludos.-
-- 
Saludos,

Eugenio Oliveri
oli_at_bancobsf_dot_com_dot_ar
Adm de Redes
Nuevo Banco de Santa Fe S.A.
+54-341-429-4495
San Martín 715 - 3er. Piso
S2000CJI - Rosario
Argentina

---
Teamwork is essential -- it allows you to blame someone else.