16.4. Reprodução de Video

Contribuido por Ross Lippert.

A reprodução de video é uma área de aplicação muito nova e de r´pido desenvolvimento. Seja paciente. Nem tudo esta funcionando itão suavemente como com o som.

Antes de você iniciar, você deve saber qual o modelo de placa de video que você possui e qual o chipset que ela utiliza. Apesar do XFree86 suportar uma ampla variedade de placas de video, poucas possuem uma boa performance de reprodução. Para obter a lista de extensões suportadas pelo servidor X que você está utilizando, utilize o comando xdpyinfo(1) enquanto o X11 estiver sendo executado.

É uma idéia possuir um arquivo MPEG curto, o qual possa ser tratado como um arquivo de teste para avaliar os diversos reprodutores e suas opções. Uma vez que alguns reprodutores de DVD irão procurar por padrão uma mídia DVD no /dev/dvd, ou então possuem este nome dispositivo definido estaticamente no código do programa, você pode achar útil criar links simbólicos apontando para os dispositivos apropriados:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/racd0c /dev/rdvd

No FreeBSD 5.X, o qual utiliza devfs(5) existe um conjunto ligeiramente diferente de links recomendados:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/acd0c /dev/rdvd

Adicionalmente, a decodificação de um DVD, a qual necessite da execução de funções especiais do DVD-ROM, exige permissão de escrita no dispositivo de DVD.

Alguns dos ports discutidos contam com as seguintes opções no kernel para compilarem correatmente. Antes de tentar compilá-las, adicione estas opeções ao arquivo de configuração do kernel, compile um novo kernel, e reinicialize:

option CPU_ENABLE_SSE
option USER_LDT

Para aumentar a memória compartilhada disponível para a interface X11, é recomendado que os valores de algumas variáveis do sysctl(8) sejam aumentadas:

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

16.4.1. Determinando as Capacidades de Video

Há diversas maneiras possíveis de se exibir um vídeo sob X11. Qual realmente irá funcionar depende largamente do hardware utilizado. Cada um dos métodos descritos abaixo terá sua qualidade váriando em função dos diferentes hardwares. Em segundo lugar, a renderização de video em ambiente X11 é um tópico que recebe muita atenção ultimamente, e cada nova versão do XFree86 pode trazer melhorias significativas.

Uma lista das interfaces de video mais comuns:

  1. X11: Saída normal do X11 utilizando memória compartilhada.

  2. XVideo: Uma extensão para a interface X11 a qual suporta video em qualquer X11 drawable.

  3. SDL: Camada simples Directmedia.

  4. DGA: Acesso gráfico direto.

  5. SVGAlib: Camada gráfica para console.

16.4.1.1. XVideo

O XFree86 4.X possui uma extensão chamada XVideo (também conhecida como Xvideo, Xv, ou simplesmente xv) a qual permite que o video seja exibido diretamente em objetos drawable através de uma aceleração especial. Esta extensão prova uma qualidade de reprodução muito boa, mesmo em equipamentos de poucos recursos (por exemplo um um laptop PIII 400 Mhz). Infelizmente, a lista de placas nas quais esta caracteristica é atualmente suportada de forma nativa se limita a:

  1. 3DFX Voodoo 3

  2. Intel® i810 e i815

  3. Alguns chips S3 (tais como Savage/IX e Savage/MX)

Se a sua placa não é uma destas, não fique desapontado ainda. O XFree86 4.X adiciona novas habilidades xv a cada release [1]. Para verificar se a extensão esta executando, utilize o comando xvinfo:

% xvinfo

XVideo is supported for your card if the result looks like:

X-Video Extension version 2.2
screen #0
  Adaptor #0: "Savage Streams Engine"
    number of ports: 1
    port base: 43
    operations supported: PutImage 
    supported visuals:
      depth 16, visualID 0x22
      depth 16, visualID 0x23
    number of attributes: 5
      "XV_COLORKEY" (range 0 to 16777215)
              client settable attribute
              client gettable attribute (current value is 2110)
      "XV_BRIGHTNESS" (range -128 to 127)
              client settable attribute
              client gettable attribute (current value is 0)
      "XV_CONTRAST" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_SATURATION" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_HUE" (range -180 to 180)
              client settable attribute
              client gettable attribute (current value is 0)
    maximum XvImage size: 1024 x 1024
    Number of image formats: 7
      id: 0x32595559 (YUY2)
        guid: 59555932-0000-0010-8000-00aa00389b71
        bits per pixel: 16
        number of planes: 1
        type: YUV (packed)
      id: 0x32315659 (YV12)
        guid: 59563132-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x30323449 (I420)
        guid: 49343230-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x36315652 (RV16)
        guid: 52563135-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x3e0, 0x7c00
      id: 0x35315652 (RV15)
        guid: 52563136-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x7e0, 0xf800
      id: 0x31313259 (Y211)
        guid: 59323131-0000-0010-8000-00aa00389b71
        bits per pixel: 6
        number of planes: 3
        type: YUV (packed)
      id: 0x0
        guid: 00000000-0000-0000-0000-000000000000
        bits per pixel: 0
        number of planes: 0
        type: RGB (packed)
        depth: 1
        red, green, blue masks: 0x0, 0x0, 0x0

Também observe que os formatos listados (YUV2, YUV12, etc) não estão presentes em todas as implementações do XVideo, e a sua ausência pode atrapalhar alguns reprodutores.

se o resultado se paracer com:

X-Video Extension version 2.2
screen #0
no adaptors present

Então provavelmente o XVideo não é suportado na sua placa.

Se o XVideo não é suportado para a sua placa, isto significa somente que será mais difícil para o seu monitor lidar com a demanda computacional envolvida no processo de renderizaão de video. Dependendo da sua placa de video e do seu processador, você pode continuar sendo capaz de ter uma experiéncia satisfatoria. Recomenda-se que você consulte a sessão Seção 16.4.3 para obter maiores informações sobre como melhorar a sua performance.

16.4.1.2. Camada simples directmedia (Simple Directmedia Layer)

O SDL (Simple Directmedia Layer), está tentando se tornar uma camada portável entre Microsoft® Windows®, BeOS, e UNIX®, permitindo o desenvolvimento de aplicativos cross-platform as quais fariam uso eficiente do som e dos gráficos. A camada SDL disponibiliza uma abstração de baixo nível para o hardware o que em algumas vezes pode ser mais eficiente do que a interface X11.

O SDL pode ser encontrado em devel/sdl12

16.4.1.3. Acesso gráfico direto

O acesso gráfico direto é uma extensão do XFree86 a qual permite a um programa contornar o servidor X e alterar diretamente o framebuffer da placa de video. Como ele necessita de acesso ao mapeamento de memória em baixo nível para que este compartilhamento seja possível, os programas que o utilizam devem ser executados como root.

A extensão DGA pode ser testada e avaliada pelo dga(1). Quando o dga está executando, ele altera as cores do monitor sempre que uma tecla é pressionada. Para sair, utilize a tecla q.

16.4.2. Ports e Pacotes para lidar com video

Esta sessão trata dos programas disponíveis na coleção de ports do FreeBSD, os quais podem ser utilizados para reproduzir video. A reprodução de video é uma área de desenvolvimento de software muito ativa, e as caracteristicas de várias aplicações podem divergir um pouco das descrições fornecidas aqui.

Inicialmente, é importante que você saiba que muitas das aplicações de video que rodam no FreeBSD foram desenvolvidas como uma aplicação linux. Muitas destas aplicações permanecem com o status de versões beta (experimentais). Alguns dos problemas que você pode encontrar com os pacotes de video no FreeBSD incluem:

  1. Um aplicativo não pode reproduzir um arquivo o qual tenha sido produzido por outro aplicativo.

  2. Um aplicativo não pode reproduzir um arquivo o qual foi produzido pelo próprio aplicativo.

  3. O mesmo aplicativo em duas máquinas diferentes, reconstruido em cada máquina para aquela máquina específica, reproduz o mesmo arquivo de forma diferente.

  4. O uso de filtro aparentemente trivial tal como reescalar o tamanho de uma imagem, gera um resultado muito ruim devido a um bug na rotina de reescalonamento.

  5. Um aplicativo freqüentemente apresenta um coredump.

  6. A documentação não é instalada com o port e pode ser encontrada tanto na web quanto sob o diretório work dentro do diretorio do port.

