MEncoder - Criando Programa Gráfico Para Conversão

Você gosta do MEncoder? Porém, acha um problema ter que memorizar os comandos? Não seria melhor ter um Script que,
com dois ou três cliques, faz o trabalho para você? Aqui vamos fazer um Script e transformá-lo em um programa, com
direito a ícone e tudo mais... Meu alvo principal é um Script que converta vídeos e que sejam compatíveis com o sistema
do PS3.

[ Hits: 30.761 ]

Por: M4iir1c10 em 05/03/2012 | Blog: https://github.com/mauricioph


O Código do Script



Bem, antes de prosseguir, quero deixar claro que, embora estamos falando sobre como fazer do seu Script como um programa, nesta página, estarei explicando o código.

Mas, eu creio que será de interesse aos que gostam de programação, por isso, vou resumir em explicar o que estou fazendo, e não o porque estou fazendo. Caso você só queira o código, pode copiar daqui mesmo, porque eu estou fazendo meus comentários, como comentários do código também.

Agora, se você copiar no Windows para usar no Linux, depois não esqueça de rodar o DOS2unix, antes de executar o Script:

dos2unix script.sh > script-linux.sh

Muito bem, chegamos ao nosso código, como todo bom Script vamos começar definindo as variáveis.

#!/bin/bash
# Os programas que serão usados e onde eles se encontram
 
MENCODER="$(builtin type -P mencoder)"
ZEN="$(builtin type -P zenity)"
LAME="$(builtin type -P lame)"
PLY="$(builtin type -P play)"
 
# A resolução ou o tamanho do vídeo, embora eu coloquei algumas opções para vídeos em HD lembre se que no PS3 
# você vai ter problemas para rodar qualquer vídeo com resolução superior a 720x576.
 
RESOLU="$(${ZEN} --list --text "Selecione a resolução do vídeo final" --column "Resolução" --radiolist --column size A "640x480" B "640x360" C "720x404" D 
"720x416" E "954x544" F "1280x720" G "1920x1080" | tr x :)"
 
# Agora vamos basear o bitrate do video de acordo com o tamanho do video
BITRATE="$(echo $RESOLU | sed 's/:/ /g' | awk '{print $1}')"
 
# Vamos selecionar o vídeo a ser convertido
INFILE="$(${ZEN} --file-selection)"
 
# Só para ter certeza que o usuário sabe oque esta escolhendo e não clicou 
# sem querer em um arquivo que não é um vídeo, vamos olhar que tipo de 
# arquivo foi selecionado se não for um vídeo damos uma bronca nele.
 
ENTRADA=$(file -bi "$INFILE" | awk '{print $1}'| grep video | awk 'BEGIN{FS="/"}{print $1}')
echo $ENTRADA
function intro(){
while [ "$ENTRADA" != "video" ]
do ${ZEN} --error --text "Voce não escolheu um arquivo de vídeo válido"
INFILE="$(${ZEN} --file-selection)"
ENTRADA=$(file -bi "$INFILE" | awk '{print $1}'| grep video | awk 'BEGIN{FS="/"}{print $1}')
 
echo $ENTRADA
done
}
intro
 
# agora que estamos certos que é um vídeo vamos definir o nome dele como a variável de entrada
ENTRADA="$(echo $INFILE)"
 
LOC=$(basename "${ENTRADA}")
 
# vamos criar uma pasta temporária para colocar todos os logs e arquivo usados 
# durante a conversão, definindo os nomes para os mesmos

TEMPO="$(mktemp -d /tmp/mauricio.XXXXXXXXX)"
SAIDA="$(echo ${LOC} | sed 's/ /_/g')"
LOGI="$(echo ${TEMPO}/${SAIDA}.log)"
 
#Primeira função de conversão, colocamos os atributos necessários para o mencoder e 
# jogamos a saída de dados para o zenity com o awk filtramos as informações do mencoder e 
# criamos uma função que da um refresh no zenity para que o mesmo possa indicar a porcentagem da 
# conversão junto com as demais informações.
 
