Como usar o script Bash para encontrar arquivos .mov recursivamente e convertê-los para .mp4 usando o ffmpeg

2

Estou trabalhando em um sistema Mac em uma empresa de vídeo, onde tenho que limpar muitas pastas e subpastas que contêm arquivos de vídeo intermediários grandes.

Então eu estive procurando uma maneira de converter muitos arquivos .mov em h.264 arquivos .mp4 usando o ffmpeg. Eu encontrei vários códigos para fazer um lote converter usando um script semelhante ao

for f in '*.mov';
   do ffmpeg -i $f -c:v libx264 -f mp4 "${%f.mov}.mp4" ; 
done

No entanto, isso só funciona na pasta atual em que o script é executado, enquanto eu estou procurando uma maneira de encontrar arquivos .mov recursivamente e lote converter todos eles.

No momento, a solução que funciona para mim parece um pouco de força bruta; Eu estou apenas usando o find e execute o ffmpeg;

 find . -name '*.mov' -type f -exec ffmpeg -i {} -c:v libx264 -f mp4 {}.mp4 

No entanto, um dos problemas que estou tendo, é que eu não consigo substituir o .mov por .mp4 nessa formatação, então a saída irá adicionar .mp4 ao {}, com arquivos terminando como * .mov.mp4

Além disso, acredito que essa não seja a maneira mais segura ou mais agradável de processar um lote.

Eu queria saber se existe uma maneira mais segura ou menos terminal-terminal de criar um lote para o ffmpeg, que pode até resolver meu problema de nomeação ou uma maneira de fazer o comando 'for f in * mov' encontrar vídeos recursivamente até 5 + pastas profundas.

Qualquer ajuda seria muito apreciada.

    
por JasonD 16.12.2015 / 10:01

2 respostas

2

Aqui está um script bash simples que fará o que você quiser (eu acho): 1) encontrar recursivamente todos os arquivos MOV e convertê-los, 2) substituir corretamente a extensão de arquivo .mov com uma extensão de arquivo .mp4.

#!/bin/bash
while read mov; do
  mp4=$(echo "$mov"|sed -e 's|\.mov$|.mp4|i')
  if [ "$mov" == "$mp4" ]; then
    echo "Failed to generate unique MP4 filename for file $mov"
    exit 1
  fi
  echo ffmpeg -i "$mov" -c:v libx264 -f mp4 "$mp4"
done < <(find . -type f -iname '*.mov')

Como escrito, isso não fará a conversão, apenas ecoa o comando ffmpeg que será executado. Quando tiver certeza de que fará o que quiser, simplesmente remova o "echo" da frente do comando ffmpeg.

    
por 30.03.2016 / 16:44
0

isso ajuda?

for i in 'find . -name "*.mov" -print0| xargs -0'; do echo ffmpeg -i $i -c:v libx264 -f mp4 ${i%.mov}.mp4; done

remova o eco se você estiver satisfeito com o comando ffmpeg que é gerado.

isso leva em conta nomes de arquivos contendo um ou mais espaços (via -print0 e xargs -0)

    
por 30.03.2016 / 17:06