Vídeo e Audio digital: usando MPEG-4 e OGG Vorbis no Linux

Fabio Pugliese Ornellas, fabio.ornellas arroba poli.usp.br
Versão 1.2.1, 2004.08.10


  1. Introdução
  2. Versões
  3. Licença
  4. Tecnologias
  5. Ferramentas
  6. Codificando
  7. Extraindo as Legendas de um DVD
  8. Unindo audio e vídeo
  9. Outras ferramentas
  10. Referências
  11. Glossário


1. Introdução

Este documento tem por finalidade ser um guia completo para criação de filmes com vídeo em MPEG-4 e audio em OGG Vorvis, explorando os parâmetros dos codificadores, para assim obter filmes da mais alta qualidade. Isso envolve um pouco de matemática e principalmente paciência. Este documento aborda a questão de uma maneira mais técnica. Se você procura uma maneira simples de codificar filmes, este documento não foi feito para você, procure então nas referências por dvd::rip:.

Será utilizado como exemplo, a codificação de um filme gravado em um DVD para que caiba em um único CD, abordando assim, as diversas etapas para a codificação do audio e do vídeo.

Apesar deste artigo estar focado para Linux, muitos dos conceitos aqui apresentados se aplicam a outros sistemas também. Portanto, não importa se você pretende codificar filmes no Windows, as ferramentas mudam, os conceitos e passos continuam os mesmos.

2. Versões

