#!/bin/bash ## Autor: Sertinell# Colaboradores: er Flako, oCHARLIEo## Estamos en http://forums.gentoo.org/########################################################################## special thanks to Prodater64 and Maurus from www.kvcd.net########################################################################## DEPENDENCIAS :# mjpegtools ->> para disponer de mplex Ahora ya no debria ser necesario. Ahora tampoco# mplayer ->> lo normal es que con el venga mencoder# toolame ->> con el codificaremos el audio si es WAV. Ahora ya no# soundtouch ->> OPCIONAL, para cambiar el tempo de sonido y correguir los fps# dvdauthor ->> OPCIONAL Crea la estructura de un DVD de video.# growisofs ->> OPCIONAL Se usa para grabar los DVD's# NO-DEPENDENCIAS : microsoft## This script has not been tested on animals.########################################################################Changelog:####################### Consultar en http://forums.gentoo.org/viewtopic.php?t=232474####################### Variables Globales#######################################################################PROPNAME=`basename $0` # Nombre del ScriptVERSION="0.3.7" # Version del ScriptULTMODIF="26-01-2006" # Fecha de Ultima ModificaciónOUTPUT_ONLY_INFO="no" # Realizar Conversion o Solo InformacionVPASS=2 # Numero de pasadas, a mi me gusta mas 2, pero si no quieres la maxima calidad 1 tarda justo la mitad de tiempo y es una calidad "decente"OUTPUT_V_ASPECT=1.3333 # Aspect ratio 1.3333 para TV normal 1.7777 para paronamicasSOUNDTOUCH="off" # Flag de uso de Soundtouch. Por defecto, desactivado. Ahora mismo no funcionaOUTPUT_A_BITRATE=112 # Bitrate de sonido en mp2, con 112 va sobrado - 32, ,128,192,224,320OUTPUT_A_AC3="no" # salida ac3 - por defecto si, si es posible#por defecto ponemos las variables de DVD... OUTPUT_SIZE=4200 OUTPUT_V_WIDTH=720 OUTPUT_V_HEIGHT=576 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=48000 OUTPUT_OVS=3 MAXBITRATE=10000 #8000 BUFSIZE=1835 MUXBUFSIZE=500 #500 OUTPUT_F_TYPE="MPG2" PLEX=8DVDAUTHOR="N"DVDBURN="N"NUM_FICHEROS=0 # Numero de ficheros de EntradaOUTPUT_DIR="" # Directorio de salida (por defecto es el directorio de entrada)SKIP="" # por defecto mencoder mantiene la duracion del filmeNOMPLEX=0 #Por defecto Multiplexamos los archivosclear# Mensaje de Ayuda#######################################################################function func_msg_help() { cat << EOHelp El script $PROPNAME codifica uno o varios ficheros AVI en formato compatible para su reproduccion en un DVD domestico.\n USO: $PROPNAME [[opciones]] <ficheros>\n opciones: -h|-help|--help Este mensaje. -i|--info Solo Informacion. No se realiza ninguna operacion. -of|--output_format <formato> Especifica Formato de Salida (DVD,SVCD,VCD). Tambien permite resolucion personalizada mediante el formato de salida : USER:<width>x<height> , por ejemplo: (Experimental) -of user:352x576 -os|--output_size <tamaño> Tamaño final de cada archivo, en megabytes. -od|--output_dir /ruta/a/directorio/existente Redirige la salida al directorio indicado. -p|--pass <1|2> Numero de pasadas para el video (por defecto 2) --interval [[inicio]]:frames Marca un intervalo para codificar. Inicio es una posicion en segundos y frames es el numero de frames a procesar , por ejemplo: --interval :200 -> codifica los primeros 200 frames. --no_ac3 Salida de sonido MP2 , incluso si el origen incluye mas de 2 canales. --soundtouch (Experimental) Utiliza la libreria sountouch para codificar cambiando el tempo, POR DEFECTO DESACTIVADA --aspect <n|p> Aspect ratio n -> 1.3333 para TV normal p -> 1.7777 para paronamicas. Por defecto n -> 4:3 (1.3333) --nomplex No multiplexa el audio con el video, por defecto los multiplexa en un solo archivo. --fuckdvd|-fd Crea la esturctura de DVD con dvdauthor con todos los ficheros mpeg qe haya en el directorio /OUTDIR/DVD_VIDEO, sin menus, ni capitulos,y en orden estrictamente alfabetico. Funciona independientemente de la codificacion, se ejecuta al final del script excepto si se uso -i. Si los mpeg fueron creados con este script mediante -of *DVD, la multiplexacion sera correcta (mplex -f8) y el DVD sera creado correctamente, si existen otros ficheros mpg's en el directorio no multiplexados debidamente, dvdauthor fallara. --burndvd|-bd Graba el DVD creado por --fuckdvd, -bd implica -fd. <ficheros> es el nombre de uno o mas ficheros separados por espacios. Admite el uso de comodines.EOHelp exit 1}# Funcion que Comprueba el espacio Libre####################################################################### el espacio necesario para la conversion es la suma de OUTPUT_SIZE y el propio fichero X 2function func_check_Free_Disk_Space() { # Parametros de entrada: # $1 -> es el nombre del video a convertir local FILE_INPUT=$1 local FILE_INPUT_SIZE=`du -s $FILE_INPUT | cut -f1` # tamaño del fichero # el fichero de salida en MB + los temporales + el propio fichero y a numero entero local MAX_FILE_SIZE=`echo "scale=0; (($OUTPUT_SIZE*1024)+($FILE_INPUT_SIZE*2))/1" | bc -l` # espacio libre en la particion if [[ "$OUTPUT_DIR" == "" ]]; then FREE_DISK_SPACE=$(df $FILE_INPUT | grep /dev | tr -s ' ' ' ' | cut -d' ' -f4) else FREE_DISK_SPACE=$(df $OUTPUT_DIR | grep /dev | tr -s ' ' ' ' | cut -d' ' -f4) fi FREE_DISK_SPACE=`echo "scale=0; $FREE_DISK_SPACE/1"| bc -l` # a entero , por si acaso # informamos del espacio libre y el necesario,se ve tb con la opcion "--info" (para eso es info) echo -e "\n# El fichero $FILE_INPUT es de `echo "scale=2; $FILE_INPUT_SIZE/1024"| bc -l` MB" if [[ $DVDAUTHOR=="Y" ]]; then MAX_FILE_SIZE=$((${MAX_FILE_SIZE}*2)) fi echo -e "# Necesario: $(echo "scale=2; $MAX_FILE_SIZE/1024"| bc -l) MB" echo -e "# Disponible: $(echo "scale=2; $FREE_DISK_SPACE/1024"| bc -l) MB" # comprobamos si tenemos suficiente espacio en la particion if [[ $FREE_DISK_SPACE -lt $MAX_FILE_SIZE ]]; then echo -e "\n# NO TIENE ESPACIO SUFICIENTE " echo -e "# Libere espacio en la particion antes de continuar o utilice opciones" echo -e "# --output_size , --output_format o --output_dir ." # exit 1 # Salir?? fi}# Funcion de Recogida de Datos######################################################################## Extrae los datos del supuesto fichero de video. Si el fichero no es un video devuelve FALSEfunction func_Get_Info() { # Parametros de entrada: # $1 -> es el nombre del video a convertir local FILE_INPUT=$1 local INFO_MPLAYER="/tmp/mplayer_info" # Extraemos la informacion via mplayer mplayer -slave -vo null -ao null -frames 0 -identify $FILE_INPUT 2>/dev/null | grep ^ID > $INFO_MPLAYER if [[ -s $INFO_MPLAYER ]]; then # while read; do # [[ -z "${REPLY}" ]] || local "${REPLY%%=*}"="${REPLY##*=}" # done < ${INFO_MPLAYER} INPUT_V_CODEC=${ID_VIDEO_FORMAT} INPUT_V_BITRATE=${ID_VIDEO_BITRATE} INPUT_V_FPS=${ID_VIDEO_FPS} INPUT_V_WIDTH=${ID_VIDEO_WIDTH} INPUT_V_HEIGHT=${ID_VIDEO_HEIGHT} INPUT_V_RES="${INPUT_V_WIDTH}x${INPUT_V_HEIGHT}" # Audio INPUT_A_CODEC=${ID_AUDIO_CODEC} INPUT_A_FORMAT=${ID_AUDIO_FORMAT} INPUT_A_SAMPLERATE=${ID_AUDIO_RATE} INPUT_A_CANALES=${ID_AUDIO_NCH} INPUT_A_BITRATE=${ID_AUDIO_BITRATE} # Duracion del Video en segundos INPUT_TIME=${ID_LENGTH} # Borramos el fichero temporal rm -f $INFO_MPLAYER 2>/dev/null return 0 else # Mplayer no ha podido obtener informacion del fichero de entrada. Es un video?. No se seguira procesando... return 1 fi}# Funcion de Muestra de Datos######################################################################## Muestra el formato de Entrada del Fichero de Videofunction func_Muestra_Info() { echo -e "############################################" echo -e "# Video: " echo -e "# Codec:\t\t${INPUT_V_CODEC}" echo -e "# Resolución:\t${INPUT_V_RES}" echo -e "# Fps:\t\t${INPUT_V_FPS}" echo -e "# Bitrate:\t\t${INPUT_V_BITRATE}" echo -e "############################################" echo -e "# Audio: " echo -e "# Codec:\t\t${INPUT_A_CODEC}" echo -e "# SampleRate:\t${INPUT_A_SAMPLERATE}" echo -e "# Bitrate:\t\t${INPUT_A_BITRATE} (${INPUT_A_FORMAT})" echo -e "# Canales:\t\t${INPUT_A_CANALES}" echo -e "############################################" echo -e "# Duracion:\t${INPUT_TIME} segundos" echo -e "############################################"}# Funcion que Establece las Variables para el Formato de Salida#######################################################################function func_Establece_Output_Format() { # Parametros de entrada: # $1 -> es el nombre del Formato de Salida case "$1" in "DVD" | "dvd") #Formato DVD OUTPUT_SIZE=4200 OUTPUT_V_WIDTH=720 OUTPUT_V_HEIGHT=576 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=48000 OUTPUT_OVS=3 MAXBITRATE=10000 #8000 BUFSIZE=1835 MUXBUFSIZE=500 #500 OUTPUT_F_TYPE="MPG2" PLEX=8 ;; "HDVD" | "hdvd") #Formato hDVD OUTPUT_SIZE=4200 OUTPUT_V_WIDTH=352 OUTPUT_V_HEIGHT=576 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=48000 OUTPUT_OVS=3 MAXBITRATE=10000 #8000 BUFSIZE=1835 MUXBUFSIZE=500 #500 OUTPUT_F_TYPE="MPG2" PLEX=8 ;; "SVCD" | "svcd") #Formato SVCD OUTPUT_SIZE=800 OUTPUT_V_WIDTH=480 OUTPUT_V_HEIGHT=576 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=44100 OUTPUT_OVS=2 MAXBITRATE=3000 #2500 BUFSIZE=917 MUXBUFSIZE=230 OUTPUT_A_AC3="no" OUTPUT_F_TYPE="MPG2" PLEX=5 ;; "CVD" | "cvd") #Formato SVCD OUTPUT_SIZE=800 OUTPUT_V_WIDTH=352 OUTPUT_V_HEIGHT=576 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=44100 OUTPUT_OVS=2 MAXBITRATE=3000 #2500 BUFSIZE=917 MUXBUFSIZE=230 OUTPUT_A_AC3="no" OUTPUT_F_TYPE="MPG2" PLEX=5 ;; "VCD" | "vcd") #Formato VCD. OUTPUT_SIZE=800 OUTPUT_V_WIDTH=352 OUTPUT_V_HEIGHT=288 OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg1video" OUTPUT_A_SAMPLERATE=44100 OUTPUT_OVS=1 MAXBITRATE=3000 # 1500 BUFSIZE=327 MUXBUFSIZE=230 #115 OUTPUT_A_AC3="no" OUTPUT_F_TYPE="MPG1" PLEX=2 ;; "USER:"* | "user:"*) #Formato de usuario. Width & Height establecidos por usuario, resto de parametros como un DVD... OUTPUT_SIZE=4200 OUTPUT_V_RES=${1:5} OUTPUT_V_WIDTH=${OUTPUT_V_RES%x*} OUTPUT_V_HEIGHT=${OUTPUT_V_RES#*x} OUTPUT_V_FPS=25.000 OUTPUT_V_CODEC="mpeg2video" OUTPUT_A_SAMPLERATE=48000 OUTPUT_OVS=3 MAXBITRATE=10000 #8000 BUFSIZE=1835 MUXBUFSIZE=460 #500 OUTPUT_F_TYPE="MPG2" PLEX=8 ;; esac}# Funcion de Ajuste de Variables Globales#######################################################################function func_Adjust_var() { ## Video # Redimensionamiento de la imagen de Salida BASE_SCALED=$((${OUTPUT_V_WIDTH}-${OUTPUT_OVS}*8)) #multiplicamos el overscan por 8(4 pixeles a cada lado)# BASE_SCALED=`echo "scale=0 ; (($BASE_C)*($SCALE_C))/1"| bc -l`# x=`echo "(320*$INPUT_V_HEIGHT/$INPUT_V_WIDTH)"| bc -l`# y=`echo "($BASE_SCALED*$x/320)"| bc -l`# z=`echo "(($OUTPUT_V_HEIGHT*$y)/($BASE_SCALED/$OUTPUT_V_ASPECT))"| bc -l` z=`echo "(($OUTPUT_V_HEIGHT*$INPUT_V_HEIGHT*$OUTPUT_V_ASPECT)/($INPUT_V_WIDTH))"| bc -l`# Esto no distorsiona# z=`echo "(($INPUT_V_HEIGHT*$BASE_SCALED)/($INPUT_V_WIDTH))"| bc -l` ALTURA_SCALED=$((`echo "scale=0 ; $z/8"| bc -l`*8)) echo -e "\n# Escalando Video -> Width:$BASE_SCALED Height:$ALTURA_SCALED" SWS=9 # Tipo de Escalado Software... OUTPUT_V_BITRATE=$(echo "(( $OUTPUT_SIZE * 1024 * 8 ) / ( $INPUT_TIME ))-$OUTPUT_A_BITRATE"| bc -l) OUTPUT_V_BITRATE=${OUTPUT_V_BITRATE%.*} if [[ $OUTPUT_V_BITRATE -gt $MAXBITRATE ]]; then OUTPUT_V_BITRATE=$MAXBITRATE fi echo "# Video Bitrate: ${OUTPUT_V_BITRATE}" LMIN=1 if (( $OUTPUT_V_BITRATE > 800 )); then LMIN=0.5 fi if (( $OUTPUT_V_BITRATE > 1000 )); then LMIN=0.4 fi if (( $OUTPUT_V_BITRATE > 1800 )); then LMIN=0.3 fi if (( $OUTPUT_V_BITRATE > 3000 )); then LMIN=0.1 fi if (( $OUTPUT_V_BITRATE > 4000 )); then LMIN=0.01 fi # Filtros de Salida VF="harddup,yuvcsp,pp=hb:100:100/vb/dr,hqdn3d=10:0:5,scale=$BASE_SCALED:$ALTURA_SCALED:0:0:9,noise=5u,expand=$OUTPUT_V_WIDTH:$OUTPUT_V_HEIGHT:-1:-1:0" case "$OUTPUT_V_FPS" in "25.000") KEYINT=15 ;; "23.976") KEYINT=18 ;; "29.970") KEYINT=18 ;; *) KEYINT=18;; esac ## Audio if [[ $INPUT_A_CANALES -gt 2 ]]; then if [[ "$INPUT_A_CODEC" != "a52" || "$INPUT_A_CODEC" != "ac3" ]]; then OUTPUT_A_AC3="no" fi else echo -e "\n# Detectado 2 canales o menos. Se fuerza salida a MP2" OUTPUT_A_AC3="no" fi if [[ "$INPUT_V_FPS" != "$OUTPUT_V_FPS" ]] && [[ "${SOUNDTOUCH}" == "on" ]] ; then SKIP="-noskip" TEMPO=`echo " ( 1- ( ${INPUT_V_FPS}/${OUTPUT_V_FPS} ) ) * 100 " | bc -l` fi if [[ "${INPUT_A_SAMPLERATE}" != "${OUTPUT_A_SAMPLERATE}" ]] ; then RESAMPLE=",resample=${OUTPUT_A_SAMPLERATE}:0:0" else RESAMPLE="" fi}# Funcion de Codificacion del Audio#######################################################################function func_Convert_Audio() { # Parametros de entrada: # $1 -> es el nombre del video a convertir # $2 -> es el nombre del video de salida local FILE_INPUT=$1 local FILE_OUTPUT=$2if [[ "$INPUT_V_FPS" != "$OUTPUT_V_FPS" ]] && [[ "${SOUNDTOUCH}" == "on" ]]; then mkfifo -m 660 "${FILE_OUTPUT}.wav" mplayer $INTERVAL -slave -nojoystick -nolirc -quiet -vc dummy -vo null -af lavcresample=$OUTPUT_A_SAMPLERATE:16:1,channels=2 -ao pcm:waveheader:file="$FILE_OUTPUT.wav" "$FILE_INPUT" & soundstretch "${FILE_OUTPUT}.wav" "${FILE_OUTPUT}.sync.wav" -tempo=${TEMPO} rm "${FILE_OUTPUT}.wav" toolame -m d -b $OUTPUT_A_BITRATE -e "${FILE_OUTPUT}.sync.wav" "${FILE_OUTPUT}.mpa"else if [[ $OUTPUT_A_AC3 = "no" ]]; then echo -e "\n# Extrayendo audio a formato MP2" mplayer $INTERVAL -slave -nojoystick -nolirc -quiet -vc dummy -vo null -af lavcresample=$OUTPUT_A_SAMPLERATE:16:1,channels=2 -ao pcm:waveheader:file="$FILE_OUTPUT.wav" "$FILE_INPUT" toolame -m d -b $OUTPUT_A_BITRATE -e "${FILE_OUTPUT}.wav" "${FILE_OUTPUT}.mpa" # Si el toolame da problemas usar mp2enc... #mp2enc -v 1 -s -e -r 44100 -b $OUTPUT_A_BITRATE -m -o "$FILE_OUTPUT.mpa" < "$FILE_OUTPUT.wav" rm "${FILE_OUTPUT}.wav" else echo -e "\n# Extrayendo audio a formato AC3" mplayer -slave "$FILE_INPUT" -dumpaudio fifi}# Funcion de Codificacion del Video, del Audio y Multiplexacion de ambos#######################################################################function func_Convert_Video() { # Parametros de entrada: # $1 -> es el nombre del video a convertir # $2 -> es el nombre del video de salida local FILE_INPUT=$1 local FILE_OUTPUT=$2 local OPCION_VPASS="" # Esta variable sirve para decirle a mencoder cuantas pasadas queremos if [[ "$INTERVAL" != "" ]] ; then # Si queremos un Intervalo" INPUT="$FILE_INPUT.stream_video.avi" echo -e "\n# Framerate incorrecto o especificado intervalo de codificacion." echo -e "# Sacando Video por pipe: $INPUT" mkfifo -m 660 "$INPUT" else INPUT=$FILE_INPUT #si no lo hacemos mencoder busca $INPUT y es "" fiif [[ $VPASS = 2 ]]; then# Dos pasadas , esta es la primeraif [[ "$INTERVAL" != "" ]] ; then # Si los FPS son incorrectos o queremos un Intervalo" echo "# Cambiando FPS - $FILE_INPUT -> $INPUT" mencoder -quiet $INTERVAL -oac copy -ovc copy -ofps $OUTPUT_V_FPS $FILE_INPUT -o "$INPUT" 1>/dev/null 2>/dev/null &fiecho -e "\n# Sacando Estadisticas del fichero de Video"echo "# Mencoder - 1" mencoder -of rawvideo -sws $SWS -nosound -noaspect -noautoexpand -vf $VF -ovc lavc -lavcopts vcodec=${OUTPUT_V_CODEC}:vrc_eq=tex:vmax_b_frames=2:preme=2:precmp=2:vstrict=-1:scplx_mask=0.3:vqblur=0:mbqmin=1:vqmin=1:lmin=${LMIN}:vpass=1:vrc_buf_size=${BUFSIZE}:vbitrate=${OUTPUT_V_BITRATE}:vrc_maxrate=${MAXBITRATE}:aspect=${OUTPUT_V_ASPECT}:keyint=${KEYINT}:turbo:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79:inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -fps $INPUT_V_FPS -ofps $OUTPUT_V_FPS "$INPUT" -o "/dev/null"fiecho -e "\n# Codificando el Video ${FILE_OUTPUT}.mpv"if [[ "$INTERVAL" != "" ]] ; then # Si queremos un Intervalo" echo "# Cambiando FPS - $FILE_INPUT -> $INPUT" mencoder -quiet $INTERVAL -oac copy -ovc copy -ofps $OUTPUT_V_FPS $FILE_INPUT -o "$INPUT" 1>/dev/null 2>/dev/null & fiecho "# Mencoder - 2" mencoder -of rawvideo -sws $SWS -nosound -noaspect -noautoexpand -vf $VF -ovc lavc -lavcopts vcodec=${OUTPUT_V_CODEC}:vrc_eq=tex:vmax_b_frames=2:preme=2:precmp=2:vstrict=-1:scplx_mask=0.3:vqblur=0:mbqmin=1:vqmin=1:lmin=${LMIN}:vpass=${VPASS}:vrc_buf_size=${BUFSIZE}:vbitrate=${OUTPUT_V_BITRATE}:vrc_maxrate=${MAXBITRATE}:aspect=${OUTPUT_V_ASPECT}:keyint=${KEYINT}:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79:inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -fps $INPUT_V_FPS -ofps $OUTPUT_V_FPS "$INPUT" -o "${FILE_OUTPUT}.mpv"if [[ "$INTERVAL" != "" ]] ; then echo "# Borrando $INPUT" rm -f "$INPUT" 2>/dev/nullfiecho "# Borrando divx2pass.log"rm -f "divx2pass.log" 2>/dev/null# Multiplexerif [[ "$NOMPLEX" == 0 ]] ; thenecho -e "\n# Multiplexando Video y audio $FILE_INPUT"if [[ $OUTPUT_A_AC3 = "no" ]]; then mplex -f ${PLEX} -r "$MAXBITRATE" -v 1 -b ${MUXBUFSIZE} -V -p 1 -h -o "${FILE_OUTPUT}.mpg" "${FILE_OUTPUT}.mpv" "${FILE_OUTPUT}.mpa" echo "# Borrando ${FILE_OUTPUT}.mpa" rm -f "${FILE_OUTPUT}.mpa" 2>/dev/nullelse mplex -f ${PLEX} -r "$MAXBITRATE" -v 1 -b ${MUXBUFSIZE} -V -p 1 -h -o "${FILE_OUTPUT}.mpg" "${FILE_OUTPUT}.mpv" "stream.dump" echo "# Borrando stream.dump" rm "stream.dump"fi# borramos los ficheros temporalesecho "# Borrando ${FILE_OUTPUT}.mpv"rm -f "${FILE_OUTPUT}.mpv" 2>/dev/nullfi}# Funcion Principal de Conversion######################################################################## Esta funcion es la encargada de llamar a las demas para obtener la informacion y tratar Video y audiofunction func_Convierte_fichero() { # Parametros de entrada: # $1 -> es el nombre del video a convertir local FILE_INPUT=$1 if [[ "$OUTPUT_DIR" != "" ]]; then BASE_FILE_INPUT="`basename \"$FILE_INPUT\"`" echo $OUTPUT_DIR | grep "/$" >/dev/null RES=$? # Valor de retorno de la funcion anterior if [[ $RES == 0 ]]; then # Compruebo si el nombre del directorio Termina en / local FILE_OUTPUT="${OUTPUT_DIR}${BASE_FILE_INPUT%.*}" else local FILE_OUTPUT="${OUTPUT_DIR}/${BASE_FILE_INPUT%.*}" fi else local FILE_OUTPUT=${FILE_INPUT%.*} fi # Si el parametro es un fichero que existe... if [[ -f "${FILE_INPUT}" ]]; then func_Get_Info "${FILE_INPUT}" RES=$? # Valor de retorno de la funcion anterior if [[ $RES == 0 ]]; then # Si he especificado un intervalo, lo recorto ahora y lo vuelco a un temporal para trabajar con el if [[ "$INTERVAL" != "" ]]; then mencoder -quiet $INTERVAL -oac copy -ovc copy "$FILE_INPUT" -o "$FILE_OUTPUT.interval" 1>/dev/null 2>/dev/null FILE_INPUT="$FILE_OUTPUT.interval" fi func_Muestra_Info func_check_Free_Disk_Space $FILE_INPUT func_Adjust_var if [[ "$OUTPUT_ONLY_INFO" == "no" ]]; then func_Convert_Audio $FILE_INPUT $FILE_OUTPUT func_Convert_Video $FILE_INPUT $FILE_OUTPUT fi # Borramos el fichero creado por el intervalo... si no existe la salida de error es redirigida rm -f "$FILE_OUTPUT.interval" 2>/dev/null else echo -e "ERROR: No se pudo recolectar informacion del fichero $FILE_INPUT. ¿Es un fichero de Video?" fi else echo -e "ERROR: El fichero $FILE_INPUT no es accesible o no existe" fi}# Programa Principal#######################################################################echo -e "# $PROPNAME Version: $VERSION -- $ULTMODIF\n"# Si no tenemos argumentos... ERRORif [[ $# -eq 0 ]]; then func_msg_helpfi# Recoleccion de Parametrosuntil [[ -z "$1" ]] ; do case "$1" in "-h" | "-help" | "--help") # Mostrar Mensaje de Ayuda func_msg_help shift ;; "--nomplex") NOMPLEX=1 shift ;; "--soundtouch") SOUNDTOUCH="on" shift ;; "--pass" | "-p") # Establecer numero de pasadas shift VPASS="$1" shift ;; "-i" | "--info") # Salida solo de informacion OUTPUT_ONLY_INFO="yes" shift ;; "--no_ac3") # No quiere sonido ac3 OUTPUT_A_AC3="no" shift ;; "--interval") # Codificar un intervalo de tiempo shift INTERVAL_START=${1%:*} INTERVAL_STOP=${1#*:} if [[ "$INTERVAL_START" == "" ]]; then INTERVAL_START=0 fi if [[ "$INTERVAL_STOP" == "" ]]; then echo -e "\n# Es necesario establecer un numero de frames a procesar dentro del intervalo..." exit 1 fi echo -e "\n# Estableciendo intervalo de compresion: [[${INTERVAL_START}s --- ${INTERVAL_STOP}frames]]" INTERVAL="-ss ${INTERVAL_START} -frames ${INTERVAL_STOP}" shift ;; "--aspect") # Cambio de Aspect ratio shift case "$1" in "p") # formato panoramico OUTPUT_V_ASPECT=1.7777 ;; "n") # 4:3 OUTPUT_V_ASPECT=1.3333 ;; *) # algo otro echo -e "\n# Aspecto $1 desconocido . Usando aspecto $OUTPUT_V_ASPECT por defecto ." ;; esac shift ;; -"of" | "--output_format") # Especifca Formato de salida shift case "$1" in "DVD" | "dvd" | "SVCD" | "svcd" | "CVD" | "cvd" | "HDVD" | "hdvd" | "VCD" | "vcd" | "USER:"* | "user:"*) OUTPUT_FORMAT=$1 echo -e "\n## Estableciendo Formato de Salida a: $OUTPUT_FORMAT" func_Establece_Output_Format $OUTPUT_FORMAT ;; *) echo -e "\n# Formato de Salida: $1, no reconocido. Usando Formato por Defecto: $OUTPUT_FORMAT" ;; esac shift ;; "-os" | "--output_size") # Especifica tamaño final del fichero shift OUTPUT_SIZE=$1 shift ;; "-od" | "--output_dir") # Cambio del directorio de salida shift if [[ -d $1 ]]; then # Si el directorio Existe OUTPUT_DIR=$1 else echo -e "\n# El Directorio de Salida $1 no Existe o el script no tiene acceso a el. Se utilizara el Directorio de Salida por defecto." fi shift ;; "-fd" | "--fuckdvd") # Creacion de la estructura de DVD DVDAUTHOR="Y" shift ;; "-bd" | "--burndvd") DVDAUTHOR="Y" DVDBURN="Y" shift ;; *) # Si no es ninguna opcion soportada se supone que es la ruta a un fichero LISTA_FICHEROS[${NUM_FICHEROS}]=$1 NUM_FICHEROS=$NUM_FICHEROS+1 shift ;; esacdonefor (( i=0 ; i < ${NUM_FICHEROS} ; i=$i+1 )); do echo -e "\n## fichero: ${LISTA_FICHEROS[${i}]}" func_Convierte_fichero ${LISTA_FICHEROS[${i}]}done#Despues de generar los videos generamos la estructura de DVD con TODOS los ficheros MPEG (*.mpg) hayados en el directorio.if [[ ${OUTPUT_ONLY_INFO} != "yes" && ${DVDAUTHOR} == "Y" ]]; then dvdauthor -o "${OUTPUT_DIR}/DVD_VIDEO" *.mpg dvdauthor -T -o "${OUTPUT_DIR}DVD_VIDEO" if [[ $DVDBURN=="Y" ]]; then echo -e "Introduzca un DVD y pulse enter" read growisofs -Z /dev/dvdrw -V "DVD_VIDEO" -dvd-video "${OUTPUT_DIR}DVD_VIDEO" fifi