terça-feira, 13 de dezembro de 2011

Novos meios de captura no FFmpeg

A ferramenta de linha de comando ffmpeg é bastante útil para conversões diversas e para gravar áudio e vídeo a partir dos dispositivos da máquina. A configuração fina de cada codec é meio complicada (com exceção da libx264), mas depois de aprendido é tranquilo.

As versões recentes possuem duas novidades importantes: suporte para entrada via DirectShow no Windows e PulseAudio no Linux.

PulseAudio

Vamos começar pelo dispositivo de entrada "pulse", que permite capturar áudio usando a libpulse.

ffmpeg -f pulse -i default <resto>

Em <resto> você completa com as demais configurações, como tipo de codec, bitrate e arquivo de saída. Algo como:

ffmpeg -f pulse -i default -c:a libvorbis -b:a 128k audio.ogg

Se você quiser modificar os parâmetros que o FFmpeg requesitará para a libpulse, existem opções para este fim, como -channels e -sample_rate (veja mais aqui). A biblioteca fará as modificações necessárias automaticamente (reamostragem e downmix) quando necessário. Devem ser posicionadas entre as opções -f e -i.

ffmpeg -f pulse -channels 1 -sample_rate 32000 -i default <resto>

O dispositivo de entrada default será o padrão configurado no PulseAudio, que você pode mudar usando o controle de volume do Gnome/KDE. É possível requisitar diretamente um determinado dispositivo, especificando o seu nome no lugar de default. Você obtém uma lista dos dispositivos de entrada com pactl list sources.

DirectShow

Faça download de compilações prontas em http://ffmpeg.zeranoe.com/builds/ (a versão "Static", 32 ou 64-bit, provavelmente é o que você precisa).

É suportada faz tempo a obsoleta interface VfW para captura de vídeo no Windows, mas o suporte ao DirectShow sempre foi muito esperado no FFmpeg, principalmente para ser possível capturar áudio.

Primeiro, liste os dispositivos com:

ffmpeg -list_devices true -f dshow -i dummy

O comando retornará algo como:

[dshow @ 0000000001F6CDE0] DirectShow video devices
[dshow @ 0000000001F6CDE0]  "Laptop Integrated Webcam"
[dshow @ 0000000001F6CDE0] DirectShow audio devices
[dshow @ 0000000001F6CDE0]  "Grupo de microfones (SigmaTel H"

Agora, sabendo os nomes dos dispositivos, para capturar vídeo:

ffmpeg -f dshow -i video="Laptop Integrated Webcam" -pix_fmt yuv420p <resto>

Áudio:

ffmpeg -f dshow -i audio="Grupo de microfones (SigmaTel H" <resto>

Como por exemplo:

ffmpeg -f dshow -i video="Laptop Integrated Webcam" -pix_fmt yuv420p -c:v mpeg4 -b:v 1000k video.avi
ffmpeg -f dshow -i audio="Grupo de microfones (SigmaTel H" -c:a libmp3lame -b:a 128k audio.mp3

É possível mudar a especificação do formato de captura requisitado ao DirectShow. Para saber o que o dispositivo suporta, rode:

ffmpeg -list_options true -f dshow -i video="Laptop Integrated Webcam"

ffmpeg -list_options true -f dshow -i audio="Grupo de microfones (SigmaTel H"

Cada comando retornará, respectivamente, algo como:

[dshow @ 00000000003CCEC0] DirectShow video device options
[dshow @ 00000000003CCEC0]  Pin "Capturar"
[dshow @ 00000000003CCEC0]   min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 00000000003CCEC0]   min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 00000000003CCEC0]   min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 00000000003CCEC0]   min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 00000000003CCEC0]   min s=352x288 fps=30 max s=352x288 fps=30
[dshow @ 00000000003CCEC0]   min s=800x600 fps=30 max s=800x600 fps=30
[dshow @ 00000000003CCEC0]   min s=1024x768 fps=10 max s=1024x768 fps=10
[dshow @ 00000000003CCEC0]   min s=1280x1024 fps=10 max s=1280x1024 fps=10
[dshow @ 00000000003CCEC0]   min s=1600x1200 fps=10 max s=1600x1200 fps=10
[dshow @ 00000000003CCEC0]   min s=640x480 fps=10 max s=640x480 fps=10
[dshow @ 00000000003CCEC0]   min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 00000000003CCEC0]   min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 00000000003CCEC0]   min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 00000000003CCEC0]   min s=352x288 fps=30 max s=352x288 fps=30
e
[dshow @ 000000000031CF10] DirectShow audio device options
[dshow @ 000000000031CF10]  Pin "Capture"
[dshow @ 000000000031CF10]   min ch=1 bits=8 rate= 11025 max ch=2 bits=16 rate=44100

As opções que podem ser usadas estão listadas aqui e devem ser colocadas entre as opções -f e -i.

Exemplo final que combina captura de áudio e vídeo:

ffmpeg -f dshow -channels 1 -sample_rate 32000 -video_size 1024x768 -framerate 10 -i audio="Grupo de microfones (SigmaTel H":video="Laptop Integrated Webcam" -pix_fmt yuv420p -c:a libmp3lame -c:v mpeg4 -b:a 128k -b:v 1000k saida.avi

Que tripa!

Miúdos

Você deve ter notado que não usei as opções -ab e -vb para definir o bitrate. Essas opções estão obsoletas e a recomendação é usar a nova sintaxe -b:a (áudio) e -b:v (vídeo).

[Atualização 09/07/2012] Texto atualizado usando a nova sintaxe para a seleção de codecs. -vcodec/-acodec substituídos por -c:v/-c:a. As opções -q/-aq também estão obsoletas: fica agora -q:a/-q:v.

[Atualização 04/09/2013] Adicionado -pix_fmt yuv420p depois da entrada, pois do contrário o ffmpeg poderá usar yuv444p, que dará um arquivo final grande demais e tornará o trabalho do encoder mais demorado (maior uso de CPU).

Um comentário:

  1. Alguem saberia me dizer o motivo ???
    - uma mesma linha de comando funciona em um arquivo e em outro nao.

    > ok
    ffmpeg -i C:\FFMPEG\input.mp4 -filter:v scale=-1:480 -c:v h264 -b:v 512k -minrate 512k -maxrate 512k -bufsize 512k -r 23 -c:a copy C:\FFMPEG\output.MP4

    > erro
    ffmpeg -i C:\FFMPEG\input.mkv -filter:v scale=-1:480 -c:v h264 -b:v 512k -minrate 512k -maxrate 512k -bufsize 512k -r 23 -c:a copy C:\FFMPEG\output.MP4

    ResponderExcluir