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

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


Problemas comuns ao rodar vídeos no PS3



O PS3 promete rodar muitos formatos, entre eles, o site da Sony anuncia os seguintes formatos.

- Formato de vídeos direto do USB:
  • MPEG-4 SP (AAC LC)
  • H.264/MPEG-4 AVC Alta Qualidade - AAC LC
  • MPEG-2 TS - H.264/MPEG-4 AVC, AAC LC

- Arquivos no formato MP4:
  • H.264/MPEG-4 AVC Alta Qualidade (AAC LC)
  • MPEG-1 (MPEG Audio Layer 2)
  • MPEG-2 PS (MPEG2 Audio Layer 2, AAC LC, AC3(Dolby Digital), LPCM)
  • MPEG-2 TS - MPEG2 Audio Layer 2, AC3 - Dolby Digital, AAC LC
  • MPEG-2 TS - H.264/MPEG-4 AVC, AAC LC

- AVI:
  • Motion JPEG (audio PCM)
  • Motion JPEG (μ-Law)
  • AVCHD - .m2ts / .mts (Blu-ray)
  • DivX
  • WMV
  • VC-1 - WMA Standard V2

Porém, quando é a hora de mostrar o que ele é capaz, algumas pessoas se decepcionam (como eu, no começo), existe uma inconsistência no sistema, principalmente para tocar AVI em conjunto com XviD.

Algumas pessoas acham que é culpa da Sony, por ser proprietária, e quer somente suportar os Codecs proprietários, por isso, não aceitam AVI com OpenDML e XviD.

Antes de fazer você coçar a cabeça e dizer: 'não entendi nada', deixe me esclarecer uma coisa, não tem nada haver com Software Proprietário ou Livre, tem haver com a maneira como o vídeo foi comprimido ( leia convertido ).

Para uma conversão perfeita, devemos seguir algumas regras, vejamos quais são:

1) GMC (Global Motion Compensation): Devemos evitar fazer o uso deste atributo no vídeo, geralmente DVD e PS3 recusam tocar estes tipo de atributo, porque ele eleva a qualidade do filme em muito, assim o vídeo fica muito bacana para a tela de um computador porém não "cabe" na tela de uma TV.

2) QPel (Quarter Pixel): A mesma coisa do GMC.

3) Packed bitstream: Este atributo, se já aplicado ao arquivo, pode ser removido com o programa MPEG4Modifier sem ter que decodificar o arquivo.

4) Resolução maior que 720x576.

5) Vídeos com um Bitrate maior que 2000 Kbps: Podem apresentar problemas. Se o Codec de áudio não for MP3, você deve diminuir o vídeo Bitrates. Para tocar bem em alguns sistemas, você deve baixar para aproximadamente 1400 Kbps, ou até mais baixo ainda.

* Bitrate é a quantidade de bits que o programa que converte ou grava o vídeo reserva para o áudio e o vídeo.

Por isso, quando dizemos que temos um vídeo de 800kb e 128kb de áudio, estamos dizendo que a transferência ao abrir no player se dá a 928kb por segundo, quanto mais Bitrate, maior e o arquivo final e mais qualidade tem tanto o áudio como o vídeo.

Porém, ao modificar o tamanho do áudio e vídeo através do Bitrate, podemos deixar a qualidade bem próximo do original e economizar onde não precisa.

E se você já sabe como manipular o Bitrate e já fez algumas experiências com 1400 kps e não gostou da qualidade do vídeo, minha dica é: use codificação em 2 passos.

Se o seu arquivo de origem tem uma qualidade muito boa, como um Blu-ray, por exemplo, eu digo que definitivamente, você deve usar a codificação de 2 passos. Com este método, você pode descer o Bitrate do vídeo até 700 kbps e ainda assim, você vai ver uma boa qualidade de vídeo.

Aí você pergunta: "O que é uma codificação de dois passos?"