function primeiropasso(){
${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf 
scale=${RESOLU},harddup -ffourcc XVID -o "$HOME/${SAIDA}.PS3.avi" -passlogfile ${LOGI} 2>&1 | awk -vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," 
");gsub(/ \(/," ");print $3"\n#Convertendo o vídeo para pasta do usuário \\nPosição :\\t"$1"\\nQuadros :\\t"$2"\\nPorcentagem
:\\t"$3"%\\nMédia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | ${ZEN} --progress --title "Convertendo ${LOC} 1 passo" --text
"Convertendo ${LOC}" --auto-close
} 
# fazemos a mesma coisa para o segundo passo, o motivo pelo qual estou colocando 
# os passos em funções separadas é porque se algum dia você perdeu um usb com o vídeo 
# convertido e quer converter do original para outro vídeo para o PS3 o programa vai identificar que 
# você já converteu esse vídeo uma vez e vai lembrar dele fazendo assim só uma vez o segundo passo, 
# quer dizer não precisa assistir o vídeo que ele já assistiu.
 
function segundopasso() {
echo "Second Stage" | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3 play ${TEMPO}/audio.mp3 ${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts 
vcodec=mpeg4:vpass=2:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf scale=${RESOLU},harddup -ffourcc XVID -o 
"$HOME/Desktop/${SAIDA}.PS3.avi" -passlogfile ${LOGI} 2>&1 | awk -vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," ");gsub(/ \(/," ");print $3"\n#Convertendo 
o vídeo para pasta do usuário \\nPosicao :\\t"$1"\\nQuadros:\\t"$2"\\nPorcentagem :\\t"$3"%\\nMedia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | 
${ZEN} --progress --title "converting ${LOC} 2 passo" --text "converting ${LOC}" --auto-close echo "The file is ${SAIDA}.PS3.avi, You will find it on your home folder" | 
text2wave -o ${TEMPO}/audio.wav lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3 play ${TEMPO}/audio.mp3}
 
# vamos lembrar do vídeo que foi convertido criando nossa pasta de "memória"
 
if [ ! -d $HOME/.videologs ]
then mkdir $HOME/.videologs
fi
LOGTWO=$(basename "${LOGI}")
 
function usedsecondpass() {
${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf
scale=${RESOLU},harddup -ffourcc XVID -o "$HOME/Desktop/${SAIDA}.PS3.avi" -passlogfile "${HOME}/.videologs/${LOGTWO}" 2>&1 | awk -
vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," ");gsub(/ \(/," ");print $3"\n#Convertendo o vídeo para pasta do usuário \\nPosição
:\\t"$1"\\nQuadros :\\t"$2"\\nPorcentagem :\\t"$3"%\\nMédia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | ${ZEN} --progress --title
"converting ${LOC} 2 passo" --text "converting ${LOC}" --auto-close echo "Mission Acomplished, your file is at the Desktop. The name is ${SAIDA}.PS3.avi" | text2wave 
-o ${TEMPO}/audio.wav lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3 play ${TEMPO} /audio.mp3}
 
# Lembra desse vídeo? então pula para o segundo passo.
 
if [ -f ${HOME}/.videologs/${LOGTWO} ]
then echo "I remember this, lets do it again." | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3
play ${TEMPO}/audio.mp3
usedsecondpass
else primeiropasso
segundopasso
fi
 
# vamos limpar a bagunça que essa conversão fez
rm -f ${TEMPO}/audio.wav
rm -f ${TEMPO}/audio.mp3
 
# mais não vamos apagar tudo, esse programa tem que se lembrar desse vídeo para a próxima vez que for necessário, caso você decidir limpar o seu
sistema um dia para economizar espaço, essa pasta ~/.videologs deve ser um das que você definitivamente deve dar uma olhada, em uma semana
ou um mês não acumula muito mais depois de uns 6 meses pode ultrapassar a marca dos GB de arquivos.
 
for i in $(ls ${TEMPO}/*.log | xargs ) do mv $i $HOME/.videologs/ done
 
#agora acabamos com todo o lixo.
cd ~/
rm -fr ${TEMPO}


Pronto! Seu Script está feito.

Agora, vamos dar uma 'cara de profissional' na próxima página. . .

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Configuração do sistema
   3. Problemas comuns ao rodar vídeos no PS3
   4. O Código do Script
   5. Ajustes Finais
   6. Construindo o Pacote RPM
   7. Criando um Pacote DEB
   8. Teste Final
Outros artigos deste autor

Letras brilhantes com Gimp

Servidor de Mídia com 128 MB de RAM

Codificação e decodificação entre ASCII, hexadecimal e unicode

Malware, Vírus e Hacking. Estamos seguros usando Linux?

GRUB com imagens aleatórias e KDM com vídeo de fundo

Leitura recomendada

Transmissão de áudio e vídeo via Multicast

Compilação, empacotamento, instalação e configuração do WINE-dev

Clonando HDs na rede

Dúvidas iniciais para começar Open Hardware de mouse + GUI

Programas em Modo Texto (on Shell)

  
Comentários
[1] Comentário enviado por itamarnet em 06/03/2012 - 15:29h

Artigo muito interessante, e bem detalhado. Extrapolou inclusive a proposta inicial ao criar os pacotes e detalhar os problemas que encontrou.
Não vou tecer críticas pois o artigo é bem detalhado, mas gostaria de contribuir com algumas sugestões, que podem facilitar ou serem alternativas.
Já tive problemas com o mplayer e mencoder, assim como você, na questão de reconhecimento das dependências, especialmente com o Ubuntu.
O que pode fazer também é usar o ffmpeg no lugar do mencoder para as conversões, mas confesso não lembrar se tem todas as opções disponíveis do seu "Programa".
Outa opção é usar o flite ( http://www.speech.cs.cmu.edu/flite ) em substituição a tríade text2wave, lame e play, o que poderia ser feito nesse formato flite -t "Texto".

De resto está perfeito, Parabéns!!

[2] Comentário enviado por m4iir1c10 em 06/03/2012 - 18:16h

So para corrigir no codigo do programa houve alguns erros durante o processo da publicacao, alguem colocou quebra de linhas onde nao existem quebras ou seja deveria ser uma linha so, se voce seguir o raciocinio que eu vou explicar voce pode consertar ou voce pode esperar eu publicar o codigo :)

Linhas 9 e 10 e uma unica linha, assim linha 11 vira linha 10 por tanto siga passo a passo as instrucoes para voce conscertar o codigo, preste atencao porque a maioria das vezes em que voce fizer isso antes de apertar delete no final da linha voce deve apertar espaco depois delete mais algumas vezes voce nao deve fazer isso por exemplo awk -vRS nao pode ser awk - vRS

Linhas 9 e 10
Linhas 11 e 12
Linhas 19 e 10
Linhas 44, 45 e 46
Linhas 47, 48 e 49
Linhas 50, 51 e 52
Linhas 56, 57, 58, 59 e 60
Linhas 70, 71, 72, 73 e 74
Linhas 91, 92 e 93

Eu vou publicar o codigo para os novatos que nao querem arriscar destriuir o codigo :)


Deixa eu fazer um teste agora vamos ver se no comantario o codigo sai direito:


#!/bin/bash
#Os programas que serão usados e onde eles se encontram

MENCODER="$(builtin type -P mencoder)"
ZEN="$(builtin type -P zenity)"
LAME="$(builtin type -P lame)"
PLY="$(builtin type -P play)"

# A resolução ou o tamanho do vídeo, embora eu coloquei algumas opções para vídeos em HD lembre se que no PS3 você
# vai ter problemas para rodar qualquer vídeo com resolução superior a 720x576.

RESOLU="$(${ZEN} --list --text "Selecione a resolução do vídeo final" --column "Resolução" --radiolist --column size A "640x480" B "640x360" C "720x404" D "720x416" E "954x544" F "1280x720" G "1920x1080" | tr x :)"

# Agora vamos basear o bitrate do video de acordo com o tamanho do video
BITRATE="$(echo $RESOLU | sed 's/:/ /g' | awk '{print $1}')"

# Vamos selecionar o vídeo a ser convertido
INFILE="$(${ZEN} --file-selection)"

# Só para ter certeza que o usuário sabe oque esta escolhendo e não clicou sem querer em um arquivo que não é um vídeo,
# vamos olhar que tipo de arquivo foi selecionado se não for um vídeo damos uma bronca nele.

ENTRADA=$(file -bi "$INFILE" | awk '{print $1}'| grep video | awk 'BEGIN{FS="/"}{print $1}')
echo $ENTRADA
function intro(){
while [ "$ENTRADA" != "video" ]
do ${ZEN} --error --text "Voce não escolheu um arquivo de vídeo válido"
INFILE="$(${ZEN} --file-selection)"
ENTRADA=$(file -bi "$INFILE" | awk '{print $1}'| grep video | awk 'BEGIN{FS="/"}{print $1}')

echo $ENTRADA
done
}
intro

# agora que estamos certos que é um vídeo vamos definir o nome dele como a variável de entrada
ENTRADA="$(echo $INFILE)"

LOC=$(basename "${ENTRADA}")

#vamos criar uma pasta temporária para colocar todos os logs e arquivo usados durante a conversão, definindo os nomes para os mesmos
TEMPO="$(mktemp -d /tmp/mauricio.XXXXXXXXX)"
SAIDA="$(echo ${LOC} | sed 's/ /_/g')"
LOGI="$(echo ${TEMPO}/${SAIDA}.log)"

#Primeira função de conversão, colocamos os atributos necessários para o mencoder e jogamos a saída de dados para o zenity
# com o awk filtramos as informações do mencoder e criamos uma função que da um refresh no zenity para que o mesmo
# possa indicar a porcentagem da conversão junto com as demais informações.

function primeiropasso(){
${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf scale=${RESOLU},harddup -ffourcc XVID -o "$HOME/${SAIDA}.PS3.avi" -passlogfile ${LOGI} 2>&1 | awk -vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," ");gsub(/ \(/," ");print $3"\n#Convertendo o vídeo para pasta do usuário \\nPosição :\\t"$1"\\nQuadros :\\t"$2"\\nPorcentagem :\\t"$3"%\\nMédia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | ${ZEN} --progress --title "Convertendo ${LOC} 1 passo" --text "Convertendo ${LOC}" --auto-close
}

# fazemos a mesma coisa para o segundo passo, o motivo pelo qual estou colocando os passos em funções separadas é porque
# se algum dia você perdeu um usb com o vídeo convertido e quer converter do original para outro vídeo para o PS3 o programa
# vai identificar que você já converteu esse vídeo uma vez e vai lembrar dele fazendo assim só uma vez o segundo passo,
# quer dizer não precisa assistir o vídeo que ele já assistiu.

function segundopasso() {
echo "Second Stage" | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3
play ${TEMPO}/audio.mp3
${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf scale=${RESOLU},harddup -ffourcc XVID -o "$HOME/${SAIDA}.PS3.avi" -passlogfile ${LOGI} 2>&1 | awk -vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," ");gsub(/ \(/," ");print $3"\n#Convertendo o vídeo para pasta do usuário \\nPosicao :\\t"$1"\\nQuadros :\\t"$2"\\nPorcentagem :\\t"$3"%\\nMedia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | ${ZEN} --progress --title "converting ${LOC} 2 passo" --text "converting ${LOC}" --auto-close
echo "The file is ${SAIDA}.PS3.avi, You will find it on your home folder" | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3
play ${TEMPO}/audio.mp3
}

# vamos lembrar do vídeo que foi convertido criando nossa pasta de "memória"

if [ ! -d $HOME/.videologs ]
then mkdir $HOME/.videologs
fi
LOGTWO=$(basename "${LOGI}")

function usedsecondpass() {
${MENCODER} "${ENTRADA}" -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=${BITRATE} -oac mp3lame -lameopts cbr:br=128:mode=0 -vf scale=${RESOLU},harddup -ffourcc XVID -o "$HOME/${SAIDA}.PS3.avi" -passlogfile "${HOME}/.videologs/${LOGTWO}" 2>&1 | awk -vRS="\r" '$1 ~ /Pos/ {gsub(/Pos:/," ");gsub(/%\)/," ");gsub(/ \(/," ");print $3"\n#Convertendo o vídeo para pasta do usuário \\nPosição :\\t"$1"\\nQuadros :\\t"$2"\\nPorcentagem :\\t"$3"%\\nMédia de Quadros :\\t"$4"\\nTempo Restante :\\t"$6; fflush();}' | ${ZEN} --progress --title "converting ${LOC} 2 passo" --text "converting ${LOC}" --auto-close
echo "Mission Acomplished, your file is at the Desktop. The name is ${SAIDA}.PS3.avi" | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3
play ${TEMPO}/audio.mp3
}

# Lembra desse vídeo? então pula para o segundo passo.

if [ -f ${HOME}/.videologs/${LOGTWO} ]
then echo "I remember this, lets do it again." | text2wave -o ${TEMPO}/audio.wav
lame -V3 -b 192 ${TEMPO}/audio.wav ${TEMPO}/audio.mp3
play ${TEMPO}/audio.mp3
usedsecondpass
else primeiropasso
segundopasso
fi

# vamos limpar a bagunça que essa conversão fez
rm -f ${TEMPO}/audio.wav
rm -f ${TEMPO}/audio.mp3

# mais não vamos apagar tudo, esse programa tem que se lembrar desse vídeo para a próxima vez que for necessário
# caso você decidir limpar o seu sistema um dia para economizar espaço, essa pasta ~/.videologs deve ser um das que você
# definitivamente deve dar uma olhada, em uma semana ou um mês não acumula muito mais depois de uns 6 meses pode
# ultrapassar a marca dos GB de arquivos.

for i in $(ls ${TEMPO}/*.log | xargs )
do mv $i $HOME/.videologs/
done

#agora acabamos com todo o lixo.
cd ~/
rm -fr ${TEMPO}

Pessoal desculpe a falta de ascentos meu teclado e britanico :)

[3] Comentário enviado por m4iir1c10 em 19/03/2012 - 10:46h

Aqui esta o script publicado para evitar problemas de copy and paste.

http://www.vivaolinux.com.br/script/Script-para-conversao-de-video-compativel-com-PS3

[4] Comentário enviado por gidalte em 06/04/2012 - 10:23h

Sensacional!, só assim eu aprendo um pouco mais de script, e com elegância ...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts