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.110 ]

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


Construindo o Pacote RPM



Bom, agora que já temos o nosso programa funcionando e instalado, vem a seguinte questão:

“ O que fazer se um amigo meu gostou do meu programa e quer usar no Linux dele?
Eu quero passar para ele o programa completo, com ícone e tudo mais, o que fazer?”

- Resposta simples: Empacote em um instalador RPM ou DEB, e distribua para seus amigos de acordo com o sistema deles, nesta página vamos criar um RPM.

- O que é um RPM?

Lembra do Windows e os arquivos “setup.exe” que você clica e instala um programa? Sem muitos detalhes, um RPM ou DEB, é um arquivo desse para o Linux, porém, diferente do Windows, que quase todos tem o mesmo nome “setup.exe”, um instalador no Linux tem o formato "programa"+"versão"+"arquitetura" - “.deb” ou “.rpm”.

Vamos criar nosso RPM, primeiro, vamos ajustar todos os arquivos usados pelo nosso programa em uma única pasta. Digite no terminal:

mkdir ~/my-program
$ cd ~/my-program
$ mkdir opt
$ cp -r /opt/Ps3 opt/
$ mkdir -p usr/share/applications
$ cp -r /usr/share/applications/Ps3.desktop usr/share/applications/
$ mkdir -p usr/local/bin
$ cp /usr/local/bin/Ps3.sh usr/local/bin/


Muito importante notar, que ao digitar: "mkdir", eu não coloco a barra: / na frente do nome da pasta, a mesma coisa quando estou copiando, porque se eu coloco:

mkdir -p /usr/share

. . .Eu estou tentando construir uma pasta onde já exite outra com o mesmo nome, e não é isso que queremos.

O que queremos é criar uma pasta dentro da pasta “my-program”, por isso não incluímos o / no começo.

Agora vamos criar o PostInstall, que vai fazer as tarefas após instalado o programa. Neste caso, estou escrevendo que vai colocar um ícone no desktop do usuário:

mkdir -p opt/Ps3/bin
$ kwrite opt/Ps3/bin/postinstall.sh


Esse é o código do PostInstall:

Summary: Video converter for PS3 Media
Name: Ps3-video
Version: 1
Release: 0
Group: base
License: GPL
Source: Ps3-video-1-0.tar.gz
BuildRoot: /var/tmp/%{name}-buildroot
Requires: zenity => 2.32.1-3, mencoder => 4.4.1-0, lame => 3.98-2, festival => 1.96-1, sox => 14.3.0-5, libxvidcore4 => 1.2.2-0


%description
The GNU Ps3-video convert most kind of videos into a avi file playable on PS3 console, using the xvid and mp3 codecs.

%prep
%setup -q

%build

%install
cp -rvf $RPM_BUILD_DIR/Ps3-video-1 $RPM_BUILD_ROOT

%clean
if( [ $RPM_BUILD_ROOT != '/' ] ); then rm -rf $RPM_BUILD_ROOT; fi;

%files
/.

%post
echo "Your program has been installed in /usr/local/bin you may want to copy the /usr/share/applications/Ps3 to your desktop";
/opt/Ps3/bin/postinstall.sh


* Summary é o que vai aparecer, quando a pessoa selecionar o pacote com programas como Synaptic, eu creio que as outras opções você já sabe o que são.

* Source é o arquivo que vai conter o código-fonte, o nome deve ser: Nome_programa-versão-lancamento.tar.gz

* Requires seria as dependências do seu programa. Como eu disse no começo, onde apresentei o código do Script, porém, aqui seria mais detalhado colocando o nome dos programas e a versão.

Como você vai saber a versão correta? Simples: digite no terminal: "apt-cache show programa"

apt-cache show stella
Package: stella
Priority: extra
Section: non-free/otherosfs
Installed-Size: 830
Maintainer: Tom Lear <tom@trap.mtview.ca.us>
Architecture: i386
[fonte vermelha] Version: 1.1-2 [fonte vermelha]
Depends: libc6 (>= 2.1), libstdc++2.10, xlib6g (>= 3.3.5-1)
Filename: dists/potato/non-free/binary-i386/otherosfs/stella_1.1-2.deb
Size: 483430
MD5sum: 11b3e86a41a60fa1c4b334dd96c1d4b5
Description: Atari 2600 Emulator for X windows
Stella is a portable emulator of the old Atari 2600 video-game console
written in C++. You can play most Atari 2600 games with it. The latest
news, code and binaries for Stella can be found at:
http://www4.ncsu.edu/~bwmott/2600

Assim, você deve procurar as dependências. Como no meu exemplo, o meu programa depende do Zenity, MEncoder, Lame, Festival, XVid e Sox.

Outra coisa que você vai notar também, é que no "%post" que é o que será feito depois de instalar. Eu estou chamando o Script “postinstall.sh”, que vai colocar o ícone no desktop do usuário.

Esta técnica funcionava bem até algumas versões do KDE, porém, agora com o KDE4, não é certo que em todas as distro isto vai funcionar.

Também não testei no Unity, porém no Gnome e outras WM, funciona direitinho.

Agora, vamos copiar os arquivos do meu programa que salvei anteriormente na pasta “my-program” para a pasta SOURCES dentro de “src/rpm”. Digite:

cd ~/my-program
$ cp -fr . ~/src/rpm/SOURCES/Ps3-video-1/
$ cd ~/src/rpm/SOURCES


Vale apena lembrar, que você deve colocar um ponto entre "cp -fr" e o caminho "~/src/. . . .", este ponto quer dizer que você está copiando os arquivos e pasta do local onde você está para a pasta indicada.

Agora, vamos colocar o código-fonte em um Tarball.

tar -cf Ps3-video-1-0.tar Ps3-video-1;
$ gzip Ps3-video-1-0.tar


E finalmente, vamos rodar o comando mágico que vai dar o toque final no nosso programa, digite:

rpmbuild -ba ~/src/rpm/SPECS/Ps3-video-1-0.spec

Agora, vamos fazer o teste final. Como Root, vamos instalar o nosso programa pelo RPM.

Dependendo do seu sistema, seu arquivo pode estar em uma das pastas “iNNN”, dentro de “src/rpm/RPMS/”. No meu caso, como eu tenho um i586, preciso digitar:

cd /home/mauricio/src/rpm/RPMS/i586

Após encontrar o arquivo RPM, vamos instalar:

sudo rpm -i Ps3-video-1-0.rpm

Depois de instalado perfeitamente, recebemos a mensagem que você colocar no final do seu arquivo “.spec”:
Your program has been installed in /usr/local/bin you may want to copy the /usr/share/applications/Ps3-video to your desktop

Como indicado no texto, copie o ícone dentro de “/usr/share/applications”, para o desktop.

Agora você pode clicar no ícone do programa e ver ele em operação.

Outro detalhe, o seu programa aparece na lista do Synaptic, mostrando que foi instalado com perfeição.


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

Máquina Enigma e encriptação em XOR

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

Raios de luz explodindo atrás do texto

Bug afeta todas as distros

Instalando e configurando um dock igual ao Mac Leopard no KDE

Leitura recomendada

Um pouco da história do Debian GNU/Linux

Criando um banco de dados para obter ajuda do sistema

Cover Thumbnailer - Miniaturas de CDs nas pastas de músicas e imagens, miniaturas de vídeos com o Totem

Integração MRTG e RRDTool

Conceitos de criptografia com chave simétrica e assimétrica

  
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