A última versão deste documento pode ser encontrada em: (http://orbita.starmedia.com/~neofpo/)

Histórico de versões:

2003.02.15
Primeira versão, não disponível publicamente.

2004.05.02 - v1.0
Versão pré-final, distribuida apenas para alguns amigos para avaliação.

2004.07.09 - v1.1
Versão aberta ao público, com pequenas correções.

2004.08.03 - v1.2
Pequenas correções ao longo do texto.

2004.08.10 - v1.2.1
Adicionado link para meu site pessoal.

3. Licença

Este documento é distribuido com o intúito de ser útil as pessoas. Permissão para reprodução e cópias é garantida para fins apenas não comerciais, com a única e exclusiva exigência de que o autor e a fonte sejam mencionados. Para quaisquer outra forma de utilização, por favor entre em contato com o autor.

4. Tecnologias

Conheça as tecnologias de compressão de audio e vídeo que iremos utilizar.

4.1. Vídeo

Dentre os diversos codecs de vídeo existentes, o que possibilita uma das melhores compresões, é o MPEG-4. O formato foi desenvolvido a partir do Microsoft MPEG-4 (DivX 3) e possui uma capacidade de compressão muito superior ao original.

Há uma confusão comum com o nome MPEG-4. Esse nome se refere a um padrão de tecnologia de compressão de vídeo, o que significa que existem diversos softwares que a utilizam. Alguns exemplos são DivX (www.divx.com), XviD (www.xvid.org), FFmpeg (ffmpeg.sf.net). Portanto, quando usualmente se fala em um filme "DivX", estamos na verdade se referindo a um filme em MPEG-4, que pode ou não ter sido codificado usando DivX.

Em testes comparativos, o FFmpeg se mostra mais rápido e atinge melhores resultados que o DivX e Xvid. Usaremos neste documento portanto, o FFmpeg.

4.2. Audio

O MP3 é tido como o padrão atual para compressão de áudio e distribuição de músicas pela internet. Porém já existem tecnologias melhores. Em www.xiph.org, você encontra o OGG Vorbis, que tem uma capacidade de compressão muito superior ao MP3.

A taxas de bit iguais, o Vorbis consegue atingir uma melhor qualidade que o MP3, principalmente com taxas de bit baixas. Um MP3 a 64kbps e 44.1kHz parece estar a amostrado a 22.05kHz, o formato tende a filtrar as altas frequências e prodizir aberrações cromáticas, quando se diminui demais a taxa de bits. Por outro lado, o OGG Vorbis a baixas taxas de bit não serve de filtro para altas frequências, e consegue excelentes resultados, que não soam ruim ao ouvido humano. Podemos conseguir um audio de boa qualidade, em estéreo, usando Vorbis a apenas 64kbps.

4.3. Formato

O trivial é usar o formato AVI (Audio-Vídeo Interleaved) para armazenar o filme. AVI é um formato antigo e muito popular. No lugar dele, vamos optar por utilizar o OGG (ou OGM - OGG Media Stream), desenvolvido por www.xiph.org. Esse formato permite o armazenamento de diversas trilhas de audio/vídeo e até legenda, tudo em um único arquivo. O formato ainda não é muito popular, mas players mais modernos, incluindo alguns de Windows (VPlayer - www.vplayer.albion.top.pl e RadLight - www.radlight.net, aceitam o formato e decodificam o audio em OGG Vorbis. O famoso Windows Media Player também é capaz de reproduzir arquivos OGM, com a instalação de novos codecs. Os melhores player para Linux aceitam o formato normalmente.

Pode-se também utilizr o formato Matroska, que é o novo padrão para filmes, muito mais poderoso que o OGG, porém mais recente e não tão popular.

5. Ferramentas

Segue uma lista das ferramentas que iremos utilizar. Não aparecerão detalhes sobre como instalar ou configurar, cabe ao leitor procurar saber como proceder. Procure na sua distribuição, as mais modernas já vem com pacotes da maioria destes programas. Para quem usa Debian, algumas das ferramentas estão disponíveis em marillat.free.fr.

5.1. MPlayer

Esta é a nossa principal ferramenta e pode ser encontrada em www.mplayerhq.hu. O MPlayer é um player versátil, capaz de reproduzir filmes em diversos formatos e suporta todos os codecs modernos, possui diversos drivers de saída de vídeo, e audio, incluindo drivers específicos para certas placas de vídeo, o que possibilita que se aproveite ao máximo o potencial da sua máquina. Junto com o MPlayer vem o MEncoder, que a partir de qualquer filme que seja legível pelo MPlayer, pode recodificá-lo usando inúmeros codecs, incluindo MPEG-4 e MP3.

E não se esqueça: leia a documentação! O MPlayer possui uma documentação muito completa em sua árvore de fontes (DOCS/documentation.html).

5.2. Vorbis Tools

Em www.xiph.org o pacote vorbis-tools pode ser encontrado. Ele contém ferramentas que permitem a compressão do audio no formato OGG Vorbis. Usualmente, as distribuições costumam vir com este pacote. Mas atenção: pegue a versão 1.0 final no mínimo. Se você tem uma versão anterior, atualize. As antigas irão funcionar, porém não contém inúmeras melhorias no algoritmo de compressão, e não irão comprimir com qualidade tão boa quanto a 1.0.

5.3. OGMtools

Pegue este pacote de ferramentas em www.bunkus.org/videotools/ogmtools/. Com ele será possível unir o audio em OGG Vorbis e o vídeo no formato MPEG-4 em um arquivo no formato OGG (OGM).

5.4. Transcode

O transcode (www.theorie.physik.uni-goettingen.de/~ostreich/transcode/) é uma compilação de ferramentas multimídia, para diversas aplicações e formatos. No nosso caso, algumas das suas ferramentas serão usadas para extrair as legendas do DVD.

5.5. SubRip

Como o nome sugere, podemos extrair as legendas de um DVD com ele: subtitleripper.sourceforge.net. Iremos precisar do script pgm2txt. Procure por ele no pacote com as fontes do programa. O pacote para Debian o disponibiliza em /usr/share/doc/subtitleripper/examples/pgm2txt.gz.

5.6. GOCR

Programa para reconhecimento de caracteres; uso em conjunto com os dois últimos acima para extrair as legendas: jocr.sf.net. Pegue uma versão recente do GOCR, algumas das funções que serão utilizadas aparecem apenas em versões mais recentes (>=0.3.7).

6. Codificando

Codificar um DVD para caber em um único CD é uma tarefa que exige diversos passos e um pouco de paciência. O método é o seguinte:

Cada passo será explicado adiante.

6.1. Audio

No nosso exemplo, codificaremos o título 1 de um DVD. Não esqueça de selecionar a trilha de audio correta. Liste as trilhas disponíveis com:

  $ mplayer dvd://1 -frames 0 -vc none -v 2>/dev/null | \
    grep -e \\[open\\]
Você deverá encontrar algo como:
  [open] audio stream: 0 audio format: ac3 (5.1) language: en aid: 128
  [open] audio stream: 1 audio format: ac3 (stereo) language: en aid: 129
  [open] number of audio channels on disk: 2.
  [open] subtitle ( sid ): 0 language: en
  [open] subtitle ( sid ): 1 language: es
  [open] subtitle ( sid ): 2 language: pt
  [open] number of subtitles on disk: 3
Para selecionar o inglês, use -aid 128 ou -alang en.

Iremos agora usar o MPlayer para decodificar o audio do DVD, e enviá-lo em formato descomprimido através de um FIFO para o oggenc codificá-lo em OGG Vorbis. Então:

  $ mkfifo fifo
  $ mplayer dvd://1 -aid 128 -ao pcm -aofile fifo -vc dummy -vo null
Agora, em outro terminal, rode no mesmo diretório:
  $ oggenc -q -1 --resample 44100 -o audio.ogg fifo
A opção -q seleciona a qualidade do audio (-1<=q<=10). Usamos aqui -1, que para filmes, com diálogos na maior parte do tempo, está muito bom. Para músicas, é comum usar 3 ou 4. Pense que quanto melhor a qualidade do audio, pior será a qualidade do vídeo.

Se preferir você pode especificar a taxa de bits alvo com -b 64 por exemplo, no lugar de -q. Porém, é mais interessante manter uma qualidade constante com -q do que uma taxa de bits constante com -b.

O --resample é recomendado, pois os DVDs costumam vir com a taxa de amostragem 48kHz, o que armazena frequências acima do que a maioria das pessoas pode escutar, por isso 44100Hz é recomendado, armazenado assim frequências de no máximo 22050Hz.

Após alguns minutos, teremos o arquivo audio.ogg contendo a trilha de audio do título 1 do DVD. Vejamos agora o comprimento do filme com:

  $ ogginfo audio.ogg
Encontre uma linha contendo o comprimento:
  Playback length: 121m:19s
Anote o comprimento do filme (Playback Length), converta para segundos e guarde o valor. No caso: 1279 segundos. Anote também o tamanho do arquivo audio.ogg. No exemplo: 47463888 bytes. Esses dados serão usados no cálculo da taxa de bits do vídeo.

Você pode ouvir o que acabou de codificar com:

  $ ogg123 audio.ogg.

6.2. Vídeo

A codificação do vídeo exige um cuidado especial. Inúmeros parâmetros tem de ser configurados para garantir uma boa qualidade.

Temos que:

6.2.1. Cálculo da taxa de bits

Já temos o audio pronto, podemos calcular então a taxa de bits do vídeo com a seguinte formula:

             [ ( tam_cd * 1024 * 1024 ) - tam_audio ] * 8
  vbitrate = --------------------------------------------
                     comp_filme * 1000 * 1.0115
Onde:
Variável Significado
vbitrate taxa de bits do vídeo em Kilo Bits por segundo
tam_cd tamanho do CD em Mega Bytes
tam_audio tamanho do arquivo audio.ogg em Bytes
comp_filme comprimento do filme em segundos

O valor 1.0115 é um parâmetro de correção, usado para descontar o espaço usado pelo encapsulamento das trilhas de audio e vídeo pelo formato OGG. No exemplo, para um CD de 700M chegamos a 746 kbit/s.

6.2.2. Redimensionamento

Em geral, redimensionar o tamanho do vídeo é uma boa idéia. Se codificarmos o vídeo com o tamanho nativo do DVD, iremos ter 3 problemas:

  1. Nem sempre o tamanho do vídeo corresponde ao aspecto correto. Por exemplo, um DVD com o vídeo de aspecto 1.78, em geral tem o vídeo de tamanho 720x480, mas ele guarda a informação do aspecto correto, o que obriga o seu redimensionamento para 854x480 no momento da reprodução. Essa informação do aspecto correto pode ser armazenada em umm trilha de vídeo em MPEG-4, mas apenas alguns poucos reprodutores irão utilizar este parâmetro.
  2. O tamanho do vídeo no DVD é exageradamente grande para colocar o filme em um único CD (ou mesmo em 2 CDs). A qualidade irá ficar muito baixa.
  3. As usuais tarjas pretas dos filmes ocupam Bits preciosos, que poderiam ser usados em outrto lugar do filme. O que nos resta é diminuir o tamanho do filme e remover eventuais tarjas pretas.

6.2.2.1. Aspecto e tarjas pretas

Vamos descobrir o tamanho e o aspecto real do filme com:

  $ mplayer dvd://1 -frames 0 -identify 2> /dev/null | grep "\<ID_VIDEO"
Esse comando, se nao houver erros, deverá mostrar os dados sobre a trilha de vídeo:
  ID_FILENAME=dvd://1
  ID_VIDEO_FORMAT=0x10000002
  ID_VIDEO_BITRATE=9800000
  ID_VIDEO_WIDTH=720
  ID_VIDEO_HEIGHT=480
  ID_VIDEO_FPS=29,970
  ID_VIDEO_ASPECT=1,7778
Note que o tamanho do vídeo é 720/480=1.5, que é diferente do aspecto correto, 1.7778. Para corrigir isso, o filme deve ser expandido para (1.7778/1.5*720)/480, ou seja, 854/480. Isso significa que, após recortarmos as tarjas pretas, o tamanho do filme deve ser corrigido dessa maneira.

O MPlayer, possui um filtro que detecta automaticamente a região a ser recortada. Rode:

  $ mplayer dvd://1 -vf cropdetect
Observe no console, você deverá encontrar linhas como esta:
  crop area: X: 0..719  Y: 60..414  (-vf crop=720:354:0:60)%  3,4% 0 0 0%
Procure avançar até um momento do filme no qual a imagem esteja bem clara, para que a detecção funcione melhor. Os parâmetros entre parênteses, identificam a região a ser recortada. Teste a seleção com:
  $ mplayer dvd://1 -vf crop=720:354:0:60
Você deverá estar agora assistindo o vídeo sem as tarjas pretas.

Note que essa área delimitada com o filme (720/354) ainda é a área antes da correção para o aspecto correto. O tamnaho correto seria: (1.7778/1.5*720)/354 = 854/354. Então, o aspecto real do filme é 854/354, ou aproximadamente 2.35/1. Esse aspecto que deverá ser levado em conta na ora de diminuir o tamanho do filme, e não o 1.7778.

6.2.2.2. Bits por pixel

Agora com o valor correto do aspecto do filme, podemos redimensionar o filme, e escolher um bom tamanho. É difícil encontrar um bom tamanho. Muito pequeno, irá acabar disperdiçando bits, e o arquivo final ficará menor que o desejado, e muito grande (como o tamanho original) irá com certeza diminuir demasiadamente a qualidade, deixando apenas blocos visíveis.

Para ajudar nesta decisão, podemos avaliar a qualidade do vídeo através da taxa de bits por pixel. A seguinte fórmula dá este valor:

          vbitrate * 1000
  bpp = ----------------------
        largura * altura * qps
Onde:

Variável Significado
bpp bits por pixel
vbitrate taxa de bits do vídeo
largura largura final do filme
altura altura final do filme
qps quadros por segundo final

Esse número, indica o quanto de informação que será destinada, medianamente, para cada pixel do filme. Logicamente, quanto maior, melhor a qualidade. Em geral, o seguinte vale:

bpp Recomendação
< 0.10 não use! você vai ver apenas os blocos...
< 0.15 vai ficar ruim
< 0.20 os blocos poderão ser notados, mas vai ficar bom
< 0.25 vai ficar muito bom!
> 0.25 não vai melhorar muito visualmente
> 0.30 não use, tente uma resolução maior ou aumente o qps

Note que esses valores não são regra. Isso depende muito de cada filme. Filmes com muita riquesa de detalhes e com cenas com muito movimento, poderão necessitar de um bpp de 0.30 para ficar bom, enquanto um filme com pouca riquesa de detalhes e pouco movimento pode precisar de apenas 0.20. Use esses valores como base para uma primeira codificação, se o resultado não for bom, tente aumentar o bpp para melhorar a qualidade. No próximo tópico, você encontra uma análise mais matemática e precisa de como escolher um bom tamanho para redimensionar.

Podemos aumentar o bpp fazendo:

Os DVDs em geral, usam 30000/1001=29.97qps. No nosso caso, usar um qps de 24000/1001=23.98qps é muito recomendado. Isso melhorará em 25% o bpp, a uma diminuição no qps pouco perceptível. A perda de qualidade devido a diminuição do qps depende muito de como o DVD foi feito. DVDs que são na verdade filmes VHS NTSC em convertidos para formato digital, são originalmente 24000/1001=23.976qps e ao convertê-lo para o DVD, são adicionados quadros duplicados para atingir os 29.97qps. Num caso como este, não há perda de qualidade ao se diminuir o qps, mas se o filme tiver sido produzido a 29.97qps, você estará jogando informação fora. Essa é uma questão de tentativa e erro. Não há como dizer previamente se irá ficar um bom ou mau resultado sem testar. Há casos em que filmes originalmente a 29.97qps convertidos para 23.976qps ficam aceitáveis e há casos que ficam muito ruins de se assistir (a imagem parece estar "quadro a quadro"). As vezes o ganho na qualidade da imagem compensa a perda no qps. Está a seu cargo decidir.

Diminua a área do filme, de maneira a ajustar o bpp de acordo com o seu gosto. O programa seguinte escrito em C o ajudará a fazer escolher o tamanho. Compile ele com:

  $ gcc programa.c -o programa -lm
Início do programa:
  #include <stdio.h>
  #include <math.h>
  double aprox(double valor) {
    if(valor-((double)(int)valor)>0.4)
      return(((double)(int)valor)+1.0);
    else
      return ((double)(int)valor);
  }
  int main () {
    double vbitrate, qps, largura, altura, bpp, largura_f, altura_f;
    printf("Entre a taxa de bits do vídeo (kbit/s): ");
    scanf("%lf", &vbitrate);
    printf("Entre o número de quadros por segundo: ");
    scanf("%lf", &qps);
    printf("Entre o aspecto do filme (largura:altura): ");
    scanf("%lf:%lf", &largura, &altura);
    printf("\nTamanhos recomendados:\nbpp\tlargura\taltura\n");
    for(largura_f=160; bpp >= 0.3; largura_f=largura_f+16) {
      bpp=(vbitrate*1000)/(largura_f*(largura_f/(largura/altura))*qps);
    }
    do {
      printf("%.3lf\t%.0lf\t%.0lf\n",bpp, largura_f, largura_f/(largura/altura));
      largura_f=largura_f+16;
      bpp=(vbitrate*1000)/(largura_f*(largura_f/(largura/altura))*qps);
   } while(bpp >= 0.1);
  }
Fim do programa.

No exemplo, obtemos:

  Entre a taxa de bits do vídeo (kbit/s): 746
  Entre o número de quadros por segundo: 23.976
  Entre o aspecto do filme (largura:altura): 854:354
  
  Tamanhos recomendados:
  bpp    largura    altura
  2.423	176	73
  2.036	192	80
  1.735	208	86
  1.496	224	93
  1.303	240	99
  1.145	256	106
  1.015	272	113
  0.905	288	119
  0.812	304	126
  0.733	320	133
  0.665	336	139
  0.606	352	146
  0.554	368	153
  0.509	384	159
  0.469	400	166
  0.434	416	172
  0.402	432	179
  0.374	448	186
  0.349	464	192
  0.326	480	199
  0.305	496	206
  0.286	512	212
  0.269	528	219
  0.254	544	225
  0.239	560	232
  0.226	576	239
  0.214	592	245
  0.203	608	252
  0.193	624	259
  0.183	640	265
  0.174	656	272
  0.166	672	279
  0.159	688	285
  0.151	704	292
  0.145	720	298
  0.139	736	305
  0.133	752	312
  0.127	768	318
  0.122	784	325
  0.117	800	332
  0.113	816	338
  0.108	832	345
  0.104	848	352
  0.101	864	358
Portanto uma boa resolução é 528/219.

6.2.2.2.1. Alternativa: usando um pouco de matemática

Seria interessante saber o quanto o codec necessita de bits por pixel para um quantizador definido (ver glossário), antes de codificarmos o filme. Dessa maneira, poderíamos escolher um quantizador alvo, 4 por exemplo, e diminuir o tamanho do filme tal que o quantizador médio após a codificação fique próximo do valor programado, não correndo o risco de escolher um tamanho grande demais, e qualidade fique no quantizador 7 por exemplo, e nem pequeno demais com quantizador 2.

Fazendo uma análise estatística do quantizador, podemos chegar a uma relação matemática do tipo:

  bpp(area)
para um quantizador constante.

Esta relação nos dará os bits por pixel requeridos para uma determinada área do filme, para um quantizador alvo. Observe o gráfico abaixo:

O gráfico foi obtido a partir de diversas codificações de um mesmo vídeo, a quantizadores fixos. Para cada quantizador, o filme foi codificado em diversas resoluções (áreas), e calculado o respectivo bits por pixel. O vídeo usado foi um capítulo de um filme de ação, rico em detalhes e muito movimento. Filmes com menos detalhes e movimentos, certamente necessitam de menos bits.

Cada curva do gráfico, representa a relação de necessidade de bits por pixel para um quantizador fixo, partindo de 2 na curva mais acima até 11 na curva mais abaixo. Note que, para um mesmo quantizador, conforme a área do vídeo cresce, a necessidade de bits por pixel decai. Podemos aproximar essa curva por:

  bpp=B*area^M
Onde B e M são parâmetros específicos para cada quantizador:
quantizador B M
2 27.5122 -0.294557
3 23.9859 -0.325085
4 21.7040 -0.341064
5 17.0644 -0.345729
6 14.4820 -0.347710
7 10.8990 -0.341110
8 8.87612 -0.335452
9 6.50144 -0.322110
10 5.20340 -0.312703
11 3.87393 -0.298032

Então, partindo de:

        vbitrate * 1000
  bpp = ---------------
          area * qps
  
  bpp=B*area^M
juntamos, obtendo a relação:
  vbitrate * 1000
  --------------- = B*area^M
    area * qps
e finalmente:
  area=(vbitrate * 1000 / (qps*B))^(1/(M+1))
Que nos dá uma área ideal para redimensionarmos, dados quadros por segundo e taxa de bits do vídeo constantes, para um determinado quantizador alvo.

No nosso exemplo, vamos definir como quantizador alvo 4, que será suficiente para garantir uma excelente qualidade de imagem:

  area=(746*1000/(23.976*21.7040))^(1/(-0.341064+1))
  
  area=61685
Como o aspecto do filme é 854/354, podemos achar as dimensões ideais:
  aspecto = largura / altura
  
  largura = aspecto * altura
  
  area = largura * altura
  
  area = aspecto * altura^2
  
  altura = (area/aspecto)^0.5
No nosso exemplo:
  altura = (61685/(854/354))^0.5
  
  altura=160
E para a largura:
  largura = aspecto * altura
No exemplo:
  largura = (854/354) * 160
  
  largura=386
Finalmente chegamos a conclusão de que um bom tamanho para se redimensionar é 386:160. Isso garantirá que o quantizador médio fique próximo de 4. Note que este tamanho é muito pequeno. Isso fará o filme ter uma alta qualidade, porém, em uma visualização em tela cheia, ficará embassado. Às vezes é preferível que o filme perca um pouco a qualidade, e ganhe definição, para uma visualização em tela cheia. Isso depende do gosto e experiência de quem está fazendo a codificação.

Fazendo as contas com quantizador 5, chegamos a 482:200, que é um valor mais razoável. Como boa parte do algorítmo de compressão trabalha com partes de 8 pixels, é interessante arredondar o valor para da largura para um múltiplo de 8: 480:199. Podemos arredontar o valor da altura para um múltiplo de 8 também: 480:200. Haverá um erro pequeno no aspecto, mas será imperceptível.

O valor estimado usando apenas os bits por pixel foi de 528:219, 20% maior em área, que é muito próximo do valor para quantizador 6, 556:231.

Note mais uma vez que os parâmetros B e M da fórmula acima, foram encontrados para um filme em específico, um filme com bastante movimento e cores. Use esses valores como base apenas. Eles não são regra, e podem variar consideravelmente de filme para filme. De maneira geral, tente usar o método acima, com quantizador alvo 4, 5, ou 6. Valores de quantizadores maiores não irão dar bons resultados provavelmente; valores menores irão resultar em filmes demaseadamente pequenos.

6.2.2.3. Parâmetros finais

Então, temos que no momento da codificação, deveremos usar:

  -vf crop=720:354:0:60,scale=528:219 -ofps 24000/1001
Isso irá recortar as tarjas pretas, redimensionar para um tamanho menor e diminuirá o qps para um valor razoável.

6.2.3. Legendas

Caso queira adicionar legendas diretamente sobre o filme, passe a opção -sid ou -slang para o MEncoder.

  $ mplayer dvd://1 -frames 0 -vc none -v 2>/dev/null | \
    grep -e \\[open\\]
  [open] audio stream: 0 audio format: ac3 (5.1) language: en aid: 128
  [open] audio stream: 1 audio format: ac3 (stereo) language: en aid: 129
  [open] number of audio channels on disk: 2.
  [open] subtitle ( sid ): 0 language: en
  [open] subtitle ( sid ): 1 language: es
  [open] subtitle ( sid ): 2 language: pt
  [open] number of subtitles on disk: 3
No exemplo iremos utilizar legendas em portugês, então -sid 2 ou -slang pt.

6.2.4. Finalmente: Codificando

Com todos os dados que temos, podemos agora codificar o vídeo (não esqueça de substituir os parâmetros pelos que você encontrar):

  $ rm divx2pass.log
  $ mencoder dvd://1 \
      -nosound \
      -sid 2 \
      -ovc lavc \
      -lavcopts vcodec=mpeg4:mbd=1:v4mv:vpass=1:vbitrate=746 \
      -ofps 24000/1001 \
      -vf pp=hb/vb/dr/ci,crop=720:354:0:60,scale=528:219,denoise3d \
      -o /dev/null && \
    mencoder dvd://1 \
      -nosound \
      -sid 2 \
      -ovc lavc \
      -lavcopts vcodec=mpeg4:mbd=1:v4mv:vpass=2:vbitrate=746 \
      -ofps 24000/1001 \
      -vf pp=hb/vb/dr/ci,crop=720:354:0:60,scale=528:219,denoise3d \
      -o video.avi
Essa é a etapa mais demorada. Após algumas horas, o vídeo estará pronto em video.avi. Note que o MEncoder é chamado duas vezes, mudando apenas o parâmetro vpass=1/2. Desse modo, na primeira vez, é criado um arquivo de log descrevendo como é o filme ao longo do tempo, aonde precisa de maior taxa de bits, aonde precisa de menos. Na segunda vez, o filme é codificado levando esses dados em conta, gerando um arquivo de qualidade constante, e não taxa de bits constante. Se você estiver com pressa, pode-se suprimir o parâmetro vpass, e chamar o mencoder apenas uma vez, e conseguir uma codificação mais rápida, ao custo de uma qualidade mais baixa.

Os outros parâmetros, são o seguinte:

pp=hb/vb/dr/ci
Filtros de deblocking (hb/vb), dering (dr) e de-entrelaçamento cúbico (ci). Use esse último somente se o DVD for entrelaçado (aparecem riscos horizontais em regiões de movimento, quando assistido sem de-entrelaçamento).
denoise3d
Filtro para altas frequências na imagem. Geralmente acaba melhorando a imagem a ser codificada, facilitando o trabalho do codec. Usa bastante CPU, use somente se quiser realmente alta qualidade.

6.2.4.1. Melhorando mais a qualidade: análise do quantizador

Quando se faz a codificação em 2 etapas, o arquivo divx2pass.log armazena inúmeras informações sobre o filme, dentre elas o quantizador médio por quadro (ver glossário). Estas informações podem ser analisadas e ajudar a decidir se o tamanho de filme escolhido está grande ou pequeno.

Para isso, faça o passo 1 da codificação, para obter o divx2pass.log. Utilize o Shell Script seguinte para ver como foi a distribuição dos quantizadores:

Início:

  !/bin/sh
  cat | cut -d: -f 5 | cut -d, -f1 | cut -d, -f1 | {
  read quant
  lines=0
  sum=0
  while [ -n "$quant" ]
  do
    total[$quant]=$[total[$quant]+1]
    sum=$[$sum+$quant]
    lines=$[$lines+1]
    echo -en "Linhas processadas: $lines\r"
    read quant
  done
  echo
  echo
  echo Quantizador médio: $[$sum/$lines]
  echo
  max=0
  for (( i=1 ; i < 32 ; i=$[$i+1] ))
  do
   if [ -n "${total[$i]}" ]
     then
       if [ ${total[$i]} -gt $max ]
       then
         max=${total[$i]}
       fi
     fi
  done
  cols=$[`tput cols`-8]
  for (( i=1 ; i < 32 ; i=$[$i+1] ))
  do
    if [ -z "${total[$i]}" ]
    then
      total[$i]=0
    fi
    echo -en "$i\t"
    for (( j=1 ; j <= $[${total[$i]}*$cols/$max] ; j=$[$j+1] ))
    do
      echo -n =
    done
    echo
  done
  } 
Fim.

No exemplo obtive:

  $ countquant.sh < divx2pass.log
  Linhas processadas: 174530
  
  Quantizador médio: 3
  
  1
  2       =============================================
  3       ======================================
  4       =========================
  5       ================
  6       =========
  7       ======
  8       ====
  9       ==
  10      ==
  11      =
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  
No exemplo, vemos que o filme ficou com uma qualidade muito boa, já que o quantizador médio foi 3 e não temos uso de quantizadores maiores que 11. Podemos, se preferir, aumentar o tamanho do filme, e mesmo assim conseguir uma qualidade boa.

Dependendo do filme, a distribuição pode ser mais disforme, com um quantizador médio alto, o que significa que você escolheu um tamanho muito grande para o filme, e deveria diminuir o tamanho do filme para ganahr mais qualidade.

6.2.5. Codificação alternativa: qualidade constante

Caso o objetivo seja gerar um filme com qualidade constante, e não programado para ter um tamanho específico, pode-se codificá-lo em função do quantizador (ver glossário). Um exemplo de codificação com uso de quantizador, a qualidade constante seria:

  $  mencoder dvd://1 \
      -nosound \
      -sid 2 \
      -ovc lavc \
      -lavcopts vcodec=mpeg4:mbd=1:v4mv:vqscale=4:vbitrate=746 \
      -ofps 24000/1001 \
      -vf pp=hb/vb/dr/ci,crop=720:354:0:60,scale=528:219,denoise3d \
      -o video.avi
Onde o parâmetro vqscale indica o quantizador utilizado. Quantizador em 1, gerará um arquivo muito maior, e com pouca diferença de qualidade; 2, qualidade excelente, muito próximo do original; 3, muitos poucos blocos visíveis; 4, poucos blocos visíveis (recomendado na maioria dos casos); 5, alguns blocos visíveis; 6 e maiores, muitos blocos visíveis e baixa qualidade.

7. Extraindo as Legendas de um DVD

Seria interessante ter as separadas do filme, como no DVD. Extrair as legendas do DVD é complicado e nem sempre dá bons resultados. O problema é que as legendas do DVD são uma camada de imagem que fica por cima do filme, não é texto puro. Extrair as legendas para texto puro envolve ou digitação manual, ou uso de um software OCR. A solução seguinte, faz uso do GOCR. Ele apenas é eficiente se a separação entre as letras for boa, caso contrário, será um árduo trabalho de digitação nos lugares onde o GOCR não conseguir "ler". Como descrito na página do manual do ogmmerge, segue:

  1. Primeiro extraia a trilha de legenda do DVD para imagens PGM:
      # mkdir /mnt/dvd
      # mount /dev/dvd /mnt/dvd
      $ tccat -i /mnt/dvd/ -T 1 -L | \
        tcextract -x ps1 -t vob -a 0x22 | \
        subtitle2pgm -P -o meufilme
    
    A opção -T do tccat diz para extrair a legenda do título 1 (veja mais informações em sua página do manual). O parâmetro 0x22 do tcextract, é um número hexa-decimal que indica a legenda a ser usada. Seu valor é calculado adicionando-se o número que se passa ao -sid do MEncoder a 0x20. No nosso caso, sid=2, logo 0x20+2=0x22.

  2. Converta as imagens PGM para texto com auxílio do GOCR:
      $ pgm2txt meufilme
    
    Este script irá automatizar o processo de OCR para você. Se quiser ver o que está sendo lido, use a opção -v. Por padrão o xv é chamado para mostrar as imagens, sugiro que se edite o script e mude a linha IMAGE_VIWER=xv para IMAGE_VIWER=xli.

    Se o resultado não for satisfatório, utilize a opção -d, com ela será criada uma nova base de dados exclusiva para o filme, e a cada letra nova, o GOCR irá pedir que você a digite. Na próxima ocorrência, ele já fará a leitura correta. Caso o GOCR leia mais de uma letra de cada vez, você deverá digitar o correto entre aspas.

  3. Se preferir, passe o corretor ortográfico:
      $ ispell -d ibrazilian *txt
    

  4. Converta os arquivo texto para o formato de legenda SRT:
      $ srttool -s -w -i meufilme.srtx -o legenda.srt
    

8. Unindo audio e vídeo

O audio e o vídeo podem agora ser unidos em um único arquivo, no formato de sua escolha.

8.1. OGM

Unindo o audio, vídeo e a legenda em um único arquivo OGG (OGM):

  $ ogmmerge audio.ogg video.avi legenda.srt -o meufilme.ogm
Pronto! O arquivo meufilme.ogm contém o seu filme incluindo as legendas! Para assistir:
  $ mplayer meufilme.ogm

Se preferir, pode dividir o filme em quantos CDs quiser. Para isso, basta que se calcule a taxa de bits do vídeo para atingir o máximo de espaço disponível na soma dos CDs e depois dividir o arquivo final em partes do tamnho de cada CD:

  $ ogmsplit -o cd.ogm -s 700 filme.ogm
Onde o filme.ogm, maior que 700M, será dividido em arquivos cd-000001.ogm, cd-000002.ogm, e assim por diante, cada um com 700M ou menos.

8.2. Matroska

Se preferir, use o novo formato Matroska para armazenar o filme. Use o utilitário mkvmerge GUI que vem no pacote MKVToolNix, disponível em www.matroska.org para unir audio, vídeo e legenda em um único arquivo. Consulte a documentação do programa se tiver dúvidas, o programa é auto explicativo.

9. Outras ferramentas

9.1. Xine

Um excelente player, com suporte a inúmeros formatos de vídeo e audio, inclusive suporte a menu de DVD: xinehq.de.

9.2. AVI Demux

Um pequeno programa de edição de vídeo para Linux, suporta diversos formatos e possui muitos filtros: fixounet.free.fr/avidemux/.

9.3. HVirtual

Ambiente completo para edição de audio e vídeo, muito poderoso: heroinewarrior.com.

9.4. Kino

Editor de vídeo não linear para Linux. Suporta captura de vídeo, e inúmeros formatos: www.schirmacher.de/arne/kino/.

9.5. AVI File

Projeto que inclui um player, ferramentas para capturar vídeo e codificar AVI em diversos formatos: avifile.sf.net.

9.6. Zapping

Visualizador de TV para Linux, com suporte a captura de vídeo: zapping.sf.net.

9.7. dvd::rip:

Programa gráfico simples de usar que usa o transcode dentre outras ferramentas, para copiar DVDs: www.exit1.org/dvdrip/.

9.8. Ogle

DVD Player com suporte a menus: www.dtek.chalmers.se/groups/dvd/.

10. Referências

11. Glossário

codec
Do inglês coder / decoder. Nome que se dá a um formato digital de compressão de audio ou vídeo. Ex: MPEG-4, MP3 e OGG Vorbis são codecs.
fifo
Do inglês, First In, First Out (primeiro a entrar, primeiro a sair). Em sistemas Unix, o FIFO é um tipo especial de arquivo, que pode server de pipe entre dois programas. Similar ao que se faz em um Shell com $ comando1 | comando2, pode-se fazer com um fifo com $ comando1 > fifo e $ comando2 < fifo.
formato
Formato no qual as trilhas de audio e vídeo são armazenadas em um arquivo. Podemos ter exatamente o mesmo vídeo e o mesmo audio, com os mesmos codecs, mas armazenados no formato AVI ou OGM.
quantizador
Número que mede a diferênça entre o quadro original e o codificado. Quanto menor esse número, melhor a qualidade da codificação. Esse número varia de 1 a 31, sendo 1 a melhor qualidade possível, onde o quadro codificado é iqual ao original (e maior tamanho), e 31 onde a qualidade da codificação foi péssima, e o quadro codificaodo ficou muito diferente do original, apenas blocos visíveis (menor tamanho).
taxa de amostragem
Taxa na qual um sinal de audio analógico é amostrado para um sinal digital. Ex: DVDs tem o audio amostrado a 48kHz, ou seja, 48000 amostras de audio por segundo.
taxa de bits
Quantidade de bits gastos por unidade de tempo por um determinado codec na compressão de audio ou vídeo. Ex: são comuns MP3 codificados a 128kbps, ou seja, 128000 bits por segundo.
Hosted by www.Geocities.ws

1