5

Pitch: Criei uma CLI em Go para tornar conversões com FFmpeg mais previsíveis e seguras

Há algum tempo comecei a trabalhar no MediaConv, uma CLI open source escrita em Go que usa o FFmpeg como engine de processamento.

A ideia inicialmente parecia simples:

Eu não quero precisar lembrar uma sequência enorme de flags do FFmpeg toda vez que precisar converter um arquivo.

Mas durante o desenvolvimento percebi que o problema mais interessante não era simplesmente esconder parâmetros do FFmpeg.

Era tornar a conversão previsível, segura e utilizável em automações.

Foi daí que o MediaConv começou a tomar a forma que tem hoje.

O que é o MediaConv?

O MediaConv é uma CLI que cria uma camada de orquestração em cima do FFmpeg.

Por exemplo:

mediaconv convert recording.webm

Para áudio:

mediaconv convert song.wav --to mp3

E, a partir da v0.4.0, também é possível converter diretórios inteiros:

mediaconv batch ./recordings --to mp4 --output-dir ./converted

Hoje existem dois profiles principais:

  • web: vídeos para MP4 usando H.264 + AAC;
  • music: arquivos de áudio para MP3.

Mas converter mídia é apenas uma parte do projeto.

Por que não usar FFmpeg diretamente?

Essa provavelmente é a primeira pergunta que aparece.

E o objetivo do MediaConv não é substituir o FFmpeg.

Na verdade, ele depende dele.

A proposta é cuidar das decisões e verificações que normalmente acabam espalhadas entre scripts diferentes.

Uma conversão passa aproximadamente por:

CLI
 ↓
validação do arquivo
 ↓
ffprobe
 ↓
seleção do profile
 ↓
plano de conversão
 ↓
FFmpeg
 ↓
ffprobe do resultado
 ↓
verificação
 ↓
publicação do arquivo

O FFmpeg nunca recebe diretamente o destino final.

O MediaConv cria primeiro um arquivo em uma área temporária privada, executa a conversão, inspeciona novamente o resultado e somente depois publica o arquivo.

Se algo der errado no meio do processo, o destino final não recebe um arquivo parcialmente convertido.

Algumas decisões que tomei

Uma preocupação que tive desde cedo foi evitar transformar a CLI apenas em algo como:

exec.Command("ffmpeg", ...)

e considerar o problema resolvido.

Sem shell no meio

Os argumentos são enviados diretamente ao processo do FFmpeg.

Isso significa que caminhos com espaços e Unicode não precisam ser reinterpretados por sh, cmd.exe ou outro shell.

Overwrite precisa ser explícito

Por padrão:

mediaconv convert video.webm

não substitui silenciosamente um arquivo existente.

Para fazer isso é necessário:

mediaconv convert video.webm --overwrite

Verificação da saída

O sucesso do processo do FFmpeg sozinho não é considerado suficiente.

Depois da conversão, o resultado é inspecionado novamente antes de ser publicado.

Uso em scripts

Além da saída amigável para terminal:

mediaconv --json ...

permite consumir resultados de forma estruturada.

Também defini códigos de saída específicos para situações como:

  • argumentos inválidos;
  • FFmpeg ausente;
  • arquivo inválido;
  • conflito de destino;
  • falha na conversão;
  • interrupção pelo usuário.

Isso torna a CLI bem mais previsível dentro de pipelines e scripts.

mediaconv doctor

Outra coisa que comecei a perceber durante os testes é que simplesmente encontrar ffmpeg no sistema não significa que aquela instalação possui tudo o que o profile precisa.

Então existe:

mediaconv doctor

Ele verifica a instalação e as capabilities necessárias antes de a pessoa descobrir o problema no meio da conversão.

Também existe:

mediaconv inspect arquivo.webm

para visualizar informações da mídia.

O projeto também me fez estudar bastante sobre distribuição

Hoje estou tentando tratar o MediaConv como um projeto open source de verdade, e não apenas como um repositório de código.

O CI executa testes em Linux, macOS e Windows.

Também existem testes de integração fazendo conversões reais com FFmpeg, race detector, análise de vulnerabilidades e validação do pipeline de release.

As releases são geradas para Linux, macOS e Windows, em AMD64 e ARM64.

Também comecei a trabalhar com:

  • GoReleaser;
  • checksums;
  • SBOM;
  • Sigstore;
  • provenance;
  • Homebrew;
  • Scoop;
  • pacotes .deb, .rpm e .apk.

Essa parte acabou sendo quase tão interessante quanto a implementação da CLI.

O que entrou na v0.4.0

A versão mais recente adicionou batch conversion.

Agora consigo fazer algo como:

mediaconv batch ./recordings \
  --to mp4 \
  --output-dir ./converted

O próximo passo nessa área é evoluir o processamento de diretórios, incluindo controles de concorrência.

Próximos passos

Algumas coisas que quero explorar:

  • MP4 → WebM;
  • geração de previews em GIF;
  • AAC e WAV;
  • concorrência no modo batch;
  • instalação através de mais package managers;
  • hardware acceleration, mas somente depois de ter testes confiáveis para cada capability.

Também estou evitando adicionar plugins ou transformar a ferramenta em uma abstração gigantesca antes de existir uma necessidade real.

Quero manter a CLI pequena, previsível e fácil de automatizar.

Open source

O MediaConv está sob licença MIT e o desenvolvimento está acontecendo publicamente no GitHub:

github.com/Amad3eu/mediaconv

A documentação e o site do projeto também estão sendo desenvolvidos junto com a CLI.

Ainda estou antes da v1.0, então considero esta exatamente a fase em que feedback é mais valioso.

Se vocês usam FFmpeg em scripts, pipelines ou automações, eu adoraria saber:

quais são as coisas que mais incomodam vocês nesse tipo de workflow?

E também aceito críticas sobre decisões da arquitetura, CLI e escopo do projeto.

Carregando publicação patrocinada...
1

Meus 2 cents,

Parabens pela iniciativa !

Uso o ffmpeg/probe no meu dia-a-dia e tenho diversos wrappers para nao ter de ficar lembrando as opcoes que preciso passar: vou colocar teu projeto na lista para testar e ver se funciona de forma mais fluida do que tenho hoje.

Repositorio devidamente starreado e forkeado, obrigado por compartilhar !

Saude e Sucesso !


Este post foi favoritado via extensão TABNEWS FAVORITOS

Tem curiosidade sobre IA ? Da uma olhada no meu LIVRO: IA PARA ENGENHEIROS

1

Valeu demais pelo feedback e pelo apoio!

Muito legal saber que você já usa ffmpeg/ffprobe no dia a dia, porque esse é exatamente o tipo de uso que eu queria facilitar quando comecei o projeto.

Quando conseguir testar, se tiver qualquer coisa que hoje você faz nos seus wrappers e sentir falta no MediaConv, ou algo que poderia ser mais fluido, fica à vontade para abrir uma issue ou me chamar. Esse tipo de feedback vai ajudar bastante na evolução do projeto.

E obrigado também pelo star e pelo fork! 😄

Sucesso pra você também!