CriaDVD 1.0

Publicado por Bruno Nocera Zanette 11/12/2008

[ Hits: 4.587 ]

Download CriaDVD




Esse script converte arquivos AVI para DVD, com Menu, Legenda e Gravação automática do DVD. É baseado no AviDemux e ToVid. Totalmente configurável e fácil de usar.

Usa bastante o "Zenity" para criar janelas de diálogo para perguntas, Avisos, Mostrar o progresso da conversão, Selecionar os arquivos que serão convertidos...

E funciona perfeitamente sem ter que abrir o terminal, basta criar um ícone na área de trabalho e executá-lo.

Qualquer erro diz ai que eu tento arrumar.
Vlwss

  



Esconder código-fonte

#!/bin/bash
#!/usr/bin/env bash
PATH=/usr/share/tovid:$PATH

#############################################################################
# Este programa é software livre, você pode redistribuí-lo ou modificá-lo   #
# sob os termos da GNU General Public License, versão 2 ou qualquer versão  #
# mais recente, conforme publicado pela Free Software Foundation.           #
#############################################################################

#################################################
#                 AVI para DVD              #
#       Feito por: Bruno Nocera Zanette           #
#   Email: brunonzanette@gmail.com          #
#                Data: 11/2008                  #
#                        #
#===============================================#
#                       #   
#                 FINALIDADE:              #
# Esse Script tem como finalidade automatizar   #
# o processo de conversão de arquivos AVI para  #
# DVD, com Menu e Legendas. Para isso utiliza   # 
# um arquivo de configuração criado na          #
# primeira vez que o programa for executado.    #
#                       #
#               COMO EXECUTAR:                #
# Para executar o programa basta escrever no    #
# Terminal:                    #   
# ./CriaDVD <video1> <video2> ...               #
# Onde <video1,2,...> é o nome do filme com o   # 
# caminho.                    #   
# Ex.:                        #   
# ./CriaDVD_gtk ~/viagem.avi ~/Ferias/casa.avi  #
#                   #   
# Ou apenas:               #
# ./CriaDVD_gtk               #
#                  #
#         OPCOES:         #
# -> config : Remove a configuração existente e #
#             cria uma nova configuração   #
#                  #
#################################################         

#################################################
#                DEPENDENCIAS:          #
# - avidemux-cli                 #
# - avidemux-common             # 
# - tovid               #
# - mencoder               #
# - lame               #
# - toolame               #
# - mjpegtools               #
# - imagemagick               #   
# - zenity               #
#################################################

#################################################
# INICIA O PROGRAMA E TESTA SE A PASTA $dir     #
# ESTA CRIADA                                   #
#################################################
user=`ps aux | grep CriaDVD_gtk | grep -m1 bash | tr -s " " | cut -d" " -f1`
dir="/home/$user/.dvd"

if ! [ -d $dir ]
then
   mkdir $dir
fi

if ! [ -d $dir/tmp ]
then
   mkdir $dir/tmp