Para entender a codificação, devemos entender que um vídeo é um grupo de fotos em sequência, que passam muito rápido diante dos nossos olhos e dá impressão de movimento. E a sequência é seguida do áudio, que alinhado com as fotos, dão a impressão que aquela pessoa na foto está falando.

Uma codificação é quando você, com um comando, diz para o MEncoder: “Eu tenho este vídeo, que é uma sequência de fotos, e que quero que você coloque estas fotos junto com este áudio, as fotos estão grandes e o áudio está em WAV (sem ser zipado / convertido )”.

O MEncoder, então, vai fazer o processo de diminuir foto por foto na sequência, e vai alinhar o áudio com as fotos e converter o áudio em MP3. Isto é a conversão em 'um passo'.

Já a conversão em 'dois passos', é quando você diz para o MEncoder: “Eu quero que você assista este flime até o fim e decore a posição de cada foto, veja onde tem mais movimento, como uma cena de ação, ou mais diálogo, e de acordo com o que você encontrar, eu quero que você venha economizar Bytes para as cenas que não tem ação e encher de Bytes as cenas que tem ação”.

Fazendo assim, você garante que os Bytes serão distribuídos com mais precisão.

Por exemplo, digamos que você quer 1400 kbps para o vídeo e 128 Kb para o áudio, em uma sequência que não tem muito movimento de câmera, o MEncoder vai usar somente 600 kbps e se for uma cena de suspense bem quieta 96 Kb de áudio.

. . .Já uma cena de perseguição, onde o mocinho está fugindo da policia e tem o movimento da câmera e o efeito especiais mais a música de perseguição, o barulho do carro derrapando, o MEncoder vai usar os 1400 kbps e 128 Kb para vídeo e áudio.

No Script que vamos criar, estaremos usando este conceito de codificação em '2 passos', e se você analisar o código, você vai ver que eu fiz o seguinte, quanto maior a resolução do seu vídeo maior será a quantidade de Bitrate.

Ao executar o Script, a interatividade será toda gráfica e sonora com o usuário. Eu estou usando o Text2wave, que é parte do pacote do festival que, para mim, é um excelente sintetizador de voz.

Porém, quando ele fala Português é um 'cal'. Caso você queira usar outro, fique à sua disposição trocar, ou até mesmo anular isso de forma total, colocando um #, antes dos comandos: [echo "blabla" | text2wave, lame e play].

Ou seja:

echo "blabla" | text2wave
lame blabla
play blabla


Fica:

#echo "blabla" | text2wave
#lame blabla
#play blabla


Vejamos o que o Script vai mostrar ao usuário. Ao ser executado o usuário, vai escolher o tamanho do vídeo:

Depois de selecionado o tamanho do vídeo, vamos à seleção do vídeo de origem, que nesse caso, já deve estar no seu computador:

Pronto! Isso é tudo o que o usuário deve fazer.

A partir de agora, o Script vai fazer a conversão completa e salvar o arquivo com o nome original e a extensão “.PS3.avi” na pasta do usuário. Enquanto o Script está em execução, o usuário pode acompanhar o progresso pelo prompt, como mostrado abaixo:

Quando a primeira fase da tarefa estiver concluída, o sistema vai avisar que está entrando no segundo passo, e por fim, ao terminar, o sistema vai dizer que terminou e onde o arquivo está e qual o nome dele.

Agora, vamos ver as entranhas desse 'bicho'.

"Show-me the code!" :)
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

Rode Linux no seu iPod

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

5 comandos que ninguém nunca deve executar no Linux

Áudio Profissional no GNU/Linux

Leitura recomendada

Instalação do Arch Linux com LVM + Luks

O Mestre, o Tecnólogo e o Aprendiz

Aventuras do Mint Linux 10 em um computador antigo

Raspberry Pi 4B Como Servidor Linux de Baixo Custo

Sincronizando o Nokia 2630 com o Evolution no Linux

  
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