Muitas destas aplicações também pode exibir ``Linux-isms''. Isto é, podem existir algumas edições resultantes da forma como algumas das bibliotecas padrões estão implementadas nas distribuições Linux, ou em algumas caracteristicas do kernel do Linux a qual tenha sido assumida pelos autores da aplicação. Estas edições nem sempre são reparadas ou trabalhadas pelo mantedor do port, o que pode conduzir a problemas tais como pode:

  1. O uso do /proc/cpuinfo para detectar as caracteristicas do processador.

  2. O uso inapropriado de threads o que causa a suspensão do programa ao invés de verdadeiramente encerra-lo.

  3. O software não esta ainda na coleção de ports do FreeBSD o qual é utilizado geralmente em conjunto com a aplicação.

Até agora, estes desenvolvedores de aplicativos tem sido cooperativos com os mantedores de ports para minimizar as necessidades de work-arounds no port da aplicação.

16.4.2.1. MPlayer

O MPlayer é um reprodutor de video desenvolvido recentemente, o qual vem sendo desenvolvido rapidamente. Os objetivos do time de desenvolvedores do MPlayer são a velocidade e a flexibilidade no linux e em outros sabores do unix. O projeto foi iniciado quando o fundador do projeto se encheu da má performance de reprodução de video dos reprodutores que estavam disponíveis. Alguns diriam que a interface gráfica foi sacrificada em favor de um design simplificado. Entretanto, uma vez que você tenha começa a utilizar as opções de linha de comando e os controles de teclado, ele funciona muito bem.

16.4.2.1.1. Compilando o MPlayer

O MPlayer se localiza no multimedia/mplayer. O MPlayer realiza diversas verificações de hardware durante o processo de compilação, resultando em um binário o qual não é portável de um sistema para outro. Por este motivo é importante compilá-lo a partir do ports e evitando utilizar um pacote binário. Adicionalmente, um grande número de poções podem ser especificadas na linha de comando do make, como descrito no início do processo de compilação.

# cd /usr/ports/multimedia/mplayer
# make
You can enable additional compilation optimizations
by defining WITH_OPTIMIZED_CFLAGS
You can enable GTK GUI by defining WITH_GUI.
You can enable DVD support by defining WITH_DVD.
You can enable SVGALIB support by defining WITH_SVGALIB.
You can enable VORBIS sound support by defining WITH_VORBIS.
You can enable XAnim DLL support by defining WITH_XANIM.

Se você possui o x11-toolkits/gtk12 instalado, então você também poderá habilitar a interface gráfica. Se não, não vale o esforço. Se você planeja reproduzir (possivelmente encodados com CSS) DVD´s com o MPlayer você precisa habilitar a opção de suporte a DVD [2]. Algumas opções razoáveis são:

# make WITH_DVD=yes WITH_SVGALIB=yes

Neste momento em que este capítulo está sendo escrito, o port do MPlayer irá construir a documentação HTML dele e um executável, mplayer. Ele também pode ser compilado de forma a gerar um encoder, mencoder, o qual é uma ferramenta para re-encodar video. Uma modificação no Makefile pode habilitar a sua geração. Ele pode ser habilitado por padrão nas versões futuras do port.

A documentação HTML do MPlayer é muito informativa. Se o leitor sentir falta de alguma informação sobre hardware e interface de video, a documentação do MPlayer é um suplemento perfeito. Você definitivamente deveria dedicar um tempo a leitura da documentação do MPlayer se você esta procurando por informações sobre o suporte a video no ambiente UNIX.

16.4.2.1.2. Utilizando o MPlayer

Qualquer usuário do MPlayer deve estabelecer um subdiretório .mplayer no seu diretório home. Para criar este subdiretório necessário ao funcionamento do aplicativo, você pode executar o seguinte:

% cd /usr/ports/multimedia/mplayer
% make install-user

