Я пытаюсь использовать FFmpeg для извлечения одного кадра в секунду из каждого файла в каталоге.
Я использую эту команду для отдельных файлов, но не могу понять, как вместо этого указать каталог:
ffmpeg -i "C:\input\clip1.mp4" -vf fps=1 -qscale:v 2 "C:\output\clip1\clip1A"%d.jpg
В идеале я хочу, чтобы кадры сохранялись в отдельной папке, как показано ниже, но ядуматьЯ могу сам разобраться с этой частью. Все в порядке, если они все будут выводиться в одну и ту же папку с одинаковым префиксом и последовательной нумерацией.
C:\output\clip1\clip1-001.jpg
,clip1-002.jpg
C:\output\clip2\clip2-001.jpg
,clip2-002.jpg
Я пытаюсь уже много часов, но все еще полностью потерян. Любая помощь была бы крайне признательна.
решение1
Готово! Этот код выведет кадры в папки с тем же именем, что и видео, из которого они взяты. Кадры будут иметь префикс в виде имени видео и суффикс в виде последовательных номеров, начиная с 001. Так что для моих файлов он выдает "/clip1/clip1-001.jpg" и т. д.
На всякий случай, если вы, как и я, не понимаете, что делаете, вставьте приведенный ниже код в блокнот, сохраните как «extractframesorwhatever.bat» и запустите из каталога, где находятся ваши клипы.
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Если вы хотите вывести папки в другое место, измените:
If not Exist "%%~nF" MkDir "%%~nF"
Что-то вроде этого:
If not Exist "C:\wherever\%%~nF" MkDir "C:\wherever\%%~nF"
Если вы это сделаете, вам также придется изменить вывод (в моем примере):
%%~nF\%%~nF-%%3d.jpg
к
C:\wherever\%%~nF\%%~nF-%%3d.jpg
Или если вы хотите, чтобы все кадры были в одной папке. Замените первый %%~nF из вывода на ваш предпочтительный каталог. Используя мой пример, это будет переход из C:\wherever\%%~nF\%%~nF-%%3d.jpg в C:\wherever\frames\%%~nF-%%3d.jpg. Вы также захотите либо отредактировать вторую строку, чтобы она указывала на новое местоположение и не создавала кучу ненужных каталогов, либо полностью удалить вторую строку. Если вы удалите вторую строку, вам придется сначала создать эту папку "frames" самостоятельно.
EDIT - Возможно, вам придется удалить все пробелы из имен файлов, прежде чем их можно будет обработать. "Утилита массового переименования" может сэкономить вам много времени.
решение2
Мне нравится этот метод извлечения кадров, он очень удобен. Но когда я использую код, который вы предоставляете:
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Я получаю две выходные папки:
Одно из имени файла (куда я хочу поместить мои изображения) и тестовая папка (куда я действительно помещаю мои изображения).
Я знаю, что так должен работать код, но, возможно, изменения за последние четыре года что-то изменили в том, как этот код работает сейчас. Но на самом деле, в целом, это не СЛИШКОМ неудобно.
Я также добавлю, что для тех, кто хочет делать GIF-файлы более высокого качества, вы можете просто изменить .jpg на .png.
Кроме того, вы можете заставить это работать с любым форматом видео (или, по крайней мере, с несколькими, поскольку я не тестировал это подробно), изменив (.mp4) в (.mkv), который, как я знаю, работает.
Я предполагаю, что все другие форматы видео также будут работать, например (.avi), (.mpeg), (.ts), (.flv) и т.д. -хотя это не проверено.
Но поскольку я, как и автор сообщения, не понимаю этот код, а лишь копирую/вставляю то, что нахожу в сети, и немного экспериментирую с ним, удобно иметь готовые к использованию файлы .bat.
Я просто хотел бы узнать, как исправить создаваемую папку «test» и сделать так, чтобы скриншоты вместо этого помещались в уже созданную папку с таким же именем файла.
Чтобы показать, как я изменил код для работы с другими видеоформатами, я приведу несколько примеров:
Первый пример, который, как я знаю, работает, предназначен для файлов .mkv вместо .mp4, преобразуя скриншоты в .png.
for %%F in (*.mkv) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)
Последний пример ДОЛЖЕН работать для файлов .ts, преобразуя скриншоты в .png.
for %%F in (*.ts) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)