Gravando TV com Linux Ubuntu

O sistema operacional Linux oferece melhor qualidade na gravação de TV que o Windows. Basta se estudar um pouco para dominar os segredos de ajustes por linha de comando dos programas de gravação.

No ambiente Windows, os melhores programas para se gravar TV são o VirtualDub e o VirtualVCR com os codecs FFdshow. Para se conseguir boa qualidade no vídeo gravado da TV é necessário se fazer o desentrelaçamento dos dois campos que formam a imagem de TV. São poucos os codecs que oferecem este recurso com boa qualidade. Nos programas baratos que acompanham as placas de TV, o desentrelaçamento é feito por interpolação das linhas dos dois campos. Isto provoca o “borramento” vertical das imagens, como se a câmera estivesse míope, fora de foco.

Os melhores filtros para desentrelaçamento corrigem as diferenças de campos de imagem apenas quando isto é necessário, em áreas que estão em movimento, como olhos e bocas das pessoas, ou objetos em movimentos horizontais. No FFdshow, uso o filtro Yet Another Deinterlacer ou ToMosComp, que me deram melhores resultados.

Quanto à compressão, uso mpeg4 com qualidade 90 no FFdshow, que grava com Variable Bit Rate (VBR). Isso gera imagens com média de 2200 kbps. No entanto, o VirtualDub provoca dessincronia entre vídeo e áudio, quando usa VBR. Para sincronia entre som e imagem, preciso usar Constant Bit Rate (CBR), o que gera imagens de pior qualidade e arquivos grandes. Já o VirtualVCR gera alguma dessincronia em VBR, mas não muito.

Em Linux, pesquisei bastante e fiz testes de gravação que resultaram em vídeos com qualidade e compressão bem melhores que em Windows.

Primeiro tentei o streamer, com uma linha de comandos bem simples:

streamer -t 2:00:00 -s 720x480 -r 29.97 -o tv.avi -f mjpeg -j 70 -F stereo

Este comando grava vídeo em formato mjpeg, que é bom para edição, pois grava sempre quadros inteiros e facilita a edição em qualquer ponto. No entanto, não desentrelaça e a compressão não é boa: o arquivo resultante fica em torno de 60 MB por minuto. Teria de ser pós-processado mais tarde.

Além disso, o streamer usa a arquitetura de som OSS, que está sendo abandonada no Linux em favor da arquitetura ALSA.

Depois, pesquisei o mencoder. Para facilitar o estudo do enorme manual do mencoder em formato “man page”, usei um comando para gerar PDF:

man -t `man -w mencoder` | ps2pdf - mencoder.pdf

A grande vantagem do mencoder é a enorme quantidade de filtros e codecs disponíveis. Através de testes, descobri que a seguinte linha de comandos gera os melhores resultados de vídeo gravado pela placa de TV. O arquivo resultante fica com boa qualidade visual, com sincronia entre áudio e vídeo e com 10 MB por minuto, em média.

mencoder \
tv:///2 \
-o ~/tv-$$.avi \
-oac mp3lame \
-lameopts cbr:preset=192 \
-ovc lavc \
-lavcopts vcodec=mpeg4\
:vbitrate=1500\
:autoaspect\
:keyint=120:sc_threshold=-50000:vb_strategy=2 \
−ffourcc divx \
-vf dsize=4/3 \
-vf-add kerndeint=10:0:0:1:1 \
-tv norm=PAL-M\
:driver=v4l2\
:alsa\
:adevice=hw.0,0\
:width=744\
:height=480\
:fps=29.97\
:outfmt=i420\
:brightness=10\
:contrast=-20\
:amode=1\
:buffersize=300

A explicação de cada parâmetro é a seguinte:

