Ubuntu na terra do pão di queijo

25/09/2008

Scripts que facilitam a vida![0]

Filed under: Diversos,Multimedia,Software Livre,Ubuntu — Leonardo Amaral @ 11:27

Eu sempre preferi criar scripts do que fazer as coisas na mão, até porque o script e a documentação mais completa que se pode ter (So de prevenir o famoso “Como é que eu tinha feito?” ja resolve) para coisas simples.
Vou publicar os mais notaveis e recentes por enquanto. A lista e grande, e para vocês terem idéia:

leleobhz@zorg:~/bin$ ls -1 | wc -l
64

O Script abaixo eu chamei de MP4. Converte qualquer arquivo suportado pelo mencoder para MP4 (E é comprovadamente compativel com meu SE K550i). Alguns detalhes importantes:

  • Não uso -ofps. Porque? Simples; -ofps fixa o framerate de saida. Qualquer decoder mp4 tem que ser esperto o suficiente para detectar o framerate corretamente, mas o maior problema nem chega a ser este. Videos diretamente baixados do Youtube, ou RMVBs tem sérios problemas com framerates (Tanto por serem formatos fechados quanto por não terem um framerate especifico). E o sincronismo de audio e video vai pro espaço se vc tentar converter o framerate no mencoder e no ffmpeg (E o unico codificador que faz isso sem zuar o sincronismo é realmente o TMPGEnc do janelas).
  • Porque não uso -ovc libx264 ao invez do lavc? Simplesmente porque o libx264 é terrivelmente lento quando usado com filtros (No meu C2D, sao ~70FPS x ~130FPS). Acho que o threading da libavcodec ajuda também.
  • Ordem de processamento: harddup (No frame skip), pp=ac (Post process otimizado para qualidade), scale (Nem precisa dizer muito, ele reescala para 220xquaquercoisa, onde qualquercoisa e o tamanho necessário pra conservar o aspecto) e expand (Cria uma area de 220×176 e posiciona o video no meio, independente do tamanho do video. Bom que a legenda se situa por esse tamanho, e nao fica comprimida na faixa preta dos videos widescreen).
  • Sintaxe: ./MP4 videodeentrada.avi videodesaida.mp4 [legenda.srt]
  • Compatibilidade: Tudo que o mencoder suportar
#!/bin/bash
filein="$1"
fileout="$2"
threads=$(expr `cat /proc/cpuinfo | grep processor | awk $'{ print $3 }' | tail -n1` + 1)

mencoder "$filein" -nosound ${3:+-sub "$3" -font "/usr/share/fonts/truetype/msttcorefonts/impact.ttf"-ffactor 1 -sub-bg-alpha 0 -sub-bg-color 0 -spualign -1 -subalign 2 -subfont-autoscale 2 -subpos 95 -subfont-text-scale 4 -utf8} -of lavf -lavfopts format=mp4 -ovc lavc -lavcopts threads=$threads:vglobal=1:vcodec=mpeg4:keyint=25:vbitrate=400:vpass=1 -vf scale=220:-3,expand=220:176,harddup,pp=ac -o /dev/null #2>/dev/null && \
\
mencoder "$filein" ${3:+-sub "$3" -font "/usr/share/fonts/truetype/msttcorefonts/impact.ttf" -ffactor1 -sub-bg-alpha 0 -sub-bg-color 0 -spualign -1 -subalign 2 -subfont-autoscale 2 -subpos 95 -subfont-text-scale 4 -utf8} -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts threads=$threads:aglobal=1:vglobal=1:acodec=libfaac:abitrate=128:vcodec=mpeg4:keyint=25:vbitrate=400:vpass=2 -vf scale=220:-3,expand=220:176,harddup,pp=ac -o "$fileout" #2>/dev/null

rm -rf divx2pass.log

O proximo script é um que fiz para tentar fazer um vídeo XVID que reproduza no meu DVD (Suporta DIVX). Ainda não consegui a compatibilidade, mas tá otimo para quem vai ver no PC (Ou outros DVDs menos chatos)

  • Sintaxe: ./xvid_2pass_enc.sh arquivodeentrada.avi arquivodesaida.avi
  • Compatibilidade: Tudo que o mencoder suportar

#!/bin/bash                                                             

# Most Correct, but dont work on Samsung
#opts="-noskip -ffourcc dx50 -vf scale,softskip,pullup -zoom -xy 720 -lameopts cbr:br=128:q=0:aq=0:mode=0 -lavcopts vcodec=mpeg4:mbd=2:trell:v4mv:turbo"

