Extraindo frames de todos os vídeos em um diretório usando FFmpeg

Extraindo frames de todos os vídeos em um diretório usando FFmpeg

Estou tentando usar o FFmpeg para extrair um quadro por segundo de cada arquivo em um diretório.

Eu uso este comando para arquivos individuais, mas não consigo descobrir como inserir um diretório:

ffmpeg -i "C:\input\clip1.mp4" -vf fps=1 -qscale:v 2 "C:\output\clip1\clip1A"%d.jpg

Idealmente, quero que os quadros sejam salvos em sua própria pasta, como abaixo, maspensarEu posso resolver essa parte sozinho. Não há problema se todos forem enviados para a mesma pasta com o mesmo prefixo e numeração sequencial.

C:\output\clip1\clip1-001.jpg,clip1-002.jpg

C:\output\clip2\clip2-001.jpg,clip2-002.jpg

Estou tentando há muitas horas e ainda estou completamente perdido. Qualquer ajuda seria extremamente apreciada.

Responder1

Feito! Este código irá gerar quadros para pastas com o mesmo nome do vídeo de onde vieram. Os quadros serão prefixados pelo nome do vídeo e sufixados por números sequenciais começando em 001. Portanto, para meus arquivos, aparece "/clip1/clip1-001.jpg" etc.

Caso você seja como eu e não tenha ideia do que está fazendo, cole o código abaixo no bloco de notas, salve como "extractframesorwhatever.bat" e execute a partir do diretório onde estão seus clipes.

for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)

Se você quiser enviar as pastas para outro lugar, altere:

If not Exist "%%~nF" MkDir "%%~nF"

Para algo assim:

If not Exist "C:\wherever\%%~nF" MkDir "C:\wherever\%%~nF"

Se você fizer isso, também precisará alterar a saída de (no meu exemplo):

%%~nF\%%~nF-%%3d.jpg

para

C:\wherever\%%~nF\%%~nF-%%3d.jpg

Ou se você quiser todos os quadros em uma pasta. Substitua o primeiro %%~nF da saída pelo diretório de sua preferência. Usando meu exemplo, iria de C:\wherever\%%~nF\%%~nF-%%3d.jpg para C:\wherever\frames\%%~nF-%%3d.jpg. Você também desejará editar a segunda linha para apontar para o novo local e impedir a criação de vários diretórios desnecessários ou remover totalmente a segunda linha. Se você remover a segunda linha, terá que criar primeiro a pasta "frames".

EDIT - Pode ser necessário remover todos os espaços dos nomes dos arquivos antes que eles possam ser processados. O "utilitário de renomeação em massa" pode economizar muito tempo.

Responder2

Gosto deste método de extração de frames, é muito prático. Mas quando eu uso o código que você fornece:

for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)

Eu recebo duas pastas de saída:

Um dos nomes do arquivo (que é para onde quero que minhas imagens vão) e uma pasta de teste (que é para onde minhas imagens vão).

Eu sei que é assim que o código deve funcionar, mas talvez as mudanças nos últimos quatro anos tenham mudado algo na forma como esse código funciona agora. Mas, na verdade, apesar de tudo, não é MUITO inconveniente.

Acrescentarei também, para quem quiser fazer GIFs de maior qualidade, basta alterar .jpg para .png.

Além disso, você pode fazer isso funcionar com qualquer formato de vídeo (ou mais, pelo menos, já que não testei tanto) alterando o (.mp4) em (.mkv), que eu sei que funciona.

Presumo que todos os outros formatos de vídeo também funcionariam, como (.avi), (.mpeg), (.ts), (.flv), etc.embora isso não seja testado.

Mas como sou igual ao OP no sentido de que não entendo esse código, apenas copie/cole o que encontro on-line e brinque um pouco com ele, é útil apenas ter os arquivos .bat prontos para uso.

Gostaria apenas de saber como consertar a pasta "teste" que está sendo criada e fazer com que as capturas de tela vão para a pasta que ela já cria com o nome do arquivo.

Para mostrar como alterei o código para funcionar com outros formatos de vídeo, incluirei alguns exemplos:

O primeiro exemplo, que sei que funciona, é para arquivos .mkv em vez de .mp4, transformando as capturas de tela em .png.

for %%F in (*.mkv) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)

O último exemplo DEVE funcionar para arquivos .ts, transformando as capturas de tela em .png.

for %%F in (*.ts) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)

informação relacionada