Pasando Divxs a VCD, SVCD, CVCD, etc. en Linux
by paranouei
LinuxMalaga
Noticias(02/12/2004):Nuevo script para crear KVCD, mirad
este thread,
el link con el script está al final
Noticias(06/09/2003): Nuevo script divx2cvcd disponible.
Este nuevo script no utiliza transcode por lo que soporta más formatos y es más configurable.
Noticias(20/01/2003): Nuevo foro disponible.
Aquí puedes preguntar tus dudas acerca de esta guía.
Así que acabas de llegar del Corte Inglés con tu nuevo flamante
reproductor DVD, y ahora te gustaría pasar tus Divx a formato
*VCD para poder disfrutar tus peliculas en el salón de tu casa...
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 TEMP_TEMPLATE=/tmp/tcmplex-template-$RANDOM
# CDSIZE Values. VCDs are write in Mode 2, so the filesizes are the # the following: # 74 Min/650Mb ---> CDSIZE=735 # 80 Min/700Mb ---> CDSIZE=795 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" 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
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 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 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:
Nuevo!! (06/09/2003): Nuevo script divx2cvcd disponible.
Este nuevo script no utiliza transcode por lo que soporta más formatos y es más configurable.
-- 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 Values. VCDs are write in Mode 2, so the filesizes are the # the following: # 74 Min/650Mb ---> CDSIZE=735 # 80 Min/700Mb ---> CDSIZE=795 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 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" 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 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 Values. VCDs are write in Mode 2, so the filesizes are the # the following: # 74 Min/650Mb ---> CDSIZE=735 # 80 Min/700Mb ---> CDSIZE=795 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 "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 "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
cd $DIR
[ -f Pelicula.m2v -a -f Pelicula.mpa ] || exit 1
rm -f Pelicula*.mpg
# Plantilla pa multiplexar echo "maxFileSize = $CDSIZE" >> $TEMPLATE
#Ahora multiplexamos el .mpg tcmplex -i Pelicula.m2v -p Pelicula.mpa -o Pelicula.mpg \ -m s -F $TEMPLATE
rm $TEMPFOLDER/* rmdir $TEMPFOLDER
# 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.
|