[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.