As opções de comando para o mplayer estão listadas na sua página de manual. Para maiores detalhes consulte a documentação HTML. Nesta sessão, nós descreveremos apenas alguns usos comuns.

Para reproduzir um arquivo, como por exemplo testfile.avi, através de uma das várias interfaces de video, especifique a opção -vo:

% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo 'sdl:dga' testfile.avi

Vale a pena tentar todas estas opções, porque seu desempenho relativo depende de muitos fatores e variará significativamente com o hardware.

Para reproduzir um DVD, substitua o testfile.avi com -dvd <N> DEVICE onde <N> é o número do título a ser reproduzido e DEVICE é o nó de dispositivo para o DVD-ROM. Por exemplo, para reproduzir o título 3 a partir do /dev/dvd:

# mplayer -vo dga -dvd 2 /dev/dvd

Para parar, pausar, avançar e assim por diante, consulte o mapeamento de teclas, o qual é exibido pela execução do comando mplayer -h ou então leia a página de manual.

Uma importante opção de reprodução é: -fs -zoom a qual emprega o modo de tela cheia e -framedrop a qual ajuda na performance.

Para que a linha de comando do mplayer não se torne demasiadamente grande, o usuário pode criar um arquivo .mplayer/config e especificar ali as opções padrões:

vo=xv
fs=yes
zoom=yes

E por último, o mplayer pode ser utilizado para ripar um título DVD para um arquivo .vob. Para ripar o segundo título de um DVD, execute isto:

# mplayer -dumpstream -dumpfile out.vob -dvd 2 /dev/dvd

O arquivo de saída, out.vob, será um arquivo mpeg e pode ser manipulado pelos outros pacotes descritos nesta sessão.

16.4.2.1.3. mencoder

Se você optou por instalar o mencoder quando compilou o MPlayer, fique avisado de antemão que ele ainda é um componente experimental. Antes de utilizar o mencoder é uma boa idéia se familizarizar primeiro com as suas opções a partir da leitura da documentação HTML. Existe uma página de manual, mas ela não é muito util sem a documentação HTML. Existem inumeras maneiras de melhorar a qualidade, diminuir a taxa de dados (bitrate), e alterar os formatos, e algums destes truques podem fazer a diferença entre um desempenho bom e um mediocre. Aqui está um par de exemplos para iniciarmos. Primeiro uma cópia simples:

% mencoder input.avi -oac copy -ovc copy -o output.avi

Combinações inapropriadas de opções da linha de comando podem render arquivos de saída que não podem ser reproduzidos com o mplayer. Desta forma, se você deseja apenas ripar para um arquivo, utilize a opção -dumpfile no mplayer.

Para converter o arquivo input.avi para o codec de video MPEG4 e com codificação de audio no formato MPEG3 (é necessário ter o audio/lame):

% mencoder input.avi -oac mp3lame -lameopts br=192 \
     -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

Isso produz um arquivo de saída que pode ser reproduzido pelo mplayer e pelo xine.

O input.avi pode ser subistituido por -dvd 1 /dev/dvd e execute como root para re-encodar idiretamente um título DVD. Uma vez que é provável que você não fique satisfeito com o resultado na sua primeira tentativa, é recomendado que você ripe o título para um arquivo e trabalhe no mesmo.

16.4.2.2. Reprodutor de video xine

O reprodutor de video xine é um projeto com objetivos amplos, tentando produzir não apenas uma solução de video tudo em uma, mas também uma biblioteca de apoio reutilizável, e um executável modular cuja funcionalidade possa ser extendido com o uso de plugins. Ele pode ser instalado tanto por um pacote quanto pelo ports multimedia/xine.

O xine está ainda em uma fase rudimentar e avança lentamente, mais ele é claramente um bom começo. Na prática, o xine necessita de uma CPU rápida com uma placa de video rápida, ou então de uma placa com suporte para a extensão XVideo. A interface gráfica é utilizável, mas um pouco desajeitada.

No momento em que esta sessão está sendo escrita, não existe nenhum módulo sendo distribuido com o xine o qual seja capaz de reproduzir DVD´s codificados com CSS. Existem configurações de terceiros as quais implementam módulos para isto, mas nenhum deles está presente na coleção de ports do FreeBSD.