tv:///2
Escolhe a entrada S-Video (ID 2 no Video for Linux – v4l2).
-o
Arquivos de saída. Os dois $$ juntam o número do processo ao nome do arquivo, para gerar arquivos de nomes diferentes cada vez que o script roda.
−ffourcc divx
Força as quatro letras identificadoras do tipo de codec. Uso divx para compatibilidade com DVDs players que tocam AVI DivX.
-oac
Output audio codec mp3lame.
-lameopt
Opções do codec de áudio mp3 Lame: modo constant bit rate (para facilitar a edição, mais tarde), pré-configuração de qualidade de áudio a 192 kbps.
-ovc
Outuput video codec: biblioteca lavc.
-lavcopts
Opções lavc: codec mpeg4, variable bit rate de 1200 kbps, proporção automaticamente detectada. keyint=120 insere quadros inteiros (I-frames) a cada 120 quadros. sc_threshold=-50000 ajusta o sensor de mudança de cena para inserir quadros inteiros, o que facilita a edição futura na mudança de cena. vb_strategy=2 otimiza a colocação de B-frames.
-vf dsize=4/3
Video filter para proporção de TV normal ( 4:3). Repare que mais adiante eu seto a largura de captura para o máximo que o v4l2 permite para esta placa de captura, que é 744×480 (descobri com o programa v4l-info). Esta opção dsize não causa demora no processamento e permite que o vídeo seja apresentado em 640×480 em vez de 744×480. Ou seja: não é um vídeo “square pixel”. Faço isto para capturar na melhor resolução possível e apresentar na proporção correta de TV. Mas o padrão mpeg4 é a largura de 720 pixels.
-vf-add
Adiciona mais um filtro, no caso, desentrelaçamento kerneldeint com “afiamento” da imagem. Isto é importante para manter a qualidade do vídeo sem o “efeito pente” típico da tecnologia de entrelaçamento de campos do quadro de TV. Este filtro só corrige as linhas onde há efeito pente, deixando as outras linhas intactas e preservando a resolução vertical original da imagem.
-tv
Opções de captura. Norma PAL-M, driver v4l2 (Vídeo for Linux 2), som pela arquitetura ALSA, canal line in (hw:0,0), largura de 744 pixels (embora seja apresentado na proporção 4:3 ou 640×480), altura de 480 pixels, 29,97 quadros por segundo, formato de cor i420, ajustes de brilho e contraste adequados à minha placa de captura PixelView PlayTV Pro. Finalmente, 200 MB de buffer de vídeo, para a captura não perder frames.

Juntei estes comandos num arquivo shell e coloquei na barra do Gnome. Para iniciar a gravação, basta um clic no ícone do programa.

Estes comandos podem ser colocados no cron (agendador de tarefas do Linux) para programar gravações. O programa gnome-scheduler ajuda bastante a programar o cron. Neste caso, é bom colocar mais alguns  parâmetros para limitar o tempo de gravação:

-endpos 02:10:00 \

E mais uma linha, depois desta enorme linha de comandos, para avisar sobre fim da gravação (Ubuntu), já que, como cron job, a gravação roda invisível:

notify-send -i /usr/share/icons/gnome-colors-common/scalable/apps/smplayer.svg "FIM DE GRAVAÇÃO" "Terminou a gravação do satélite"

Windows

Com o mencoder para Windows, depois de muitas tentativas, consegui fazer funcionar com a seguinte linha de comando:

mencoder tv:///1 ^
 -tv driver=dshow^
:device=0:input=5^
:adevice=4:audioid=1^
:norm=PAL-M^
:fps=29.97^
:outfmt=rgb24^
:width=744:height=480^
:brightness=10:contrast=-20^
:buffersize=200 ^
 -vf dsize=4/3 ^
 -vf-add flip ^
 -vf-add kerndeint=10:0:0:1:1 ^
 -ovc lavc ^
 -lavcopts vcodec=mpeg4:vbitrate=3000:autoaspect ^
 -ffourcc XVID ^
 -oac mp3lame ^
 -lameopts fast:preset=medium ^
 -o .\tv-svideo-record (%DATE%-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%).avi

Ao copiar os parâmetros acima, cuidado com os espaços. Eu adicionei “^” para poder quebrar as linhas.

Bonus track: o arquivo de vídeo é gravado com a data e hora adicionadas ao nome graças a truques do DOS.

O mencoder só gravou bem da placa de TV com codec lavc, sem dúvida uma biblioteca de excelente qualidade. O driver deve ser dshow, um driver experimental, e o espaço de cor, rgb24. A maior dificuldade, que resolvi por tentativa e erro, foi configurar os números dos dispositivos de áudio e vídeo. Os números variam de acordo com os dispositivos em cada PC e também num mesmo PC, quando se conecta e desconecta uma webcamera.

O vbitrate de 3000 dá uma ótima qualidade gerando 20MB de arquivo por minuto. Para 11MB por minuto, eu uso vbitrate=1400, resultando em qualidade razoável.

No entanto, o mencoder para Windows não sincroniza o som com o vídeo e é instável. Embora só ocupe 20% do processamento de um Intel Dual-Core de 2,5GHz, qualquer processo que interrompa a gravação provoca a perda sequencial de frames, arruinando a gravação dali por diante.

Conclusão

Depois de se aprender os ajustes necessários na captura de vídeo, fazer estas tarefas por linha de comando é bem mais fácil do que se usar programas proprietários com interface gráfica.

About José Antonio Meira da Rocha

Jornalista, professor das áreas de Editoração e de Mídias Digitais na Universidade Federal de Santa Maria, campus cidade de Frederico Westphalen, Rio Grande do Sul, Brasil. Doutor em Design pelo Programa de Pós-Graduação em Design (PGDesign)/Universidade Federal do Rio Grande do Sul (UFRGS), Porto Alegre, Brasil, 2023. Mestre em Mídias pela UNISINOS, São Leopoldo, RS, Brasil, 2003. Especialista em Informática na Educação, Unisinos, 1976.