DAVINCI RESOLVE: Script conversor de vídeos feito em Shell
Como você já deve ter notado caso seja um leitor assíduo do blog, estou começando a escrever mais sobre Shell Script e incentivando as pessoas a criarem as soluções que resolvam seus próprios problemas ou pelo menos aumentem a sua produtividade. Este é o caso do script que desenvolvi para converter meus vídeos que gravo para o YouTube.
A ideia deste post é analisar o problema que eu estava enfrentando, como pensei em uma solução e como criei ela usando Shell Script.
Requisitos
Se você quiser aprender mais sobre Shell Script, recomendo clicar em Shell Script no canto esquerdo da tela. Além disso, vou deixar alguns vídeos meus:
- Como DESENVOLVI uma AUTOMAÇÃO em PYTHON do ZERO
- SHELL SCRIPT: Criando um simples BACK-UP INCREMENTAL
- Cotação do BITCOIN na linguagem SHELL SCRIPT!!
Caso você queira deixar de comprar 3 pastéis e adquirir meu curso de Shell Script por apenas R$19,90, clique aqui.
Créditos
Os créditos do meu script vão para o Henrique do canal do Diolinux que teve a ideia de criar um script conversor. Acabei refazendo o código adaptando ao meu uso diário, mas a ideia partiu dele. Deixo aqui em baixo a postagem do mesmo:
O problema!
Mas, se o Henrique já fez o script, porque reescrever ele? Bom, existem duas limitações ao qual para o meu uso são essenciais:
- O script dele só estava convertendo os formatos .mp4
- O script precisa ser colocado no mesmo diretório do vídeo a ser convertido, isto é, se eu gravar meus 5 vídeos que serão lançados nos próximos meses, teria que executar o script 5 vezes
Além disso, estou gravando um curso de servidores Linux (fica ligado) ao qual preciso converter uma quantidade bastante expressiva de vídeos, e teria que fazer isso diretório por diretório (estão separados por módulos).
Analisando o script
Você pode ter acesso ao meu script clicando aqui para acessar a página no GitHub.
Parte 1
DESTINO_CONVERTER="$1"
IFS=$'\n'
A variável DESTINO_CONVERTER armazena o primeiro parâmetro enviado, que neste caso será o diretório que vamos procurar recursivamente os arquivos a serem convertidos.
A variável IFS significa Internal Field Separator, que é o delimitador do próximo “for”, que neste caso será o “\n” (linha em branco). Isto quer dizer que quando quebrar a linha, trocar para o próximo item da lista.
Parte 2
for diretorio_conversao in $(find "$DESTINO_CONVERTER" -type f \( -iname *.mov \
-o -iname *.mp4 \
-o -iname *.mkv \
-o -iname *.webm \) \
-printf "%h\n")
Estou rodando um laço for em uma lista, que na verdade é a saída do comando find. Este find busca todos os arquivos com aquelas extensões e ao final mostra somente os diretórios (opção %h).
Perceba a diferença abaixo, ele deixa somente o diretório e remove o nome do arquivo:
Parte 3
[ ! -d "$diretorio_conversao/convertidos" ] && mkdir "$diretorio_conversao/convertidos"
[ "$ultimo_diretorio" != "$diretorio_conversao" ] && {</code></pre>
Validamos se o diretório de convertidos já existe, se não, criamos o diretório.
A variável ultimo_diretorio armazena o ultimo diretório verificado, pois como você pode ver no print acima, ele repete vários diretórios por ele encontrar diversos arquivos em um mesmo diretório. Desta forma, eu só vou tomar uma ação se ele for diferente, se não, nem faço nada.
Parte 4
for arquivo_conversao in $(find "$diretorio_conversao" -type f \( -iname *.mov \
-o -iname *.mp4 \
-o -iname *.mkv \
-o -iname *.webm \) \
-printf "%f\n")
Partindo do princípio que a condição da mudança de diretório é verdadeira, vou começar a conversão. Uso um find para encontrar os mesmos arquivos, mas somente dentro do diretório corrente, e não em toda a raiz que foi informada. Ao final uso o printf “%f” para limitar somente o nome dos arquivos, veja:
Parte 5
[ ! -f "$diretorio_conversao/convertidos/${arquivo_conversao%.*}.mov" ] && {
Agora, cada arquivo do for ficará armazenado no arquivo_conversao. Como você pode ver acima, eu verifico se esse arquivo já foi convertido, se não, nem vou converter. Perceba que eu uso ${arquivo_conversao%.*}.mov para verificar.
Existem casos onde eu vou converter um vídeo mp4 e ao final ele sempre vai virar .mov. Então o que eu faço é substituir tudo que vem antes do “.” (%.*) e coloco o .mov no final. Isto é, se o nome do arquivo é mateus.mp4, ele vai virar mateus.mov. Desta forma eu consigo ver se ele já foi convertido, já que o formato final é .mov.
Parte 6
ffmpeg -i "$diretorio_conversao/$arquivo_conversao" -codec:v mpeg4 \
-q:v 0 \
-codec:a pcm_s16le \
-max_muxing_queue_size 9999 \
"$diretorio_conversao/convertidos/${arquivo_conversao%.*}.mov"
Caso o arquivo ainda não tenha sido convertido, vou converter. Perceba que vou quebrando a linha de comandos longos com “" e ao final uso a mesma substituição para usar o formato .mov ao final.
Demo
No exemplo abaixo eu tenho um diretório testing e dentro deste diretório eu tenho dois sub-diretórios que contém vídeos de diversos formatos. Veja:
Agora, para o chamar o to_davinci eu uso o “.” que referencia para o diretório que estou localizado no momento.
E esse aqui foi o resultado final, criando um diretório convertidos dentro de cada sub diretório e convertendo todos para o formato .mov.
Conclusão
Ta e aí Mateus, fez esse post pra se achar? Não! A ideia é mostrar que dá pra desenvolver qualquer coisa e que com certeza vai melhorar a sua produtividade do seu dia a dia. Eu gastei umas 3 horas desenvolvendo isso, e sabe o que é engraçado? Foi 90% Google e 10% conhecimento. Esses 10% foi só a minha lógica, mas não lembrava muitas coisas da sintaxe e acabei por pesquisar.
No fim ainda aprendi várias coisas novas como o IFS e também a substituição de strings. Muito útil. E aqui vai um conselho, antes de procurar qualquer coisa na Internet, tenta criar suas próprias automações, só assim você vai aprender. Melhor gastar um dia fazendo isso, do que repetir essa tarefa arduamente durante o resto da vida!
Bom, espero que tenha gostado dessa dica. Se gostou, não esqueça de compartilhar com os colegas em grupos de Linux. Este artigo pode ajudar muitas outras pessoas.
Me siga no Instagram onde eu faço conteúdos da minha rotina diária.
Participe dos nossos grupos no Telegram e Facebook! 🙂
Se tiver alguma dúvida ou sugestão de conteúdo, por favor, comente!