Comparado com o MPlayer, o xine faz mais pelo usuário, mas ao mesmo tempo, priva o usuário do controle de ajuste fino. O xine apresenta a melhor performance quando sob interface XVideo.

Por padrão, ao ser executado o xine irá carregar a sua interface gráfica. Os menus podem ser utilizados para abrir um arquivo especifico:

% xine

Alternativamente, ele pode ser executado de forma a reproduzir imediatamente um arquivo, sem exibir a interface gráfica ao usuário, com o comando:

% xine -g -p mymovie.avi

16.4.2.3. Utilitário transcode

O software transcode não é um reprodutor, mas um conjunto de ferramentas para re-encodar arquivos .avi e .mpg. Com o transcode, tem-se a habilidade de juntar arquivos de video, consertar arquivos quebrados, utilizando ferramentas de linha de comando com interface de fluxo de dados para stdin/stdout.

Assim como o MPlayer, o transcode é um software muito experimental, o qual deve ser compilado a partir do multimedia/transcode. Existe uma grande variedade de opções que podem ser utilizadas com o comando make. As recomendadas são:

# make WITH_LIBMPEG2=yes

Se você planeja instalar o multimedia/avifile, então adicione a opção WITH_AVIFILE a sua linha de comando make, como mostrado aqui:

# make WITH_AVIFILE=yes WITH_LIBMPEG2=yes

Aqui estão 2 exemplos de uso do transcode para para converter um video alterando o tamanho do mesmo na saída. O primeiro encoda a saída para um arquivo AVI openDIVX, enquanto o segundo encoda para o formato MPEGi, o qual é muito mais portável.

% transcode -i input.vob -x vob -V -Z 320x240 \
-y opendivx -N 0x55 -o output.avi
% transcode -i input.vob -x vob -V -Z 320x240 \
-y mpeg -N 0x55 -o output.tmp
% tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1

Existe uma página de manual para o transcode, mas existe muito pouca documentação para os vários utilitários tc* (como por exemplo o tcmplex) os quais também estão instalados. Entretando, a opção de linha de comando -h sempre pode ser utilizada para obter uma curta instrução de uso para um comando.

Em comparação, o transcode roda significativamente mais devagar do que o mencoder, mas ele possui uma chance melhor de produzir um arquivo mais amplamente reprodutível. MPEGs criados pelo transcode sabidamente podem ser reproduzidos nas versões antigas do Windows Media® Player e do Quicktime® da Apple, por exemplo.

16.4.3. Referências para leitura adicional

Os vários pacotes de software de video para FreeBSD são desenvolvidos rapidamente. E é bem provável que em um futuro próximo muitos dos problemas discutidos aqui terão sido resolvidos. Neste meio tempo, aqueles que desejarem tirar o máximo das funcionalidades de A/V do FreeBSD terão que complementar seu conhecimento apartir de diversos FAQs e tutoriais e utilizar alguns aplicativos diferentes. Esta sessão existe para dar ao leitor indicações de onde obter estas informações adicionais.

A documentação do MPlayer é muito informativa tecnicamente. Esta documentação deveria ser consultada por qualquer pessoa que deseja obter um alto nível de especialização em video no ambiente UNIX. A lista de discussão do MPlayer é hostil para qualquer pessoa que não tenha lido a documentação, assim se você planeja enviar relatórios de problemas para ela, leia o manual (RTFM).

O tutorial sobre xine contém um capítulo sobre melhoria de performance a qual se aplica a todos os reprodutores.

Finalmente, existem algumas outras aplicações promissoras as quais o leitor pode testar:

Notas

[1]

Uma placa gráfica popular e com uma performance no XFree86 geralmente muito boa, as placas nVidia, ainda não liberaram as especificações do seu suporte a XVideo para o grupo de desenvolvimento do XFree86. De forma que ainda pode levar algum tempo até que o XFree86 suporte completamente o XVideo nestas placas.

[2]

Reprodução não autorizada de DVD´s é um serio ato criminal em alguns paises. Verifique as leis locais antes de habilitar esta opção.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.