FFmpeg: screencast do desktop gravando duas fontes de áudio simultaneamente
Papagaios e periquitas do Viva o Linux, aqui começa mais uma Dica do Dino® trazendo para todos vocês um pouco do arcabouço empoeirado e esquisito da minha memória. Hoje, vamos aprender um truque interessante usando o FFmpeg para pessoas que fazem screencasts em geral.
Para quem não sabe, o screencast é um vídeo que você grava do seu Desktop, normalmente usado por pessoas que fazem a demonstração de um jogo ou gravam um let's play da vida. Existe uma série de programas para isso, mas honestamente, quanto mais complexo um programa, mais ele consome recursos da máquina e menos sobra para a gravação em si. Então, vamos aprender a fazer do jeito aprovado e certificado por "Bob" Dobbs e o único que, de acordo com a Igreja dos Subgênios, não condenará sua existência a uma vida entre os pinks: usando o FFmpeg.
O FFmpeg (e não o lixo do libav) é a infraestrutura mais básica de multimídia no mundo GNU/Linux, sendo usado por uma pá de programas. De acordo com a página oficial do projeto, ele é uma solução completa e multiplataforma para gravar, converter e fazer stream de áudio e vídeo - e isso não é um exagero. Você pode usar o ffmpeg para fazer uma série de doideiras no seu computador. A Dica do Dino® de hoje vai trazer a primeira de uma série de dicas sobre essas doideiras: criação de screencast. Para criar um screencast você precisa gravar: seu desktop, o áudio de saída do seu computador, e o áudio captado por seu microfone. Usando o FFmpeg sob o Pulseaudio, o comando fica:
-f x11grab: é o dispositivo interno do ffmpeg para gravar a tela;
-video_size 1366x768: é o tamanho de área da tela que será capturado;
-framerate 60: é a taxa de frames per second que será usada para a captura do desktop. Para ter uma aparência de vídeo, o valor mínimo aqui é 24, mas 30, 60 ou mesmo 120 são os valores ideais para um bom screencast (quanto mais, melhor);
-i :0.0: é o número da tela a ser usada, e deve ser idêntico ao valor da variável de ambiente $DISPLAY;
-f pulse: indica que minha infraestrutura de áudio é fornecida pelo PulseAudio. Use -f alsa para usar o ALSA diretamente;
-ac 1: indica que a entrada de áudio terá apenas um canal, útil para podcasts e o geral. Use -ac 2 se estiver criando um screencast de um jogo.
-i alsa_output.pci-0000_00_14.2.analog-stereo.monitor: essa é a malandragem aqui: eu instruo o FFmpeg a usar como entrada de áudio o canal monitor de minha saída de áudio. O nome da saída varia de acordo com o computador, use $ pactl list sources | grep Nome para obter a lista completa de suas saídas de áudio e a partir disso use um pouco de lógica. Se você especificou -f alsa, use $ aplay -l para listar seus dispositivos de áudio e indique ao FFmpeg qual usar usando o formato hw:X,Y, onde X=card e Y=device;
-f pulse -ac 1 -i alsa_input.pci-0000_00_14.2.analog-stereo.echo-cancel: isso instrui o ffmpeg a usar meu microfone como entrada de áudio. Valem as mesmas observações do ponto anterior;
-filter_complex "[1:a][2:a]amix=inputs=2:duration=shortest[a]": este é o pulo do gato. Por padrão, o FFmpeg só usa um sinal de vídeo e um sinal de áudio por padrão, mas como temos dois sinais de áudio precisamos mixá-los usando o filtro -filter_complex. Alguns detalhes sobre o filtro:
Cada sinal é identificado por [X:a/v], onde X é a ordem em que o sinal aparece no comando do FFmpeg, considerando que o FFmpeg começa a contar a partir do 0. O a/v é para especificar se é pra usar o áudio ou o vídeo do sinal;
amix=inputs=2: instrui o filtro que ele deve mixar dois sinais de áudio;
duration=shortest: diz para o FFmpeg gravar até ser interrompido;
[a] é o nome do sinal mixado
-map 0 -map "[a]": diz com quais sinais o FFmpeg deverá trabalhar, no caso do comando: o sinal 0 (o vídeo capturado da tela) e o sinal [a] (os dois sinais de áudio mixados);
-vcodec libx264 -tune film -acodec aac -strict experimental -b:v 320k -b:a 192k -pix_fmt yuv420p: instrui quais codecs de vídeo e áudio, bem como bitrates e formato de pixel, usar. Como eu pretendo criar um arquivo mp4, eu uso os codecs e formatos apropriados para esse contêiner. Para boa qualidade de vídeo, o bitrate mínimo de vídeo (especificado pelo -b:v) deve ser 320k, e o de áudio (especificado pelo -b:a), 192k;
-shortest: diz para o FFmpeg gravar até ser interrompido;
-vf scale=640:360: determina a resolução do arquivo resultante e arquivo.mp4 determina o nome do arquivo resultante.
Após enfiar essa trosoba de comando no seu terminal, aperte Enter para começar a gravar. Dê Alt+Tab para ir para a janela desejada e então, aproveite a gravação do seu screencast. Quando terminar, volte para a janela do FFmpeg e aperte q para encerrar a gravação.
E com essa, termina mais uma Dica do Dino®, desejando para todos vocês noites e mais noites de compilação longa e próspera!
[1] Comentário enviado por eldermarco em 14/06/2016 - 07:14h
Legal isso! Eu estava usando o GNOME que é bem mais prático, mas não cheguei a configurar ele para gravar corretamente (e o default não é satisfatório). No entanto, com o FFMPEG e um script, o problema pode ser resolvido tranquilamente.