genopts="-mc 0 -ffourcc DX50 -vf scale,softskip,pullup,harddup -ofps 30000/1001"
aopts="-lameopts cbr:br=128:q=0:aq=0:mode=0"
vopts="-xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:bitrate=-700000:closed_gop:profile=unrestricted"

if [[ -n `echo $@ | grep --regexp=-c` ]]; then
        vopts="$vopts:cartoon"
        filein=$2
        fileout=$3
else
        filein=$1
        fileout=$2
fi

echo "Codificando video com as opções: $vopts"

mencoder $filein ${genopts} -ovc xvid ${vopts}:pass=1 -oac mp3lame ${aopts} -o /dev/null
mencoder $filein ${genopts} -ovc xvid ${vopts}:pass=2 -oac mp3lame ${aopts} -o $fileout

rm `pwd`/divx2pass.log

O proximo script é uma variante do script acima, mas com o FFMPEG (Não sei se os parametros batem):

  • Compatibilidade: Tudo que o FFMPEG suportar
  • Sintaxe: ./xvid_2pass_ffmpeg.sh [-c] arquivodeentrada.avi arquivodesaida.avi # -c ativa o cartoon mode, que deixa os desenhos animados bem melhores mudando a matriz de quantificação.
#!/bin/bash

if [[ -n `echo $@ | grep --regexp=-c` ]]; then
        vopts="$vopts:cartoon"
        filein=$2
        fileout=$3
else
        filein=$1
        fileout=$2
fi

echo "Codificando video com as opções: $vopts"
ffmpeg -i $filein -aspect 4:3 -s 720x480 -target dvd -pass 1 -passlogfile /tmp/ffmpeglog.log -vcodec mpeg4 -mbd rd -flags +4mv+trell+aic -cmp 2 -subcmp 2 -g 300 -pass 1/2 -bf 2 -r 30000/1001 -vb 1200 -vtag DX50 -acodec mp3 -ab 128 /dev/null
ffmpeg -i $filein -aspect 4:3 -s 720x480 -target dvd -pass 2 -passlogfile /tmp/ffmpeglog.log -vcodec mpeg4 -mbd rd -flags +4mv+trell+aic -cmp 2 -subcmp 2 -g 300 -pass 1/2 -bf 2 -r 30000/1001 -vb 1200 -vtag DX50 -acodec mp3 -ab 128 $fileout

O proximo script checka se seus discos estão ou não com NQC ativo.


#!/bin/bash

