Conversão de vídeo usando Python com ffmpeg

Python com ffmpeg

O ffmpeg é um programa incrível, certamente o mais repleto de recursos para conversão de vídeo com uma enormidade de codecs. O problema é que isso tem um preço; é bastante complexo manipular arquivos por linha de comando com filtros elaborados. E se começar a pesquisar no google vai encontrar diferentes procedimentos para um mesmo objetivo. Se for considerar as variações de filtros, aí fica quase impossível decidir o que fazer. Bem, usar Python com ffmpeg não é diferente, mas se for usar o módulo python-ffmpeg, aí meu caro, se prepare para muitas horas de estudo. E não dá pra contar nem com o próprio help por linha de comando, porque a saída é gigantesca, por isso vamos usar o módulo subprocess, que ao menos nos permite usar a linha devidamente formatada, como se fosse digitada por linha de comando.

Conversão de diretório de arquivos

Escrevi esse programa para converter arquivos .mkv e .mp4 para .mov, de modo que possa importá-lo no DaVinci Resolve. A versão 17.2 do DaVinci Resolve tem suporte ao formato .mkv apenas para Windows, então se você usa Windows, apenas o formato .mp4 pode ser necessário converter previamente. Como uso Linux, ambos os formatos precisam ser convertidos e normalmente gravo trechos separados ou vídeos distintos para produzir os vídeos disponíveis em nosso canal DobitaobyteBrasil no Youtube. Já escrevi como fazer essa conversão, porém agora dei uma melhorada no comando para converter vídeos de 30fps para 24fps e para converter o áudio para PCM32 (porque antes estava convertendo para PCM16 e isso eventualmente diminuiria a qualidade de áudio, caso tivesse sido gravado em PCM32).

Tudo o que precisamos fazer é importar os módulos os e subprocess para usar Python com ffmpeg do sistema, então interagir em um loop. Não estou passando parâmetro, nem considerando nível de diretório. Isso significa que esse código deve ser salvo em um script python que deve estar no mesmo nível de diretório dos arquivos a serem convertidos. Aqui chamei o script de toMov.py. Esse programa funciona com Python3. Pegue sua versão para Windows ou Mac no site oficial.

Para executar no Windows, deve ficar algo como:

python3.exe toMov.py

E no linux temos dois modos de fazê-lo:

python3 toMov.py
#ou então transformando o script em executável (só precisa ser feito 1 vez)
chmod 750 toMov.py 
#e executando-o:
./toMov.py

O script deve conter apenas esse código:

#!/usb/bin/python3
import os
import subprocess


for name in os.listdir():
    if 'mp4' in name or 'mkv' in name:
        name_out = name.split('.')[0]
        cmd = 'ffmpeg -i {} -c:v dnxhd -vf "scale=1280:720,fps=24,format=yuv422p" -b:v 110M -c:a pcm_s32le {}.mov'.format(name,name_out)
        subprocess.call(cmd,shell=True)

É a melhor maneira? – Bem, depende do ponto de vista. Pra quem conhece, isso é similar à chamada system do C, então fica claro que não é programação nativa. Mas dá pra ser pior que o subprocess, usando a chamada os.system, que não tem nenhum controle sobre o processo. Mas convenhamos, funcionando sem problemas é o que importa, já que o objetivo principal nesse caso não é programar.