{"id":1057,"date":"2010-03-30T15:38:22","date_gmt":"2010-03-30T18:38:22","guid":{"rendered":"http:\/\/meiradarocha.jor.br\/news\/?p=1057"},"modified":"2011-11-19T01:38:02","modified_gmt":"2011-11-19T04:38:02","slug":"gravando-tv-com-linux-ubuntu","status":"publish","type":"post","link":"https:\/\/meiradarocha.jor.br\/news\/2010\/03\/30\/gravando-tv-com-linux-ubuntu\/","title":{"rendered":"Gravando TV com Linux Ubuntu"},"content":{"rendered":"<p><a href=\"http:\/\/meiradarocha.jor.br\/news\/wp-content\/uploads\/2010\/03\/tv-no-linux.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1479\" title=\"tv-no-linux\" src=\"http:\/\/meiradarocha.jor.br\/news\/wp-content\/uploads\/2010\/03\/tv-no-linux-300x289.jpg\" alt=\"\" width=\"300\" height=\"289\" \/><\/a>O sistema operacional Linux oferece melhor qualidade na grava\u00e7\u00e3o de TV que o Windows. Basta se estudar um pouco para dominar os segredos de ajustes por linha de comando dos programas de grava\u00e7\u00e3o.<\/p>\n<p>No ambiente Windows, os melhores programas para se gravar TV s\u00e3o o <strong>VirtualDub<\/strong> e o <strong>VirtualVCR<\/strong> com os codecs <strong>FFdshow<\/strong>. Para se conseguir boa qualidade no v\u00eddeo gravado da TV \u00e9 necess\u00e1rio se fazer o desentrela\u00e7amento dos dois campos que formam a imagem de TV. S\u00e3o poucos os codecs que oferecem este recurso com boa qualidade. Nos programas baratos que acompanham as placas de TV, o desentrela\u00e7amento \u00e9 feito por interpola\u00e7\u00e3o das linhas dos dois campos. Isto provoca o &#8220;borramento&#8221; vertical das imagens, como se a c\u00e2mera estivesse m\u00edope, fora de foco.<!--more--><\/p>\n<p>Os melhores filtros para desentrela\u00e7amento corrigem as diferen\u00e7as de campos de imagem apenas quando isto \u00e9 necess\u00e1rio, em \u00e1reas que est\u00e3o em movimento, como olhos e bocas das pessoas, ou objetos em movimentos horizontais. No <strong>FFdshow<\/strong>, uso o filtro Yet Another Deinterlacer ou ToMosComp, que me deram melhores resultados.<\/p>\n<p>Quanto \u00e0 compress\u00e3o, uso <strong>mpeg4<\/strong> com qualidade 90 no FFdshow, que grava com <strong>Variable Bit Rate (VBR)<\/strong>. Isso gera imagens com m\u00e9dia de 2200 kbps. No entanto, o VirtualDub provoca dessincronia entre v\u00eddeo e \u00e1udio, quando usa VBR. Para sincronia entre som e imagem, preciso usar <strong>Constant Bit Rate (CBR)<\/strong>, o que gera imagens de pior qualidade e arquivos grandes. J\u00e1 o VirtualVCR gera alguma dessincronia em VBR, mas n\u00e3o muito.<\/p>\n<p>Em Linux, pesquisei bastante e fiz testes de grava\u00e7\u00e3o que resultaram em v\u00eddeos com qualidade e compress\u00e3o bem melhores que em Windows.<\/p>\n<p>Primeiro tentei o <strong>streamer<\/strong>, com uma linha de comandos bem simples:<\/p>\n<pre>streamer -t 2:00:00 -s 720x480 -r 29.97 -o tv.avi -f mjpeg -j 70 -F stereo<\/pre>\n<p>Este comando grava v\u00eddeo em formato <strong>mjpeg<\/strong>, que \u00e9 bom para edi\u00e7\u00e3o, pois grava sempre quadros inteiros e facilita a edi\u00e7\u00e3o em qualquer ponto. No entanto, n\u00e3o desentrela\u00e7a e a compress\u00e3o n\u00e3o \u00e9 boa: o arquivo resultante fica em torno de 60 MB por minuto. Teria de ser p\u00f3s-processado mais tarde.<\/p>\n<p>Al\u00e9m disso, o <strong>streamer<\/strong> usa a arquitetura de som OSS, que est\u00e1 sendo abandonada no Linux em favor da arquitetura ALSA.<\/p>\n<p>Depois, pesquisei o <strong>mencoder<\/strong>. Para facilitar o estudo do enorme manual do <strong>mencoder<\/strong> em formato &#8220;man page&#8221;, usei um comando para gerar PDF:<\/p>\n<pre>man -t `man -w mencoder` | ps2pdf - mencoder.pdf<\/pre>\n<p>A grande vantagem do <strong>mencoder<\/strong> \u00e9 a enorme quantidade de filtros e codecs dispon\u00edveis. Atrav\u00e9s de testes, descobri que a seguinte linha de comandos gera os melhores resultados de v\u00eddeo gravado pela placa de TV. O arquivo resultante fica com boa qualidade visual, com sincronia entre \u00e1udio e v\u00eddeo e com 10 MB por minuto, em m\u00e9dia.<\/p>\n<pre>mencoder \\\r\ntv:\/\/\/2 \\\r\n-o ~\/tv-$$.avi \\\r\n-oac mp3lame \\\r\n-lameopts cbr:preset=192 \\\r\n-ovc lavc \\\r\n-lavcopts vcodec=mpeg4\\\r\n:vbitrate=1500\\\r\n:autoaspect\\\r\n:keyint=120:sc_threshold=-50000:vb_strategy=2 \\\r\n\u2212ffourcc divx \\\r\n-vf dsize=4\/3 \\\r\n-vf-add kerndeint=10:0:0:1:1 \\\r\n-tv norm=PAL-M\\\r\n:driver=v4l2\\\r\n:alsa\\\r\n:adevice=hw.0,0\\\r\n:width=744\\\r\n:height=480\\\r\n:fps=29.97\\\r\n:outfmt=i420\\\r\n:brightness=10\\\r\n:contrast=-20\\\r\n:amode=1\\\r\n:buffersize=300<\/pre>\n<p>A explica\u00e7\u00e3o de cada par\u00e2metro \u00e9 a seguinte:<\/p>\n<dl>\n<dt><strong>tv:\/\/\/2 <\/strong><\/dt>\n<dd>Escolhe a entrada S-Video (ID 2 no Video for Linux &#8211; v4l2).<\/dd>\n<dt><strong>-o<\/strong><\/dt>\n<dd>Arquivos de sa\u00edda. Os dois $$ juntam o n\u00famero do processo ao nome do arquivo, para gerar arquivos de nomes diferentes cada vez que o script roda.<\/dd>\n<dt><strong>\u2212ffourcc divx<\/strong><\/dt>\n<dd>For\u00e7a as quatro letras identificadoras do tipo de codec. Uso <strong>divx<\/strong> para compatibilidade com <em>DVDs players<\/em> que tocam AVI DivX.<\/dd>\n<dt><strong>-oac<\/strong><\/dt>\n<dd>Output audio codec mp3lame.<\/dd>\n<dt><strong>-lameopt<\/strong><\/dt>\n<dd>Op\u00e7\u00f5es do codec de \u00e1udio mp3 Lame: modo constant bit rate (para facilitar a edi\u00e7\u00e3o, mais tarde), pr\u00e9-configura\u00e7\u00e3o de qualidade de \u00e1udio a 192 kbps.<\/dd>\n<dt><strong>-ovc<\/strong><\/dt>\n<dd>Outuput video codec: biblioteca lavc.<\/dd>\n<dt><strong>-lavcopts<\/strong><\/dt>\n<dd>Op\u00e7\u00f5es lavc: codec mpeg4, variable bit rate de 1200 kbps, propor\u00e7\u00e3o automaticamente detectada. keyint=120 insere quadros inteiros (I-frames) a cada 120 quadros. sc_threshold=-50000 ajusta o sensor de mudan\u00e7a de cena para inserir quadros inteiros, o que facilita a edi\u00e7\u00e3o futura na mudan\u00e7a de cena. vb_strategy=2 otimiza a coloca\u00e7\u00e3o de B-frames.<\/dd>\n<dt><strong>-vf dsize=4\/3<\/strong><\/dt>\n<dd>Video filter para propor\u00e7\u00e3o de TV normal ( 4:3). Repare que mais adiante eu seto a largura de captura para o m\u00e1ximo que o v4l2 permite para esta placa de captura, que \u00e9 744&#215;480 (descobri com o programa v4l-info). Esta op\u00e7\u00e3o <strong>dsize<\/strong> n\u00e3o causa demora no processamento e permite que o v\u00eddeo seja apresentado em 640&#215;480 em vez de 744&#215;480. Ou seja: n\u00e3o \u00e9 um v\u00eddeo &#8220;square pixel&#8221;. Fa\u00e7o isto para capturar na melhor resolu\u00e7\u00e3o poss\u00edvel e apresentar na propor\u00e7\u00e3o correta de TV. Mas o padr\u00e3o mpeg4 \u00e9 a largura de 720 pixels.<\/dd>\n<dt><strong>-vf-add<\/strong><\/dt>\n<dd>Adiciona mais um filtro, no caso, desentrela\u00e7amento <strong>kerneldeint<\/strong> com &#8220;afiamento&#8221; da imagem. Isto \u00e9 importante para manter a qualidade do v\u00eddeo sem o &#8220;efeito pente&#8221; t\u00edpico da tecnologia de entrela\u00e7amento de campos do quadro de TV. Este filtro s\u00f3 corrige as linhas onde h\u00e1 efeito pente, deixando as outras linhas intactas e preservando a resolu\u00e7\u00e3o vertical original da imagem.<\/dd>\n<dt><strong>-tv<\/strong><\/dt>\n<dd>Op\u00e7\u00f5es de captura. Norma PAL-M, driver v4l2 (V\u00eddeo for Linux 2), som pela arquitetura ALSA, canal <em>line in<\/em> (hw:0,0), largura de 744 pixels (embora seja apresentado na propor\u00e7\u00e3o 4:3 ou 640&#215;480), altura de 480 pixels, 29,97 quadros por segundo, formato de cor i420, ajustes de brilho e contraste adequados \u00e0 minha placa de captura PixelView PlayTV Pro. Finalmente, 200 MB de buffer de v\u00eddeo, para a captura n\u00e3o perder <em>frames<\/em>.<\/dd>\n<\/dl>\n<p>Juntei estes comandos num arquivo <em>shell<\/em> e coloquei na barra do Gnome. Para iniciar a grava\u00e7\u00e3o, basta um clic no \u00edcone do programa.<\/p>\n<p>Estes comandos podem ser colocados no cron (agendador de tarefas do Linux) para programar grava\u00e7\u00f5es. O programa <strong>gnome-scheduler<\/strong> ajuda bastante a programar o cron. Neste caso, \u00e9 bom colocar mais alguns\u00a0 par\u00e2metros para limitar o tempo de grava\u00e7\u00e3o:<\/p>\n<pre>-endpos 02:10:00 \\<\/pre>\n<p>E mais uma linha, depois desta enorme linha de comandos, para avisar sobre fim da grava\u00e7\u00e3o (Ubuntu), j\u00e1 que, como cron job, a grava\u00e7\u00e3o roda invis\u00edvel:<\/p>\n<pre>notify-send -i \/usr\/share\/icons\/gnome-colors-common\/scalable\/apps\/smplayer.svg \"FIM DE GRAVA\u00c7\u00c3O\" \"Terminou a grava\u00e7\u00e3o do sat\u00e9lite\"<\/pre>\n<h3>Windows<\/h3>\n<p>Com o <strong>mencoder<\/strong> para Windows, depois de muitas tentativas, consegui fazer funcionar com a seguinte linha de comando:<\/p>\n<pre>mencoder tv:\/\/\/1 ^\r\n\u00a0-tv driver=<span style=\"color: #ff9900;\">dshow<\/span>^\r\n<span style=\"color: #ff0000;\">:device=0:input=5<\/span>^\r\n<span style=\"color: #ff0000;\">:adevice=4:audioid=1<\/span>^\r\n:norm=PAL-M^\r\n:fps=29.97^\r\n:outfmt=<span style=\"color: #ff0000;\">rgb24<\/span>^\r\n:width=744:height=480^\r\n:brightness=10:contrast=-20^\r\n:buffersize=200 ^\r\n\u00a0-vf dsize=4\/3 ^\r\n\u00a0-vf-add flip ^\r\n\u00a0-vf-add kerndeint=10:0:0:1:1 ^\r\n\u00a0-ovc lavc ^\r\n\u00a0-lavcopts vcodec=mpeg4:vbitrate=3000:autoaspect ^\r\n\u00a0-ffourcc XVID ^\r\n\u00a0-oac mp3lame ^\r\n\u00a0-lameopts fast:preset=medium ^\r\n\u00a0-o .\\tv-svideo-record (%DATE%-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%).avi<\/pre>\n<p>Ao copiar os par\u00e2metros acima, cuidado com os espa\u00e7os. Eu adicionei &#8220;^&#8221; para poder quebrar as linhas.<\/p>\n<p>Bonus track: o arquivo de v\u00eddeo \u00e9 gravado com a data e hora adicionadas ao nome gra\u00e7as a truques do DOS.<\/p>\n<p>O <strong>mencoder <\/strong>s\u00f3 gravou bem da placa de TV com codec <strong>lavc<\/strong>, sem d\u00favida uma biblioteca de excelente qualidade. O driver deve ser <a href=\"http:\/\/doors.univer.omsk.su\/%7Evoroshil\/\"><strong>dshow<\/strong><\/a>, <a href=\"http:\/\/doors.univer.omsk.su\/%7Evoroshil\/\">um driver experimental<\/a>, e o espa\u00e7o de cor, <strong>rgb24<\/strong>. A maior dificuldade, que resolvi por tentativa e erro, foi configurar os n\u00fameros dos dispositivos de \u00e1udio e v\u00eddeo. Os n\u00fameros variam de acordo com os dispositivos em cada PC e tamb\u00e9m num mesmo PC, quando se conecta e desconecta uma <em>webcamera<\/em>.<\/p>\n<p>O <strong>vbitrate<\/strong> de 3000 d\u00e1 uma \u00f3tima qualidade gerando 20MB de arquivo por minuto. Para 11MB por minuto, eu uso vbitrate=1400, resultando em qualidade razo\u00e1vel.<\/p>\n<p>No entanto, o <strong>mencoder para Windows<\/strong> n\u00e3o sincroniza o som com o v\u00eddeo e \u00e9 inst\u00e1vel. Embora s\u00f3 ocupe 20% do processamento de um Intel Dual-Core de 2,5GHz, qualquer processo que interrompa a grava\u00e7\u00e3o provoca a perda sequencial de <em>frames<\/em>, arruinando a grava\u00e7\u00e3o dali por diante.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Depois de se aprender os ajustes necess\u00e1rios na captura de v\u00eddeo, fazer estas tarefas por linha de comando \u00e9 bem mais f\u00e1cil do que se usar programas propriet\u00e1rios com interface gr\u00e1fica.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Experi\u00eancias com grava\u00e7\u00e3o de TV em ambiente Linux e Windows e software livre.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,17,18,21],"tags":[],"class_list":["post-1057","post","type-post","status-publish","format-standard","hentry","category-linux","category-tv","category-video","category-windows"],"_links":{"self":[{"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/posts\/1057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/comments?post=1057"}],"version-history":[{"count":0,"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/posts\/1057\/revisions"}],"wp:attachment":[{"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/media?parent=1057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/categories?post=1057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/meiradarocha.jor.br\/news\/wp-json\/wp\/v2\/tags?post=1057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}