FFmpeg: manipule áudios e vídeos a partir da linha de comando

Esse artigo tem como intuito apresentar algumas funcionalidades do FFmpeg, destinado para quem quiser começar a manipular com arquivos de áudio e vídeo de maneira rápida, eficaz e gratuita. Com o FFmpeg você é capaz de desempenhar diversas tarefas, das mais simples como extrair um áudio de um arquivo de mídia ou algo mais complexo como realizar uma transmissão ao vivo.

O framework é utilizado por diversas aplicações que lidam com qualquer tipo de processamento de áudio e vídeo. Netflix, YouTube, Vimeo, Plex, Kodi e outras plataformas de streaming de vídeo utilizam massivamente para lidar com seus arquivos. FFmpeg também é utilizado no tocador de áudio e vídeo do Google Chrome e também no Firefox (apenas na versão Linux). O software de modelagem 3D Blender e os tocadores de mídia VLC media player e iTunes são outros exemplos de softwares que utilizam suas funcionalidades.

Índice

A origem do FFmpeg

Logo do projeto FFmpeg

FFmpeg é um projeto criado em 2000 pelo programador francês Fabrice Bellard. A inspiração do nome surge a partir do botão de avanço rápido (fast forward ou FF) presente nos tocadores de mídia e do "Moving Picture Experts Group", grupo que estabelece padrões de transmissão e compressão de arquivos de áudio e vídeo.

Criado como um projeto de software livre, seu uso e distribuição são totalmente gratuitos. Há uma equipe de desenvolvedores que segue adicionando novas funcionalidades, corrigindo erros e incorporando as colaborações de outros desenvolvedores. Dentre suas ferramentas e bibliotecas, a mais relevante é a ferramenta homônima ffmpeg, que serve como codificador e decodificador de arquivos de áudio e vídeo. Também oferece o tocador de mídia ffplay e uma ferramenta de análise de transmissões de dados multimídia ffprobe.

A grande virtude do projeto FFmpeg é ser capaz de processar quase todos os formatos de áudio e vídeo criados nos últimos 30 anos, independente deles serem desenvolvidos dentro de padrões abertos ou fechados. Isso faz do software se comportar como um canivete suíço, servindo com utilitário para o processamento de áudio e vídeo dentro de aplicações e também uma opção versátil quem deseja manipular arquivos de áudio e vídeo sem precisar usar softwares de edição multimídia, sendo possível criar rotinas de programação (scripts) para automatizar processos.

Arquivos de mídia, codecs e um pouco de teoria

Para começar a usar o FFmpeg, é interessante entender um pouco dos conceitos que permeam o seu uso, como saber do que é constituído um arquivo de mídia.

Os arquivos de mídia podem ser representados como contêiner que possui transmissões de dados. O contêiner serve como uma cápsula que oferece uma interface para que os tocadores de mídia ou outras ferramentas possam interagir. Cada tipo de contêiner possui suas particularidades e suas restrições de conteúdo. Entre os contêineres mais populares atualmente, podemos citar MP4 (.mp4), MKV (.mkv), WEBM (.webm), MOV (.mov), MPEG Transport Stream (.ts), entre outros.

As transmissões (streams) dentro de um contêiner podem incluir os componentes de áudio, vídeo, legendas e outros tipos de metadados do arquivo. Esses componentes que estão dentro do contêiner, como áudio ou as imagens de um filme, são salvos utilizando um método específico de codificação chamado codec. Codec é a concanetação das palavras encoder (codificador) e decoder (decodificador). O codificador é responsável por comprimir um arquivo fonte de acordo com um algoritmo específico. Esse algoritmo deve ser interpretado pelo decodificador, que descomprime e reproduz o arquivo. É por conta do suporte aos codecs que alguns arquivos não são reconhecidos ou não funcionam corretamente em alguns tocadores de mídia, como TVs, video-games ou tocadores padrão de sistemas operacionais. MPEG-1, MPEG-2, H.264 (ou AVC), H.265 (ou HEVC), H.266 (ou VVC), AV1 são alguns dos codecs de vídeo mais populares. Já MP3, AAC, Opus, Ogg Vorbis, FLAC, Dolby Digital e ALAC são exemplos de codecs de áudio.

Transcodificação

A partir dos parâmetros de entrada informados para o programa, o FFmpeg processa a requisição e devolve um ou mais arquivos de saída. Seguindo esse fluxo de execução, somos capazes de converter arquivos de mídia para um formato diferente do original. Esse processo é chamado de transcodificação (transcoding). A transcodificação consiste em decodificar um dado para um formato intermediário, o qual será codificado para o formato desejado.

Fluxo de transcodificação no FFmpeg

Com o FFmpeg, o primeiro passo do programa é ler os arquivos de mídia de entrada e dividir em pacotes de dados. Esse passo é chamado de demux. Os pacotes ainda estão codificados, portanto o programa executa um decodificador para deixá-lo em um formato sem compressão, separados em quadros (frames). Nesse momento, podem entrar em ação os filtros (filters) para manipular o arquivo, como redimensionar, acelerar ou diminuir a velocidade, entre outras ações. Depois dos filtros serem aplicados, os quadros são enviados para o codificador do formato desejado. O codificador gera os pacotes codificados que serão escritos nos arquivos, de acordo com o contâiner definido. Esse processo de escrita a partir de pacotes codificados é chamado de mux. Por fim, o FFmpeg entrega o arquivo no formato desejado.

A transcodificação é um processo minucioso e pode ser demorado dependendo do tamanho do arquivo e da capacidade de processamento do seu computador. Felizmente, nem sempre precisaremos fazer conversões para alterar nossos arquivos de mídia. Se o intuito for apenas aplicar um ou mais filtros para manipulá-los, não será necessário fazer a recodificação completa do arquivo e consequentemente será uma operação muito mais rápida.

Executando o FFmpeg

Para utilizar o FFmpeg, o único requisito é ter o conhecimento básico de como utilizar a linha de comando de um computador. Existem alguns comandos que independente do sistema operacional (Windows, macOS ou GNU/Linux) que são agnósticos. Caso você seja capaz de usar os comandos cd para navegar entre os diretórios, mkdir para criar uma pasta nova, rm para remover arquivos e mv para renomear ou mover arquivos, acredito que já é o suficiente para começar a usar o programa. Se você ainda não estiver à vontade com a linha de comando, eu sugiro a leitura do capítulo de introdução à linha de comando do site DjangoGirls antes de prosseguir nesse tutorial.

FFmpeg no Windows

Existem diversas formas de executar FFmpeg no Windows. A mais simples é efetuar o download dos arquivos para Windows em https://ffmpeg.org/download.html, descompactar em uma pasta específica e navegar com a linha de comando até essa pasta. Por exemplo, se você descompactou a pasta em C:\Arquivos de Programas\ffmpeg, você precisa abrir o terminal de comando (Linha de Comando ou PowerShell) e executar cd C:\Arquivos de Programas\ffmpeg. Caso você queira que o comando "ffmpeg" esteja disponível em qualquer pasta enquanto você está utilizando a linha de comando, sugiro fazer a configuração das variáveis de ambiente do terminal.

FFmpeg no GNU/Linux

A forma mais simples de instalar o FFmpeg é procurá-lo no gerenciador de pacotes da sua distribuição. No Ubuntu, sudo apt update && sudo apt install ffmpeg é o suficiente para instalá-lo. O mesmo serve para Fedora e CentOS (yum), Arch Linux (pacman), entre outros.

FFmpeg no macOS

Para instalar o FFmpeg do jeito mais fácil é necessário que você possua o Homebrew instalado em seu computador. Depois de instalá-lo, basta executar brew install homebrew-ffmpeg/ffmpeg/ffmpeg no Terminal e aguardar o processo de download e instalação.

Primeiros passos: extrair um trecho de um arquivo

Com o FFmpeg instalado, basta digitar ffmpeg (ou ffmpeg.exe no Windows) na linha de comando para executá-lo. Como vimos no fluxo acima, o programa espera por um arquivo de entrada, pode receber opções para transformar esse arquivo e por fim cria um arquivo de saída.

No primeiro exemplo, temos um vídeo com a interpretação do poema "Fale, Mulher", da poeta Jade Quebra, disponível no canal do YouTube Ganga Prod. Faça download do vídeo aqui.

Ganga Poesia - Jade Quebra - Fale, mulher! (por Ganga Prod)

Vamos cortar um trecho do vídeo, desde a introdução com o nome da poesia e da poeta até o verso "e o seu nome, em lugar de destaque ficou?". Ao executar o vídeo, vemos que o trecho que nos interessa começa aos 15 segundos e termina com 1 minuto e 20 segundos. Para extrair essa parte específica do vídeo, utilizaremos a função seeking, sinalizada a partir do parâmetro -ss.

Levando em consideração que o arquivo do vídeo está na pasta atual do seu terminal, o comando para extrair essa porção sem recodificar o arquivo será o seguinte: ffmpeg -i fale_mulher.mp4 -ss 00:00:06.0000 -to 00:01:20.6000 -c copy fale_mulher_trecho.mp4

Caso o comando seja executado com sucesso, você terá um arquivo fale_mulher_trecho.mp4 na mesma pasta que você executou o comando.

A sintaxe

Vamos destrinchar o comando que utilizamos anteriormente por partes: ffmpeg -i fale_mulher.mp4 -ss 00:00:06.0000 -to 00:01:20.6000 -c:v libx264 -c:a copy fale_mulher_trecho.mp4

Informações de execução

Ao executar o comando, o programa exibirá uma espécie de cabeçalho com uma porção de informações sobre sua execução. Na primeira linha podemos verificar a versão que está sendo usada (4.3.1) e vários parâmetros de configuração que são habilitados por padrão. Em seguida há uma lista de bibliotecas que nos auxiliam nas nossas operações, como as bibliotecas responsável pelo muxing e demuxing (libavformat), decodificação e codificação (libavcodec), redimensionamento de imagem e conversão de pixels (libswscale).

Informações sobre a versão e os codecs ao efetuar o comando ffmpeg'

Logo abaixo, o ffmpeg exibe as informações correspondentes ao comando executado pelo usuário. É possível as informações do arquivo de entrada (Input #0, em vermelho) e do arquivo de saída (Output #0, em verde).

Para o arquivo de entrada (Input #0), na primeira linha temos a informação dos contênieres compatíveis e o nome do arquivo. Abaixo disso teremos a descrição do conteúdo presente no contêiner de cada arquivo. Informações de metadados são exibidas como o tipo de codificador, a duração do vídeo e a taxa de bits (bitrate). Depois vemos duas streams (Stream #0:0 e Stream #0:1) e seus respectivas informações. A primeira stream do arquivo de entrada é correspondente ao vídeo e lá temos a informação do codec (h264), o sistema de codificação de cores (yuv420p), a resolução (854x420), a taxa de kilobits por segundo (528 kb/s), a taxa de quadros por segundo (23.98fps) e também marcações de instante único (timestamp) que o ffmpeg usa como referência para manipular o arquivo. A outra stream (Stream#0:1) é correspondente a trilha de áudio, com o seu codec (aac), a frequência (44100Hz), o tipo de sinal (stereo), o formato de sample (fltp) e a taxa de bits (119kb/s).

Já para o arquivo de saída (Output #0), todas as informações são iguais exceto o nome, ainda que explicitamos a mudança do codec de vídeo. A recodificação nesse caso é importante para o

O programa oferece as opções de sair (Q) e ajuda (?) enquanto está em execução, além de mostrar em tempo real o arquivo de saída sendo construído.

Informações sobre o processo de cortar o vídeo "Fale, mulher"'

Sei que no primeiro contato essa quantidade enorme de informações pode acabar assustando. Porém, não se preocupe agora em entender todos os detalhes. Com o uso virá a familiaridade e será trivial assimilar essa sopa de letrinhas para ter mais consciência de como funciona a manipulação dos arquivos.

E se fosse um arquivo de áudio?

Podemos fazer algo semelhante com um arquivo de áudio. Como exemplo, vamos retirar um trecho da música "Ho Hay", do BNegão e Seletores de Frequência.

ffmpeg -i bnegao_hohay.mp3 -ss 00:00:00.00 -t 00:01:14.59 -c:a copy bnegao_hohay_trecho.mp3

Ao executar esse comando, o ffmpeg criará o arquivo bnegao_hohay_trecho.mp3 na pasta onde foi executado. A única diferença para o comando anterior é que como se trata de um arquivo que apenas possui uma stream de áudio, apenas precisamos passar a opção referente ao codec de áudio, -c:a copy.

Adicionando uma trilha de áudio em um vídeo

Com os arquivos gerados na seção anterior, podemos adicionar uma trilha de áudio no vídeo editado. Antes disso, vamos diminuir o volume da faixa de áudio. Para fazer isso, podemos utilizar o filtro de áudio volume.

ffmpeg -i bnegao_hohay_trecho.mp3 -filter:a "volume=0.20" bg.mp3

A sintaxe começa igual com o nosso arquivo de entrada após o -i. Depois, ultilizamos a opção -filter com o modificador :a para sinalizar que faremos uma alteração no áudio. Por fim, o parâmetro "volume=0.20" significa que diminuiremos o volume para 20% do original. Com isso teremos a trilha de fundo perfeita pro vídeo.

Para adicionar essa trilha no nosso vídeo, teremos que passar o arquivo do vídeo e o arquivo de áudio como arquivos de entrada. Depois, usaremos o filtro amerge para unir as duas streams de áudio em uma única transmissão. Com a nossa única stream, usaremos a opção map para copiar as streams para o novo vídeo. Por último, teremos que recodificar o áudio, pois o áudio original está em AAC e a música de fundo em MP3 e desejamos uma stream de áudio em AAC.

ffmpeg -i fale_mulher_trecho.mp4 -i bg.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -c:a aac -shortest fale_mulher_bg.mp4

amerge

-filter_complex é a opção que usamos para utilizar o filtro amerge. As opções [0:a] e [1:a] são as streams, do primeiro (#0) e segundo (#1) arquivos de entrada, respectivamente. Com isso passamos para o filtro que são duas entradas amerge=inputs=2 e armazenamos essa união em [a].

map

A opção -map serve para copiar streams. Vamos usá-la duas vezes: para copiar a stream de vídeo do primeiro arquivo de entrada (0:v) e depois para copiar a stream que criamos com o amerge, "[a]".

Recodificação

Para encerrar, copiaremos o codec de vídeo com -c:v copy. Já o áudio, transformaremos em AAC, compatível com o nosso contêiner, utilizando -c:a aac. Também deixaremos a opção -shortest, que garante que o arquivo de saída terá a duração do menor arquivo passado. Sendo assim, não correremos o risco de ter stream de vídeo maior do que áudio e vice-versa.

Extrair o áudio de um vídeo

E se quisermos apenas o áudio desse último vídeo que criamos? O comando é simples:

ffmpeg -i fale_mulher_bg.mp4 -vn -c:a mp3 fale_mulher_audio.mp3

A opção -vn serve para descartar a inclusão de streams de vídeo no arquivo final. -c:a mp3 é a conversão da stream de áudio (que estava em AAC) para MP3. Existem parâmetros que podem ser modificados como a taxa de bits (-b:a), a taxa de áudio (-ar) e a quantidade de canais de áudio (-ac). Caso queira manter o formato original da stream de áudio, você pode utilizar a opção -c copy.

Redimensionar um vídeo

Você foi enviar o vídeo para alguém e achou que o tamanho do arquivo estava muito grande. Uma das formas de resolver isso é diminuir a resolução do vídeo, ou seja, o tamanho da largura e altura. A resolução atual é 854x480 (16:9), podemos diminuir proporcionalmente o tamanho, definindo só o valor da altura. Vamos definir a altura em 320px e deixar que o ffmpeg faça esse cálculo para nós.

ffmpeg -i fale_mulher_bg.mp4 -vf scale=-2:320 fale_mulher_resize.mp4

A opção -vf serve para sinalizar que virão filtros de vídeo e utilizamos o filtro scale, especificando apenas o valor da altura (320px). O valor da largura utilizamos o sinalizador -2, que serve pro programa fazer o cálculo da proporção e corrigir caso o número seja decimal.

Extrair uma imagem de um vídeo

O ffmpeg também facilita a extração da imagem em um ponto específico de um vídeo.

ffmpeg -i fale_mulher_bg.mp4 -ss 00:00:08.400 -f image2 -frames:v 1 thumb.jpg

Usamos a opção -ss para definir o ponto que a imagem será extraída. A opção -f serve para informar o ffmpeg que vamos usar o muxer image2, que serve pra transformar quadro de vídeo em arquivos de imagem. Finalmente, -frames:v é a opção que explicita quantos quadros vamos extrair do arquivo.

Conclusão

As tarefas acima são apenas uma breve introdução a todo potencial que o FFmpeg oferece para seus usuários. Recomendo que você dê uma lida na documentação do projeto para consultar todas as funcionalidades disponíveis.

Por ser uma ferramenta amplamente utilizada, não é difícil encontrar informações apenas pesquisando em fóruns de discussão ou até em outros tutoriais no YouTube. Espero que essa introdução seja útil para começar a dominar essa ferramenta poderosa.