Como gravar TV com mencoder em Linux Ubuntu

Captura sem perdas HUFFYUV

Captura sem perdas HUFFYUV. Pode-se notar a baixa qualidade do sinal SD da OiTV HD.

O mencoder é o melhor programa para gravar TV, pelas minhas experiências. Seu melhor desempenho é pelo Linux, embora possa ser usada a versão Windows (não testei).

Aqui estão os parâmetros com os quais obtive melhor resultado gravando em diversos formatos (DV, Mjpeg, DVD, Mpeg4 Visual, Mpeg4 H264). Nestes testes, gravei pela saída Video Composite de um decodificador da OiTV de alta resolução. Como é composite, a saída é resolução standard NTSC (720×480 pixels). Gravar HDTV exigiria placas de captura especiais que custam de 500 a mil reais, muito espaço em um disco muito rápido  e processador de vários núcleos. Ainda não é coisa para amadores como eu. Para gravar em resolução standard, uma placa de captura de vídeo de menos de 100 reais serve perfeitamente. Usei uma PixelView PlayTV Pro. Mas vale ressaltar que a imagem standard definition deste decodificador OiTV é muito ruim, assim como as imagens de canais SD transmitidas pela OiTV. Pelo que dizem na internet, todas as operadores de TV paga são assim.

No meu PC com Ubuntu 13.10, a placa de vídeo está em /dev/video1 (/dev/video0 é a webcam) e a entrada de áudio está no dispositivo ALSA hw:0,0. Usei 2 threads onde os codecs permitiam, para melhorar o desempenho.

Capturei na resolução máxima de minha placa PixelView PlayTV Pro, 768 x 480 pixels, fazendo pequenos ajustes no brilho (20) e contraste (-25). Como o decodificador HDTV da OiTV tem um bug que coloca uns riscos numa linha da parte superior dos vídeos, na saída Composite, tive que usar o filtro “delogo” (eliminador de logotipos) do mencoder para borrar os riscos e deixar o defeito menos evidente. Cortei barras pretas nas laterias e algumas linhas acima e abaixo da imagem. Com alguns codecs, que exigem dimensões padrão de 720 x 480 pixels, corto para múltiplos de 8 resultando numa imagem de 744 x 472 e depois reescalo para 720 x 480. Em outros, que não exigem o padrão 720 x 480, corto em múltiplos de 16, porque os macroblocos usados pelo algoritmo de compressão são quadrados de 16 pixels. Isto  resulta em imagens de 736 x 464 pixels. Para simplificar, defino sempre a proporção de HDTV, 16/9. Uso o filtro “kerndeint” para desentrelaçar a imagem entrelaçada do padrão de TV. Todos os exemplos abaixo gravam 2h10min de vídeo (-endpos), o suficiente para a maioria dos filmes. A variável “now” é usada para dar um nome único aos arquivos, com a data, hora-minutos-segundos.

Gravar TV em formato HUFFYUV sem perdas

Este formato é o que permite melhor qualidade de gravação, pois grava sem perdas, cores no espaço “planar 4:2:2 YUV”. No entanto, é o que gera os maiores arquivos digitais: banda de ~70-90 Mbps, arquivo de 675 megabytes por minuto, 40 gigabytes por hora. Usando a compressão de áudio FLAC, economiza-se um pouco no tamanho do arquivo — banda de 740 kbps em vez de 1400 kbps do PCM –, mas é mais difícil achar um programa para editar o arquivo que tenha o codec FLAC. O melhor é usar PCM, que é um formato de áudio não comprimido. A opção “-oac copy” copia o input de áudio sem nenhuma conversão, no formato PCM, taxa de 44.100 MHz, 16 bits com sinal, ordem de bytes little endian (codec pcm_s16le). A opção “-of lavc” grava com o container especificado na extensão do arquivo, no caso, container Matroska, o melhor que existe. Mas é uma opção em beta teste. Não é garantido. Normalmente, o mencoder grava em container AVI.

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "COMEÇOU GRAVAÇÃO" "Para encerrar, abra o gerenciador de  processos."
mencoder \
tv:///1 \
 -tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=BGR24\
:width=768:height=480\
:fps=29.97\
:brightness=25:contrast=-25\
:buffersize=300 \
 -ffourcc HFYU \
 -oac copy \
 -fafmttag 0x01 \
 -ovc lavc \
 -lavcopts vcodec=huffyuv:format=422p:aspect=16/9\
:threads=2 \
 -ofps 30000/1001 \
 -noskip \
 -vf-add kerndeint=10:0:0:0:0 \
 -vf-add crop=736:464:10:2 \
 -vf-add delogo=0:4:480:1:2 \
 -vf-add dsize=16/9 \
 -vf-add harddup \
 -endpos 02:10:00 \
 -o ~/videos/tv-composite-huff-pcm-$now.mkv
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite."

Para gravar o áudio como FLAC, sem perdas, coloquei “-oac lavc” e “-lavcopts acodec=flac”. Mas desaconselho pois editores de vídeo não compreendem.

A utilização de CPU pelo mencoder foi baixa, 35%.