else
   rm -r $dir/tmp/* 2>/dev/null
fi

if [[ $1 == 'config' && -e $dir/.dvd_config ]]
then
        rm $dir/.dvd_config
fi

if [[ `df -lk | egrep '\/$' | tr -s " " | cut -d" " -f4` -le 10000000 ]]
then
   zenity --info -title "AVI_DVD" --text "O seu HD não possui espaço em disco suficiente (9Gb) para rodar o script.\nLibere mais espaço e tente denovo."
   exit 1
fi

#################################################
# CONFIGURA O PROGRAMA E SALVA A CONFIGURAÇÂO   #
# EM $dir/.dvd_config            #
#################################################
if ! [ -e $dir/.dvd_config ]
then
   #clear
   zenity --info --title "AVI_DVD" --text "Bem Vindo ao AVI_DVD\!\nPor Favor responda o questionário a seguir."

   ###############
   #### VIDEO ####
   ###############
   
   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual formato o seu DVD Player aceita?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" FALSE 1 NTSC FALSE 2 PAL TRUE 2 Ambos`
      case $opcao in
         1) echo "ntsc" >>  $dir/.dvd_config; res=480;;
         2) echo "pal" >> $dir/.dvd_config; res=576;;
         *) echo "ERRO!"; exit 1;;
      esac

   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual codec você deseja usar para o vídeo?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 LAVC FALSE 2 MPEG2Enc`
      case $opcao in
         1) echo "XDVD" >> $dir/.dvd_config;;
         2) echo "DVD" >> $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
      esac
   
   #### CONFIGURA O VIDEO DEPENDENDO DO CODEC ####
   #### CODEC ESCOLHIDO (LAVC / MPEG2ENC)     ####   
   if [[ $opcao == 1 ]]
   then
      opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Que tipo de codificação você deseja?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 Default FALSE 2 TMPGEnc FALSE 3 Anime`
         case $opcao in
                                1) echo "160 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 1f 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 fe ff ff ff 01 00 00 00 fb ff ff ff cd cc 4c 3d 01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f 00 00 00 3f 00 00 00 00 28 23 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 3f 00 00 00 00 00 00 00 3f 00 00 00 00 01 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
                                2) echo "160 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 1f 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 fe ff ff ff 01 00 00 00 fb ff ff ff cd cc 4c 3d 01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f 00 00 00 3f 00 00 00 00 28 23 00 00 01 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 3f 00 00 00 00 00 00 00 3f 00 00 00 00 01 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
            3) echo "160 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 1f 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 fe ff ff ff 01 00 00 00 fb ff ff ff cd cc 4c 3d 01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f 00 00 00 3f 00 00 00 00 28 23 00 00 02 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 3f 00 00 00 00 00 00 00 3f 00 00 00 00 01 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
                                *) echo "ERRO!"; exit 1;;
                        esac

      opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Que tipo de encode você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 "Video Size" FALSE 2 "Bitrate"`
                case $opcao in
                        1) echo "2PASS" >> $dir/.dvd_config;;
                        2) echo "2PASSBITRATE" >> $dir/.dvd_config;;
                        *) echo "ERRO!"; exit 1;;
                esac
   
   else

      opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Que tipo de codificação você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 "Default" FALSE 2 "TMPGEnc" FALSE 3 "Anime"`
                        case $opcao in
                                1) echo "24 28 23 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
                                2) echo "24 28 23 00 00 0c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
                                3) echo "24 28 23 00 00 0c 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00" >> $dir/.dvd_config;;
                                *) echo "ERRO!"; exit 1;;
                        esac

      opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Que tipo de encode você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 "Video Size" FALSE 2 "Bitrate" FALSE 3 "Constant Quality"`
                        case $opcao in
                                1) echo "2PASS" >> $dir/.dvd_config;;
                                2) echo "CBR" >> $dir/.dvd_config;;
            3) echo "CQ" >> $dir/.dvd_config;;
                                *) echo "ERRO!"; exit 1;;
                        esac
   fi
   
   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Que resolução você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 "4:3 (FullScreen)" FALSE 2 "16:9 (WideScreen)"`
      case $opcao in
         1) echo "43" >> $dir/.dvd_config;;
         2) echo "169" >> $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
      esac

   ###############
   #### AUDIO ####
   ###############

   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual codec você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" FALSE 1 "MP2" FALSE 2 "MP2 - TwoLAME" TRUE 3 "AC3"`
      case $opcao in
         1) echo "mp2" >> $dir/.dvd_config;;
         2) echo "twolame" >> $dir/.dvd_config;;
         3) echo "ac3" >> $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
                esac

   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual bitrate você deseja usar?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" FALSE 1 "128" FALSE 2 "192" FALSE 3 "224" TRUE 4 "384"`
      case $opcao in
         1) echo "128" >> $dir/.dvd_config;;
         2) echo "192" >> $dir/.dvd_config;;
         3) echo "224" >> $dir/.dvd_config;;
         4) echo "384" >> $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
                esac

   #################
   #### LEGENDA ####
   #################

   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual fonte você deseja usar para legenda?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" FALSE 1 "Arial" FALSE 2 "Lucida Sans" TRUE 3 "DejaVu" FALSE 4 "Outro"`
      case $opcao in
                        1) echo "/usr/share/fonts/truetype/msttcorefonts/arial.ttf" >> $dir/.dvd_config;;
                        2) echo "/usr/share/fonts/truetype/ttf-lucida/LucidaSansRegular.ttf" >> $dir/.dvd_config;;
         3) echo "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansCondensed-Bold.ttf" >> $dir/.dvd_config;;
                        4) echo `zenity --file-selection --title "AVI_DVD - Escolha a fonte que você deseja usar: (/usr/share/fonts/)"` >>  $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
                esac       
 
   opcao=`zenity --width=350 --height=250 --title "AVI_DVD" --text "Qual cor você prefere para a legenda?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" FALSE 1 "Branco" TRUE 2 "Amarelo" FALSE 3 "Outro"`
      case $opcao in 
                   1) echo "255,255,255" >> $dir/.dvd_config;;
                        2) echo "255,255,000" >> $dir/.dvd_config;;
                        3) echo `zenity --entry --title "AVI_DVD" --text "Digite o número da cor no formato RGB:" --entry-text "RRR:GGG:BBB"` >> $dir/.dvd_config;;
         *) echo "ERRO!"; exit 1;;
      esac
      
   tam_fonte=`zenity --title "AVI_DVD" --text "Qual tamanho da fonte da legenda?" --scale --value=26`
   echo $tam_fonte >> $dir/.dvd_config


   #### CALCULA POSICAO MAX E IDEAL DA LEGENDA ####
   posicao_max=$(($res -($tam_fonte*3)))
   if [[ $res == 576 ]]
   then
      posicao_inicial=$(($posicao_max - (92 -($tam_fonte*2))))
   else
      posicao_inicial=$(($posicao_max - (44 - $tam_fonte)))
   fi   
            
   zenity --title "AVI_DVD" --text "Qual posicao da legenda? (Quanto maior, mais embaixo)" --scale --min-value=0 --max-value=$posicao_max --value=$posicao_inicial --print-partial >> $dir/.dvd_config

   ###############   
   #### MENU: ####
   ###############
   
   echo `zenity --width=500 --entry --title "AVI_DVD" --text "Qual o titúlo que você deseja que o menu tenha?"` >> $dir/.dvd_config

   opcao=`zenity --title "AVI_DVD" --text "Qual a cor da fonte do menu?" --list --radiolist --hide-column=2 --column "" --column "" --column "Opções" TRUE 1 "Branco" FALSE 2 "Amarelo" FALSE 3 "Preto" FALSE 4 "Azul" FALSE 5 "Outro"`
      case $opcao in
                        1) echo "255,255,255" >> $dir/.dvd_config;;
                        2) echo "255,255,000" >> $dir/.dvd_config;;
         3) echo "000,000,000" >> $dir/.dvd_config;;
         4) echo "000,000,255" >> $dir/.dvd_config;;      
         5) echo `zenity --entry --title "AVI_DVD" --text "Digite o número da cor no formato RGB:" --entry-text "RRR:GGG:BBB"` >> $dir/.dvd_config;;
                        *) echo "ERRO!"; exit 1;;
                esac

   zenity --file-selection --title "AVI_DVD - Escolha a imagem que você deseja usar como plano de fundo:" >> $dir/.dvd_config   
   
   #####################
   #### DRIVER DVD: ####
   #####################

   zenity --question --title "AVI_DVD" --text "Você deseja gravar o DVD após a conversão?"
   if [[ $? == 0 ]]
   then
      echo "SIM" >> $dir/.dvd_config
      echo `zenity --entry --title "AVI_DVD" --text "Digite um título para o DVD:"` >> $dir/.dvd_config
   else
      echo "NAO" >> $dir/.dvd_config
      echo "NAO" >> $dir/.dvd_config
   fi

   zenity --info --title "AVI_DVD" --text "Configuração realizada com sucesso\!"

   exit 0
fi
            
#################################################
#   SELECIONA OS VIDEOS QUE SERÃO CONVERTIDOS   #
#################################################
if [[ $# == "0" ]]
then
   args=`zenity --title "AVI_DVD - Selecione os arquivos que você deseja converter" --file-selection --multiple | sed s#\|#" "#g`

   if [[ $args == "" ]]
   then
      exit 1
   fi
      
   zenity --title "AVI_DVD" --question --text "Deseja adicionar mais algum vídeo?"
   while [[ $? == 0 ]]
   do
      args_2=`zenity --title "AVI_DVD - Selecione os arquivos que você deseja converter" --file-selection --multiple | sed s#\|#" "#g`
      args=`echo "$args $args_2"`
      zenity --title "AVI_DVD" --question --text "Deseja adicionar mais algum vídeo?"
   done   
else
   args=$*   
fi   

#################################################
# PEGA AS INFORMACOES: NOME DO FILME E DURACAO  #
#################################################   
num_args=0
for x in $args
do
   num_args=$(($num_args + 1))
          if [[ -e $x && `echo $x | grep -c .avi` -ge 1 ]]
        then
      filme[$num_args]=filme$num_args

      nome[$num_args]=`zenity --title "AVI_DVD" --entry --text "Qual o nome do filme do arquivo \"$x\"?"`
      
      #### SE ENCONTRAR "." COMO PRIMEIRO CARACTERE ####
      #### SUBSTITUI PELO DIRETORIO CORRENTE        ####
      if [[ `echo $x | grep -c '^\.'` -ge 1 ]]
      then
         dir_atual=`pwd`
         filme_caminho[$num_args]=`echo $x | sed s#^\.\/#$dir_atual/#g | sed s#.avi##g`
      #### SE ENCONTRAR "/home/" NO COMEÇO APENAS   ####
      #### SALVA $x EM FILME_CAMINHO                ####
      elif [[ `echo $x | grep -c '^/home'` -ge 1 ]]
      then
         filme_caminho[$num_args]=`echo $x | sed s#.avi##g`
      #### SENAO, APENAS ADICIONA O DIRETORIO       ####
      #### CORRENTE NO COMECO DO CAMINHO         ####   
      else
         dir_atual=`pwd`   
         filme_caminho[$num_args]=`echo $dir_atual/$x | sed s#.avi##g`
      fi

      if ! [ -e ${filme_caminho[$num_args]}.srt ]
      then
         zenity --title "AVI_DVD" --question --text "O arquivo \"$x\" não possui legenda.\nDeseja continuar?"
         if [[ $? == 1 ]]
         then
            exit 1
         fi
      fi
        else
      zenity --title "AVI_DVD" --warning --text "ERRO! O arquivo \"$x\" não existe ou não está no formato \".avi\"."
                  exit 1
        fi
done

#################################################
# LE AS INFORMACOES DO ARQUIVO DE CONFIGURACAO  #
#################################################
i=1
while read x
do
   case $i in
      1) padrao_dvd=$x;;
      2) video_codec=$x;;
      3) video_matriz=$x;;
      4) tipo_encode=$x;;
      5) resolucao=$x;;   
      6) audio_codec=$x;;
      7) audio_bitrate=$x;;
      8) legenda_fonte=$x;;
      9) legenda_cor=$x;;
      10) legenda_tamanho=$x;;
      11) legenda_posicao=$x;;
      12) menu_titulo=$x;;
      13) menu_fonte_cor=$x;;
      14) menu_imagem=$x;;
      15) grava_dvd=$x;;
      16) titulo_dvd=$x;;
      *) echo "";;
   esac
   i=$(($i + 1))
done < $dir/.dvd_config
                  
#################################################
# COLETA AS INFORMAÇÕES RELACIONADAS AO FILME   #
#################################################
duracao_total=0

for ((i=1; i<=$num_args; i=i+1))
do
   avidemux2_cli --nogui --load ${filme_caminho[$i]}.avi --info > $dir/tmp/${filme[$i]}.info 2> $dir/tmp/${filme[$i]}.erro

   total_frames[$i]=`grep -m1 dwTotalFrames $dir/tmp/${filme[$i]}.info | cut -d":" -f3`
   markerb[$i]=$(( ${total_frames[$i]} - 1 ))
   fps[$i]=`grep -m1 fps $dir/tmp/${filme[$i]}.info | cut -d" " -f6 | sed s#,##g`
   if [[ ${fps[$i]} -lt 9999 ]]
   then
      fps[$i]=$(( ${fps[$i]} * 1000 ))
   elif [[ ${fps[$i]} -gt 99999 ]]
   then
      fps[$i]=$(( ${fps[$i]} / 1000 ))
   fi   

   video_x[$i]=`grep -m2 biWidth $dir/tmp/${filme[$i]}.info | cut -d":" -f3`
   video_y[$i]=`grep -m1 biHeight $dir/tmp/${filme[$i]}.info | cut -d":" -f3`

        duracao[$i]=`grep -m1 Duration $dir/tmp/${filme[$i]}.info | cut -d":" -f2 | cut -d"," -f1 | sed s#' '##g`
   duracao_total=$(( $duracao_total + ${duracao[$i]} ))
   
   ###############################################
   #           DETECTA OS ERROS NO VIDEO         #
   #  (SE ENCONTRAR O TEXTO UMA OU MAIS VEZES)   #
   ###############################################
   if [[ `grep -c "Packed Bitstream detected" $dir/tmp/${filme[$i]}.erro` -ge 1 ]]
   then
      force_unpack[$i]="app.forceUnpack();"
   else
      force_unpack[$i]=""
   fi

        if [[ `grep -c "Index is not up to date" $dir/tmp/${filme[$i]}.erro` -ge 1 ]]
        then
      avidemux --nogui --load ${filme_caminho[$i]}.avi --autoindex --rebuild-index --save $dir/tmp/${filme[$i]}_OK.avi --quit > $dir/tmp/${filme[$i]}_index.log 2> $dir/tmp/${filme[$i]}_index.erro
      cp ${filme_caminho[$i]}.srt $dir/tmp/${filme[$i]}_OK.srt
            filme_caminho[$i]="$dir/tmp/${filme[$i]}_OK"
        fi

   if [[ `grep -c "Build Time Map" $dir/tmp/${filme[$i]}.erro` -ge 1 ]]
        then
                build_time_map[$i]="app.audio.scanVBR();"
        else
                build_time_map[$i]=""
        fi
done

#################################################
# TESTA SE A DURACAO TOTAL É MUITO GRANDE       #
# SE FOR, PERGUNTA SE CONTINUA OU NAO           #       
#################################################
if [[ $duracao_total -ge 12000 ]]
then
   zenity --title "AVI_DVD" --question --text "A duracao total dos filmes é muito grande.\nDeseja continuar?"
   if [[ $? == 1 ]]
   then
                  exit 1
   fi
fi
                  
#################################################
# CALCULA OS VALORES NECESSARIOS PARA           #
# A CONVERSAO, DEPENDENDO DO TIPO               #
#################################################
caminho_projeto="$dir/tmp/"

for ((i=1; i<=$num_args; i=i+1))
do
   #### CONVERTE PAL->NTSC / NTSC->PAL ####
   #### PADRAO    /   FPS              ####
   #### NTSC      /   29970-23976      ####
   #### PAL       /   25000       ####            
   if [[ $padrao_dvd == "ntsc" ]]
   then
      if [[ ${fps[$i]} == 25000 ]]
      then
         resample_fps[$i]="app.video.addFilter(\"resamplefps\",\"newfps=29970\",\"use_linear=0\");"
      else
         resample_fps[$i]=""
      fi
   else
      if [[ ${fps[$i]} != 25000 ]]
                then
                        fps_resample[$i]="app.video.addFilter(\"resamplefps\",\"newfps=25000\",\"use_linear=0\");"
                else
                        fps_resample[$i]=""
                fi
   fi

   if [[ `grep "Audio codec" $dir/tmp/${filme[$i]}.info | cut -d":" -f2 | tr -d " "` == 'AC3'
                && `grep "Frequency" $dir/tmp/${filme[$i]}.info | cut -d":" -f2 | cut -d" " -f2` == 48000 ]]
        then
                temp=`grep BitRate $dir/tmp/${filme[$i]}.info | cut -d"/" -f2 | cut -d" " -f2`
                audio_tamanho[$i]=$(((($temp * 71) * ${duracao[$i]}) / 600000))
                audio_comando[$i]="app.audio.codec(\"copy\",128,0,\"\");"
      audio_resample[$i]=""
        else
      if [[ $audio_codec == "twolame" ]]
      then
         audio_comando[$i]="app.audio.codec(\"$audio_codec\",$audio_bitrate,4,\"01 00 00 00\");"
                        audio_resample[$i]="app.audio.resample=48000;"
                        audio_tamanho[$i]=$(((($audio_bitrate * 71) * ${duracao[$i]}) / 600000))
      else
                   audio_comando[$i]="app.audio.codec(\"$audio_codec\",$audio_bitrate,0,\"\");"
         audio_resample[$i]="app.audio.resample=48000;"
                   audio_tamanho[$i]=$(((($audio_bitrate * 71) * ${duracao[$i]}) / 600000))
      fi
        fi

   if [[ $tipo_encode == '2PASS' ]]
        then   
      ### VALOR = VIDEO TAMANHO ###
      tamanho_total[$i]=$(((4300 * ${duracao[$i]}) / $duracao_total ))
      valor_conversao[$i]=$((((${tamanho_total[$i]} - ${audio_tamanho[$i]}) * 9785 ) / 10000))
        elif [[ $tipo_encode == '2PASSBITRATE' || $tipo_encode == 'CBR' ]]
          then
      ### VALOR = BITRATE ###
      tamanho_total[$i]=$(((4300 * ${duracao[$i]}) / $duracao_total ))
               video_tamanho[$i]=$((((${tamanho_total[$i]} - ${audio_tamanho[$i]}) * 9785 ) / 10000))
      valor_conversao[$i]=$((( ${video_tamanho[$i]} * 8382) / ${duracao[$i]}))
      if [[ ${valor_conversao[$i]} -ge 9000 ]]
      then
         valor_conversao[$i]=9000
      fi
        else
             #### VALOR = CONSTANT_QUALITY ####
      valor_conversao[$i]=4
   fi

   #### CONFIGURA A RESOLUCAO DO VIDEO CONFORME ####
   #### O PADRAO DE DVD E RESOLUCAO DA TV       ####
   
   #### PADRAO    /  RESOLUCAO ####
   #### NTSC      /  720x480   ####
   #### PAL       /  720x576   ####

   if [[ $resolucao == 43 ]]
   then
      if [[ $padrao_dvd == "ntsc" ]]
           then
                   res_y_final=480
           else
                   res_y_final=576
           fi   

      #### RESOLUCAO FINAL NÃO PODE SER IMPAR ####
      resolucao_x[$i]=720
           resolucao_y[$i]=$(((720 * ${video_y[$i]}) / ${video_x[$i]}))

      if [[ ${resolucao_y[$i]} -gt $res_y_final ]]
                then
                        resolucao_y[$i]=$res_y_final
                fi      
      
      if [[ $(( ${resolucao_y[$i]} % 2 )) == 1 ]]
      then
         resolucao_y[$i]=$(( ${resolucao_y[$i]} + 1 ))
      fi

      #### VALOR BLACK NÃO PODE SER IMPAR ####
      black_top[$i]=$((($res_y_final - ${resolucao_y[$i]}) / 2))
      if [[ $(( ${black_top[$i]} % 2 )) == 1 ]]
      then   
         resolucao_y[$i]=$(( ${resolucao_y[$i]} + 2 ))
         black_top[$i]=$(( ${black_top[$i]} - 1 ))
      fi

      black_bottom[$i]=${black_top[$i]}
      black_left[$i]=0
      black_right[$i]=0
   else
      if [[ $padrao_dvd == "NTSC" ]]
                then
         res_x_prop=833
                        res_y_final=480
                else
         res_x_prop=1024
                        res_y_final=576
                fi

      #### RESOLUCAO FINAL NÃO PODE SER IMPAR ####
                resolucao_x[$i]=720
                resolucao_y[$i]=$((($res_x_prop * ${video_y[$i]}) / ${video_x[$i]}))

      if [[ ${resolucao_y[$i]} -gt $res_y_final ]]
      then
         resolucao_y[$i]=$res_y_final
      fi
      
      if [[ $(( ${resolucao_y[$i]} % 2 )) == 1 ]]
                then
                        resolucao_y[$i]=$(( ${resolucao_y[$i]} + 1 ))
      fi

                #### VALOR BLACK NÃO PODE SER IMPAR ####
                black_top[$i]=$((($res_y_final - ${resolucao_y[$i]}) / 2))
                if [[ $(( ${black_top[$i]} % 2 )) == 1 ]]
                then
                        resolucao_y[$i]=$(( ${resolucao_y[$i]} + 2 ))
                        black_top[$i]=$(( ${black_top[$i]} - 1 ))
                fi

                black_bottom[$i]=${black_top[$i]}
                black_left[$i]=0
                black_right[$i]=0
   fi
done

#################################################
# CONVERTE O FORMATO DA COR DA LEGENDA           #     
#           (RGB -> YUV)                   #
#################################################
rgb_r=`echo $legenda_cor | cut -d"," -f1`
rgb_g=`echo $legenda_cor | cut -d"," -f2`
rgb_b=`echo $legenda_cor | cut -d"," -f3`

yuv_y=$((((299 * $rgb_r) + (587 * $rgb_g) + (114 * $rgb_b)) / 1000))
yuv_u=$((((500 * $rgb_r) - (419 * $rgb_g) - (81 * $rgb_b)) / 1000))
yuv_v=$((((-169 * $rgb_r) - (331 * $rgb_g) + (500 * $rgb_b)) / 1000))

#################################################
# CRIA O ARQUIVO FILME[]_DECODER.JS COM AS      #
# INFORMACOES OBTIDAS E FAZ A CONVERSAO           #
#################################################
for ((i=1; i<=$num_args; i=i+1))
do
echo -e "//AD  <- Needed to identify//
//--automatically built--
//--Project: $caminho_projeto${filme[$i]}_decoder.js

var app = new Avidemux();

//** Video **
// 01 videos source 
${force_unpack[$i]}
app.load(\"${filme_caminho[$i]}.avi\");
//01 segments
app.clearSegments();
app.addSegment(0,0,${total_frames[$i]});
app.markerA=0;
app.markerB=${markerb[$i]};

//** Postproc **
app.video.setPostProc(3,3,0);

app.video.setFps1000(${fps[$i]});

//** Filters **
app.video.addFilter(\"mpresize\",\"w=${resolucao_x[$i]}\",\"h=${resolucao_y[$i]}\",\"algo=0\");
app.video.addFilter(\"addblack\",\"left=${black_left[$i]}\",\"right=${black_right[$i]}\",\"top=${black_top[$i]}\",\"bottom=${black_bottom[$i]}\");
app.video.addFilter(\"subtitle\",\"_fontsize=$legenda_tamanho\",\"_subname=${filme_caminho[$i]}.srt\",\"_fontname=$legenda_fonte\",\"_charset=ISO-8859-1\",\"_baseLine=$legenda_posicao\",\"_Y_percent=$yuv_y\",\"_U_percent=$yuv_u\",\"_V_percent=$yuv_v\",\"_selfAdjustable=0\",\"_delay=0\",\"_useBackgroundColor=0\",\"_bg_Y_percent=0\",\"_bg_U_percent=0\",\"_bg_V_percent=0\",\"_blend=1\");
${fps_resample[$i]}

//** Video Codec conf **
app.video.codec(\"$video_codec\",\"$tipo_encode=${valor_conversao[$i]}\",\"$video_matriz \");

//** Audio **
app.audio.reset();
${audio_comando[$i]}
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer(\"NONE\");
${build_time_map[$i]}
${audio_resample[$i]}
app.setContainer(\"PS\");
setSuccess(1);
//app.Exit();

//End of script
" > $dir/tmp/${filme[$i]}_decoder.js   

avidemux2_cli --nogui --run $dir/tmp/${filme[$i]}_decoder.js --output-format PS --save $dir/tmp/${filme[$i]}.mpeg --quit >$dir/tmp/${filme[$i]}_conversao.log 2>$dir/tmp/processo &

pid_avidemux=`ps aux | grep -m1 avidemux2_cli | grep ${filme[$i]}_decoder.js | tr -s " " | cut -d" " -f2`

tail -f --pid=$pid_avidemux ~/.dvd/tmp/processo | awk -vRS="\r" -v filme=${filme_caminho[$i]}.avi \
        '/Encoding Phase/ {
      x=1; 
      while ($x !~ /Pass/) 
         x++; 
      passo=$(x+1)
   }
   $1 ~ /Done/ {
           gsub("Done:","");
           gsub("%","");
      print $1"\n#Convertendo: "filme"\\nPasso: "passo"\\nCompleto: "$1"%\\nTempo Restante: "$5;
           fflush();
        }' | zenity --width=500 --title "AVI_DVD" --progress --auto-close

if [[ $? == 1 || `grep -c Error $dir/tmp/processo` -ge 1 ]]
then
   kill -9 $pid_avidemux 2>/dev/null

   zenity --title "AVI_DVD" --question --text "Ocorreu um erro durante a conversão.\nDeseja ver o log?"
        if [[ $? == 0 ]]
        then
                zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/processo
                zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/${filme[$i]}\_decoder.js
      zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/${filme[$i]}\_conversao.log
        fi

   rm -r $dir/tmp/*
   exit 1
fi

done

#################################################
# OBTEM AS INFORMACOES NECESSARIAS PARA A       #
# CRIACAO DO MENU                               #
#################################################
titulo_filme="\"${nome[1]}\""
nome_mpeg="\"$dir/tmp/${filme[1]}.mpeg\""

for ((i=2; i<=$num_args; i=i+1))
do
       titulo_filme="$titulo_filme \"${nome[$i]}\""
       nome_mpeg="$nome_mpeg \"$dir/tmp/${filme[$i]}.mpeg\""
done

driver_dvd="/dev/`dmesg | grep dvd | grep writer | tr -d " " | cut -d"]" -f2 | cut -d":" -f1`"

if [[ $grava_dvd == "SIM" ]]
then
        makedvd="makedvd -quiet -device $driver_dvd -label $titulo_dvd -burn $dir/tmp/DVD_FILME.xml"
else
        makedvd="makedvd -quiet -author $dir/tmp/DVD_FILME.xml"
fi

#################################################
# CRIA O ARQUIVO MENU.CONFIG COM AS             #
# INFORMACOES OBTIDAS                           #
#################################################
echo -e "
makemenu -noask -quiet -overwrite -$padrao_dvd -dvd -align northwest -menu-title \"$menu_titulo\" -menu-title-fontsize 32 -background \"$menu_imagem\" -font \"Helvetica\" -fontsize 24 -textcolor \"rgb($menu_fonte_cor)\" -fontdeco '-stroke rgb(0,0,0) -strokewidth 1' -button-font \"Helvetica\" -button \">\" -highlightcolor \"rgb(255,255,0)\" -selectcolor \"rgb(255,0,0)\" -button-outline \"rgb(140,140,140)\" $titulo_filme -out \"$dir/tmp/DVD_MENU\"
makexml -quiet -overwrite -dvd -menu \"$dir/tmp/DVD_MENU.mpg\" $nome_mpeg -out \"$dir/tmp/DVD_FILME\"
$makedvd
" > $dir/tmp/menu.config

#################################################
#       CRIA O MENU E A ESTRUTURA DO DVD        #
#################################################
chmod 777 $dir/tmp/menu.config
$dir/tmp/menu.config 2> $dir/tmp/menu.erro | tee > $dir/tmp/menu.log >(awk '
   $2 ~ /Processing/ {
      print "#Processando: "$3;
      fflush();
   } 
   $2 ~ /done/ {
      gsub("%","");
      print $1"\n#Gravando o DVD...Tempo Restante"$8; 
      fflush();
   } 
   /Trying/ && $4 ~ /[12345]/ {
      RS="\r"; 
      print "#Insira um DVD.\\nTentando denovo em: "$4"s";
      fflush();
   }' | zenity --progress --title "AVI_DVD" --text "Criando o menu..." --auto-close)

if [[ $? == 1 ]]
then
   zenity --title "AVI_DVD" --question --text "Ocorreu um erro durante a criação do menu.\nDeseja ver o log?"
   if [[ $? == 0 ]]
   then
      zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/menu.config
      zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/menu.log
      zenity --title "AVI_DVD" --width=640 --height=480 --text-info --filename $dir/tmp/menu.erro
   fi
   
   rm -r $dir/tmp/*
   exit 1
fi
                              
#################################################
# FINALIZA E REMOVE OS ARQUIVOS TEMPORARIOS     #
#################################################
if [[ $grava_dvd == "SIM" ]]
then
   rm -r $dir/tmp/*
   zenity --title "AVI_DVD" --info --text "DVD criado com sucesso\!"
else
   dir_dvd="DVD_FILME"
   if [ -e ~/"$dir_dvd" ]
   then
           i=1
           dir_dvd="DVD_FILME_$i"
           while [ -e ~/"$dir_dvd" ]
           do
                   i=$(($i + 1))
                   dir_dvd="DVD_FILME_$i"
           done
           mkdir ~/$dir_dvd
   else
           mkdir ~/$dir_dvd
   fi

   mv $dir/tmp/DVD_FILME/* ~/$dir_dvd
   rm -r $dir/tmp/*

   zenity --title "AVI_DVD" --info --text "DVD criado com sucesso\!\nAgora utilize seu programa de gravação preferido para gravar a pasta \"~/$dir_dvd\" em DVD."
fi

exit 0

Scripts recomendados

Shell Script para Linux HOWTOs

Script para adicionar chave pública

Bash RPG

Criando pdf para impressão de livros

Script para controle do servidor ProFTP no Slackware


  

Comentários
[1] Comentário enviado por canaman em 11/12/2008 - 14:10h

Opa. Um bug menor - hehe. Falta um '-' na linha "zenity --info -title "AVI_DVD" --text "O seu HD não possui espaço em disco suficiente (9Gb) para rodar o script.\nLibere mais espaço e tente den ovo.""


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts