Conversão em lote de arquivos * .avi usando ffmpeg

13

Estou tentando converter mais de 20 arquivos .avi em um lote usando ffmpeg.

Eu tenho o seguinte

@echo off.

for file in *.avi
do
   ffmpeg -i "$file" -s 640x480 -vcodec msmpeg4v2 "'basename "$file" .avi'.mpg';
done

no meu arquivo .bat, mas ele não funciona. Como posso fazê-lo funcionar no sistema operacional Windows. Ah, e sim, todos os arquivos estão na mesma pasta.

A mensagem de erro que recebo:

O arquivo estava inesperado no momento

Darius
fonte
E o que exatamente não funciona sobre isso?
slhck 5/09/12
Se você puder me indicar como receber a mensagem de erro, uma vez que o cmd desaparece muito rápido, poderei lhe dizer com o que estou tendo problemas.
Darius
Você deve conseguir abrir uma janela de comando antes ( Iniciar »Executar ...»cmd ) e depois executar o arquivo em lotes usando seu caminho completo a partir daí. O que você realmente quer fazer com os vídeos? Que tipo de vídeos são esses? Você só precisa movê-los para um contêiner MPG? Ou você precisa redimensioná-los? Ou você precisa especificamente do msmpeg4v2codec?
slhck 5/09/12
Os arquivos são retirados de um DVR e têm mais de 1 GB de clipes de 5 minutos. Sim, o software DVR é patético na compressão. O codec funciona, pois leva arquivos de 1 GB a arquivos de aproximadamente 7 MB, que são mais gerenciáveis. E ao tentar executar esse lote, recebo a mensagem "Arquivo inesperado no momento".
Darius
Entendo. Se você não se importa com o codec e o container de vídeo resultantes, sugiro usar o x264 como um codificador, o que resulta em uma qualidade muito melhor do que o MPEG-4. O comando seria algo como ffmpeg -i input.avi -c:v libx264 -crf 23 -s 640x480 output.mp4onde o valor do CRF define a qualidade (menos é melhor, mais é pior, valores sensatos de 19 a 24). Consulte também: Converta vídeos antigos em tamanhos menores e Quais parâmetros devo observar para reduzir o tamanho de um arquivo .MOV?
slhck 5/09/12

Respostas:

26

Seu arquivo em lotes não está no formato correto para um script básico do Windows. Em vez disso, seu script parece ter sido destinado ao Linux. Você precisará alterar o script para usar um loop for suportado pelo Shell do Windows.

Abaixo está um exemplo de como realizar essa tarefa usando um loop for windows. Basta colocar a linha abaixo no seu arquivo em lotes e mover o script para o mesmo diretório que os arquivos avi e, em seguida, executá-lo.

for %%A IN (*.avi) DO ffmpeg -i "%%A" "%%A.mpg"
Brett
fonte
Com isso eu recebo[NULL @ 000000000037e360] Unable to find a suitable output format for 'outputfile.avi.mpg;' outputfile.avi.mpg:: Invalid argument
Darius
1
Necessidade de remover esse ponto e vírgula a partir da extremidade da linha
Brett