Gravar TV em formato DV (digital video)

Para um bom balanço entre qualidade, tamanho de arquivo e possibilidade de edição, uma boa opção é o DV, formato de filmadoras semi-profissionais com fita magnética. DV é bom para edição posterior do material. Gera imagens de muito boa qualidade, pois comprime cada quadro separadamente — não tem compressão intra-frames, como MPEG4 Visual e H264 — e permite o corte quadro-a-quadro. A contrapartida é que gera vídeos com 225 MB por minuto. Ou seja, uma fita DV de uma hora gera arquivo de 14 gigabytes.

Capturei pelo espaço de cor BGR24 para pegar o máximo de cores. Depois, para gravar em DV, o mencoder exige conversão para o espaço 4:1:1 (este espaço de cor não tem nome no padrão DV). O áudio DV é PCM — sem compressão — 48MHz, dois canais, 1,5 Mbps. Especifiquei a taxa de bits padrão do DV de 25 Mbps, embora na captura sempre indique 28,771 Mbps. A opção “-lavcopts vcodec=dvvideo” exige junto o parâmetro “format=411p”, senão dá erro. A opção “–noskip” força o codec a não descartar frames e é necessária a partir do Ubuntu 13.10.

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "COMEÇOU GRAVAÇÃO" "Para encerrar, abra o gerenciador de  processos."
mencoder \
tv:///1 \
 -tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=BGR24\
:width=768:height=480\
:fps=29.97\
:brightness=20:contrast=-25\
:buffersize=300 \
 -oac pcm \
 -af channels=2 \
 -srate 48000 \
 -ovc lavc \
 -noskip \
 -lavcopts vcodec=dvvideo:format=411P:vbitrate=25000 \
 -vf kerndeint=10:0:0:0:0 \
 -vf-add crop=746:476:10:2 \
 -vf-add delogo=0:4:480:1:2 \
 -vf-add scale=720:480 \
 -vf-add dsize=16/9 \
 -vf-add harddup \
 -endpos 02:10:00 \
 -o ~/videos/tv-composite-dv-$now.dv
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite."

Gravar TV em Formato MJPEG

Para boa qualidade de vídeo, muita compressão e facilidade de edição, outro formato indicado é o Movie JPEG (mjpeg), que tem a vantagem de poder comprimir bem mais que o DV. Ele também permite o corte quadro-a-quadro. Maior qualidade é obtida aumentando-se o valor de “vbitrate”. O valor de 3000 resultou em taxa de bits é de ~6700 kbps para vídeo e 1411 kbps para áudio sem compressão, gerando um arquivo de 80 megabytes por minuto.

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "COMEÇOU GRAVAÇÃO" "Para encerrar, abra o gerenciador de  processos."
mencoder \
tv:///1 \
 -tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=i420\
:width=768:height=480\
:fps=29.97\
:brightness=10:contrast=-25\
:buffersize=300 \
 -ffourcc MJPG \
 -oac copy \
 -ovc lavc \
 -lavcopts vcodec=mjpeg:threads=2\
:vbitrate=3000\
:aspect=16/9 \
 -noskip \
 -vf kerndeint=10:0:0:0:0 \
 -vf-add crop=744:472:10:2 \
 -vf-add delogo=0:4:480:1:2 \
 -vf-add dsize=16/9 \
 -vf-add harddup \
 -endpos 02:10:00 \
 -o ~/videos/tv-composite-mjpeg-pcm-$now.avi
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite."

A taxa de ocupação da CPU pelo mencoder é de 30%.

Gravar TV em formato DVD (MPEG2)

Este padrão usa MPEG2, com compressão intra-frames. Ele grava um frame inteiro e, depois, só as partes que mudaram de um frame para outro, até gravar novamente um frame inteiro. Por isso, não se presta para matrizes de edição, pois os cortes não podem ser feitos frame-a-frame. Mas pode-se conseguir compressão muito grande com boa qualidade. A compressão pode ser maior ou menor, dependendo do valor que se coloca no parâmetro “vbitrate”. Para gerar arquivo pequenos, pode-se usar o valor de 1400. Para mais qualidade, pode-se usar 6000. A taxa de ocupação de minha CPU pelo mencoder foi de 30%.

now=$(date +"%Y-%m-%d_%H-%M-%S")
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "INÍCIO DE GRAVAÇÃO" "Começou a gravação composite"
mencoder \
tv:///1 \
 -tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=i420\
:width=768:height=480\
:fps=29.97\
:brightness=20:contrast=-25\
:buffersize=300 \
 -ffourcc MPEG \
 -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd:tsaf \
 -srate 48000 \
 -af lavcresample=48000 \
 -lavcopts vcodec=mpeg2video:acodec=ac3\
:vrc_buf_size=1835:vrc_maxrate=9800\
:vbitrate=3000:abitrate=192\
:keyint=18:vstrict=0\
:aspect=16/9 \
 -ofps 30000/1001 \
 -noskip \
 -vf-add kerndeint=10:0:0:0:0 \
 -vf-add crop=744:472:10:2\
 -vf-add scale=720:480 \
 -vf-add delogo=0:4:480:1:2 \
 -vf-add harddup \
 -endpos 02:10:00 \
 -o ~/videos/tv-composite-dvd-$now.mpg 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite"

 Gravar TV em formato MPEG4 part 10 (H.264)

