De DivX a SVCD en GNU/Linux

Estado
Cerrado para nuevas respuestas

LordSauron

Señor Oscuro
Miembro
Sacado de Linux Media

Para pasar a SVCD es básicamente el mismo script que para CVCD 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.

-- 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 y in `ls Pelicula*mpg` ; do

* * * * vcdimager -t svcd -c $i.cue -b $i.bin $i

done

-- Final divx2svcd --
</stdin></stdin></stdin></stdin></divxfile>
 
Última edición por un moderador:
Estado
Cerrado para nuevas respuestas
Arriba Pie