for i in /sys/bus/scsi/devices/*; do
        NQC=`cat $i/queue_depth`
        DEVICE=`cat $i/type`
        if [[ $DEVICE -eq 0 ]]; then
                if [[ $NQC -eq 1 ]]; then
                        NQC=Disabled
                else
                        NQC=Enabled
                fi
                echo -e "$(cat $i/model): \n\t NQC: $NQC"
        fi
done

O próximo é um scriptzinho boboca que fiz, como prova de conceito para parsers em shell. O script diz tudo.

#!/bin/bash

for loteria in “megasena” “duplasena”; do
        DATA=`wget http://www1.caixa.gov.br/loterias/loterias/$loteria/$loteria\_pesquisa.asp -O- 2>/dev/null`
        contador=1
        echo “Loteria: $loteria”
        for dezenas in 4 6 8 10 12 14; do
                echo $DATA | \
                cut -d “|” -f 21 | \
                cut -d “>” -f $dezenas | \
                sed -e “s/<\/li//g" | \                 xargs echo -e "\tDezena $contador: $1"                 contador=`expr $contador + 1`         done         echo done [/sourcecode] Tem mais coisas aqui, mas se colar tudo fica realmente dificil (E eu acho que o povo do planeta vai me matar). Qualquer coisa, me mandem um comentário ou menságem que eu vejo o que posso fazer ;] UPDATE: Resolvido o problema do subtitulo zoado no primeiro script. O scale e o expand DEVEM ser os primeiros filtros, senão a coisa desanda.

UPDATE2: Fix DEFINITIVO pro MP4.

Anúncios

8 Comentários »

  1. Legal a iniciativa… Acho que vou postar os meus também. Estou à procura de um modo de compactar o tamanho de videos de dvd de 8gb pra 4gb e gravar num dvd de 4.7gb. Sabe alguma coisa que possa fazer isso?
    Abraços

    Comentário por Mayck Xavier — 25/09/2008 @ 13:53 | Responder

  2. Para converter videos para dvix é muita dificuldade com os players de mesa.
    Mas até hoje nenhum player de mesa rejeitou o ‘xvid’, incrivel não ?

    O modo o qual uso para mesclar a legenda é esse :
    mencoder -oac copy -ovc xvid -xvidencopts fixed_quant=3:quant_type=mpeg -vf lavcdeint,scale=$video_res,harddup -subpos 95 -subcp iso-8859-15 -sub $arquivo_legenda -subfont-autoscale 1 -font $FONT_FILE -ass -ffactor 1 -sub-fuzziness 0 -subfont-blur 2 -ass-color FCC900 -o $arquivo_out $ARQUIVO_AVI

    -oac copy => porque quanto menos mecher melhor
    -ass-color FCC900 => existe esse parametro para mudar a cor da legenda, mas simplesmente nao muda. estranho né?
    -subpos 95 => porque voce nao sabe se o modelo de TV é 100% plana e o tubo dela não tem porcoes laterais escondidas e depois visualizar a terceira linha da legenda praticamente para fora da tela.

    []’s

    Enfim, o restante dos parametros são apenas burocraticos

    Comentário por hamacker — 25/09/2008 @ 17:24 | Responder

  3. hamacker, sobre o oac copy, nao se aplica porque é codificação 2 passos para mpeg4. A ideia é exatamente codificar o video. -ass-color não funfa mesmo. Veja

    -ass (FreeType only)
    Turn on SSA/ASS subtitle rendering. With this option, libass will be used for SSA/ASS external subtitles and Matroska tracks. You may also want to use -embedded‐fonts.

    Ou seja, é só para SSA :] Outro ponto:

    -sub-bg-color
    Specify the color value for subtitles and OSD backgrounds. Currently subtitles are grayscale so this value is equivalent to the intensity of the color. 255 means white and 0 black.

    Legenda SUB, só em preto e branco :]

    -subpos: Acabei de descobrir que preciso mesmo dele, mas nem é por isso. O intuito desse script é codar MP4 pro meu celular, entao eu sei que a resolução é 220×176. Se tenho um filme widescreen, uns 20% da tela vai pro saco (Imagina pelo tamanho da tela o tamanho da perda). Então esse parametro em 95 com o expand faz com que ou o subtitulo pegue o filme, ou se for wide, fique na faixa preta (Excelente pra aproveitar espaço). Já fiz umas mudanças aqui no script pra resolver o problema do subtitulo que mescla com o fundo e fica ilegivel.

    Comentário por Leonardo Amaral — 25/09/2008 @ 18:06 | Responder

  4. E eu esqueci de dizer que meu player não gosta mto do xvid mesmo. Meu tio que ADORA codificar videos (E estudou pracaraio) disse que isso se deve ao fato da Samsung usar um chip de decodificação menos flexivel. Ainda não sei o que é, sei que tentei um *MONTE* de parametros e não deu certo.

    Comentário por Leonardo Amaral — 25/09/2008 @ 18:08 | Responder

  5. Estou atras faz tem para um script que mostrasse os arquivos ocultos………com o botão direito do mouse

    Comentário por Phanton — 26/09/2008 @ 12:09 | Responder

  6. Opa,

    Voltando da lua agora (hauhauaha)

    Gostei, é bom śaber que dá pra fazer com qualidade no linux mas… Hum.. tem como por uma GUI nisso? Ficaria show! :P

    PS: To te devendo uma resposta daquele doc. envio hj a tarde!

    Bom Final de Semana!

    Comentário por José Vitor — 26/09/2008 @ 12:48 | Responder

  7. Eu queria exatamente NÃO precisar de uma GUI. A idéia é gerar com a maxima qualidade possivel (mas sem desperdicio) filmes para DVDs DIVX e Celulares com MP4. O Script do celular eu alcancei estado de arte ontem, e agora to reimplementando ele em python pra poder ter um progressbar :]

    P.s: Esquenta mto não sobre o doc nao :p

    Comentário por Leonardo Amaral — 26/09/2008 @ 13:38 | Responder

  8. […] bacanas, ofendi e repudiei os evangélicos, bati cabeça no prego, desenvolvi muitas coisas boas e interessantes para e com o mundo SL, reconheci pessoas brilhantes (E que, ainda hoje estão brilhando!), […]

    Pingback por Papai noel… — 08/12/2008 @ 21:22 | Responder


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Crie um website ou blog gratuito no WordPress.com.

%d blogueiros gostam disto: