terça-feira, 3 de fevereiro de 2015

Como converter vídeos para diferentes formatos de forma fácil e prática

Se você também precisa converter algum vídeo (no meu caso, a necessidade decorre do fato do meu equipamento multimídia ser um tanto antigo e só aceitar o formato AVI), precisa conhecer a ferramenta FFmpeg. Trata-se de um aplicativo de código aberto, disponível para múltiplas plataformas, e que permite fazer inúmeras coisas bacanas - entre elas converter rapidamente e com qualidade entre vários formatos de arquivos de vídeo.


Esse aplicativo é de execução em linha de comando, e sua sintaxe básica é a seguinte:

> ffmpeg -i input.mp4 output.avi

Com essa chamada, ele converte automaticamente o arquivo de entrada "input.mp4" no arquivo de saída "output.avi", por exemplo. Acontece que se você trabalha com Windows é pouco provável que esteja acostumado a usar a linha de comando para executar suas tarefas. Por isso, eu bolei uma alternativa prática para executar essa conversão diretamente do Windows Explorer com dois cliques do mouse sobre o arquivo desejado.

1. O primeiro passo é, naturalmente, baixar o FFmpeg (se você ainda não o fez). Descompacte o arquivo baixado em algum diretório de sua escolha. No meu caso, eu descompactei para o diretório "C:\ffmpeg\".

2. Então, crie um arquivo de lote (batch) com o nome que preferir. Ele será utilizado para converter um vídeo em qualquer formato para um único formato específicado. Eu o nomei "convert-to-avi.bat", porque ele será usado para converter qualquer vídeo para o formato AVI. O arquivo pode ser criado em qualquer diretório que preferir, mas eu optei por criar dentro do diretório do FFmpeg.

Inclua nesse arquivo os seguintes comandos (são duas linhas de texto, uma com o comando "@echo [...]" e outra com o comando "for [...]" - ou seja, não há quebra na segunda linha!):

@echo off
for %%f in (%1) do C:\ffmpeg\bin\ffmpeg -i %1 -qscale 1 "%%~df%%~pf%%~nf.avi"

O que esse código faz é simplesmente executar o FFmpeg usando como arquivo de entrada o parâmetro recebido pelo arquivo de lote (a variável "%1"). O comando "for" é utilizado apenas como um truque para permitir facilmente trocar a extensão do arquivo para ".avi" mantendo todo o resto (e ele faz isso usando os parâmetros "%%~df" para a letra do drive, "%%~pf" para o diretório do arquivo e "%%~nf" para o nome do arquivo sem extensão). Eu adicionei à chamada do FFmpeg o parâmetro "-qscale 1" para garantir qualidade total na conversão do vídeo.

3. A partir de então você pode executar a conversão na linha de comando simplesmente fazendo, por exemplo:

> convert-to-avi input.mp4

Isto gerará automaticamente o arquivo "input.avi" (mesmo nome, mas extensão e, claro, formato diferentes).

4. Só que a ideia é não precisar usar a linha de comando. Então, o próximo passo é alterar o registro para que uma nova opção seja adicionada ao menu de contexto do Windows Explorer (o menu acionado com o clique com o botão direito do mouse sobre um arquivo). Para isso, abra o editor do registro com o seguinte comando:

> regedit

Dentro do nó "HKEY_CLASSES_ROOT", procure pela chave da extensão do formato de arquivo de vídeo para o qual deseja criar a nova opção. Você precisará reproduzir esses passos para os demais formatos, mas vamos considerar primeiro, por exemplo, a extensão ".mp4". Ao encontrar essa chave, expanda e anote (pode ser mentalmente! :) você vai usar esse valor logo a seguir) o conteúdo da variável padrão (ou default, se o seu Windows estiver em inglês). Por exemplo:



4.1. Então, no mesmo nó, mais abaixo, procure pela chave com esse nome. Expanda e crie, dentro da subchave "Shell", uma nova chave com o nome que desejar. Note que esse nome será o texto exibido no item do menu, quando você efetuar o clique com o botão direito do mouse sobre um arquivo desse formato/extensão. Dentro dessa nova chave com o nome desejado para o novo comando, crie uma nova chave com o nome "command" (o nome deve ser exatamente esse!). Então, adicione ao valor da variável padrão o seguinte conteúdo:

C:\\ffmpeg\\convert-to-avi.bat "%1"



ERRATA: Na imagem acima o comando não tem as aspas ao redor do parâmetro "%1". Elas são importantes para não ocorrer erros com arquivos contendo espaços no nome.

 O caminho e nome do arquivo de lote deve ser o que você utilizou. Se você não seguiu o meu exemplo (criar o arquivo na mesma pasta do FFmpeg e chamá-lo de "convert-to-avi.bat"), você precisará alterar de acordo. Note porém que as duplas barras são necessárias para separar subdiretórios. O valor "%1" simplesmente passa como parâmetro para o arquivo de lote o nome completo (caminho + nome) do arquivo selecionado.

Pronto!

O novo comando aparece imediatamente. Basta selecionar um arquivo de vídeo (no exemplo, com o formato e extensão ".mp4") e clicar com o botão direito do mouse. Será apresentado o novo comando no menu de contexto:


Ao selecionar esse comando, uma janela do prompt de comando será aberta e a execução do FFmpeg será iniciada:


Apesar do FFmpeg ter um desempenho muito bom, o processo leva alguns bons minutos, dependendo do tamanho do arquivo. Eu testei com um vídeo de 20 minutos de duração com 209 Megabytes e o processamento durou aproximadamente 1 minuto. O tamanho do arquivo produzido também depende do formato escolhido:



O FFmpeg "adivinha" o formato dos arquivos pela extensão utilizada, mas há parâmetros para forçar um formato desejado. Consulte a documentação da ferramenta. Por fim, note que você precisará repetir os passos 4 e 4.1 para outros formatos (se quiser ter o mesmo comando disponível também para arquivos com extensão ".mkv", por exemplo). Você pode criar outros arquivos de lote específicos para converter para outros formatos, ou, se estiver se sentindo apto, modificar o código para utilizar um segundo parâmetro que define o formato final desejado.

E é isso ai. Espero que seja útil pra mais alguém além de mim. :)

:wq

5 comentários:

  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
  2. Oi Luiz. Infelizmente eu não tenho como ajudar, até porque você não indicou qual foi a mensagem de erro.

    Dê uma olhada neste site da rede SE: http://video.stackexchange.com/questions/tagged/ffmpeg

    Se já não existir lá uma pergunta que te ajude com esse problema, poste uma você mesmo. Só não esqueça de fornecer detalhes sobre a mensagem de erro.

    []s e boa sorte.

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Desculpe pelo esquecimento, a mensagem eh a seguinte:

      > erro
      Error while opening encoder for output stream #0:0 - maybe incorrect parameters
      such as bit_rate, rate, width or height

      como disse so acontece neste caso. se retirar os paremetros "-c:v h264 -b:v 512k -minrate 512k -maxrate 512k -bufsize 512k -r 23" funciona os 2, porem com os parametros o mkv > mp4 de erro

      Excluir
    3. Bom, de acordo com a mensagem de erro os parâmetros estão mesmo incorretos. Talvez os valores passados não são válidos para o formato MKV? Tentou retirar apenas alguns dos parâmetros para descobrir qual, de fato, está causando o erro?

      De todas as formas, é como eu disse: não sou especialista em conversão de vídeo. Sugiro perguntar lá no site que eu indiquei.

      []s

      Excluir