Este é o padrão do Blue Ray. É o que obtém a melhor qualidade em relação à compressão, mas também é desaconselhado para futuras edições. O áudio é AC3 (Dolby). O uso da CPU pelo mencoder ficou em 75%. Maior qualidade pode ser conseguida aumentando-se o valor de “bitrate”, resultando um arquivo maior. “nr” é a redução de ruído. noskip serve para evitar que quadros sejam descartados. Estes comandos usam a biblioteca lavc.

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "INÍCIO DE GRAVAÇÃO" "Começou a gravação composite."
mencoder \
tv:///1 \
-tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=uyvy\
:width=768:height=480\
:fps=29.97\
:brightness=10:contrast=-25\
:buffersize=300 \
-ffourcc divx \
-oac mp3lame \
-lameopts cbr:preset=128 \
-ovc lavc \
-lavcopts vcodec=mpeg4\
:threads=2\
:vbitrate=1500\
:autoaspect\
:keyint=30:sc_threshold=-50000:vb_strategy=2 \
 -noskip \
 -vf dsize=16/9,kerndeint=20:0:0:1:1 \
 -vf-add softskip,harddup \
 -vf-add crop=744:472:10:2 \
 -vf-add scale=720:480 \
 -vf-add delogo=0:4:480:1:2 \
 -endpos 02:10:00 \
-o ~/videos/tv-composite-mpeg4-mp3-$now.avi 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação da parabólica"

Para gravar o áudio em MP3, os comando ” -oac mp3lame  -lameopts cbr:preset=196″ são usados no lugar de “-oac lavc -lavcopts acodec=ac3”.

Aqui está outra opção de comando que usa a biblioteca x264 para codificar o vídeo em H.264:

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "COMEÇOU GRAVAÇÃO" "Para encerrar, abra o gerenciador de  processos."
mencoder \
tv:///1 \
 -tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=i420\
:width=768:height=480\
:fps=29.97\
:brightness=20:contrast=-25\
:buffersize=300 \
 -ffourcc X264 \
 -oac lavc \
 -lavcopts acodec=ac3 \
 -ovc x264 \
 -x264encopts bitrate=6000:pass=1:turbo=2:nr=1000\
:threads=auto:global_header:nr=1000 \
 -noskip \
 -vf kerndeint=10:0:0:0:0 \
 -vf-add crop=744:472:10:2 \
 -vf-add delogo=0:4:480:1:2 \
 -vf-add dsize=16/9 \
 -vf-add harddup \
 -endpos 02:10:00 \
 -of lavf \
 -o ~/videos/tv-composite-x264-ac3-$now.mkv
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite"

Gravar TV em formato MPEG4 Visual (DivX)

Outra boa opção para boa compressão e boa qualidade. O uso da CPU pelo mencoder foi de 50%. Abaixo, os comandos com avisos de início e fim de gravação, para o caso de se usar pelo cron.

now=$(date +"%Y-%m-%d_%H-%M-%S") 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "INÍCIO DE GRAVAÇÃO" "Começou a gravação composite."
mencoder \
tv:///1 \
-tv norm=NTSC-M\
:device=/dev/video1\
:alsa:adevice=hw.0,0\
:audioid=0\
:amode=1\
:driver=v4l2\
:outfmt=i420\
:width=768:height=480\
:fps=29.97\
:brightness=10:contrast=-25\
:buffersize=300 \
-ffourcc DX50 \
-oac mp3lame \
-lameopts cbr:preset=128 \
-ovc xvid \
-xvidencopts bitrate=3000:threads=2:aspect=16/9:me_quality=3:max_bframes=1 \
-noskip \
 -vf-add dsize=16/9,kerndeint=10:0:0:0:0 \
 -vf-add softskip,harddup \
 -vf-add crop=744:472:10:2 \
 -vf-add scale=720:480 \
 -vf-add delogo=0:4:480:1:2 \
-endpos 02:10:00 \
-o ~/videos/tv-composite-xvid-mp3-divx-$now.avi 
notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite."

Quando uso estes comandos no agendador de tarefas, coloco a seguinte linha para avisar o fim da gravação com o programa notify-send:

notify-send -i /usr/share/icons/hicolor/64x64/apps/smplayer.png "FIM DE GRAVAÇÃO" "Terminou a gravação composite"

 

Os detalhes dos arquivos de mídia podem ser analisados com o programa mediainfo. Instale com a linha de comando:

sudo apt-get install mediainfo

Referências

Sobre José Antonio Meira da Rocha

Jornalista, professor de Planejamento Gráfico e Mídias Digitais da Universidade Federal de Santa Maria, campus da cidade de Frederico Westphalen, Rio Grande do Sul, Brasil. Doutorando em Design na UFRGS, Porto Alegre, Brasil, 2014.