Вопрос или проблема
Существует несколько решений для выбора каждого нечетного или четного изображения на уровне фильтра, и все они работают. Но в моем случае у меня есть входные файлы .jpg размером 15360×8640, где имеет значение, подаю ли я все изображения и отбрасываю каждое второе в фильтре или пропускаю каждое второе входное изображение. Это значительно ускорит кодирование.
Мой обычный ввод (для файлов с числовыми именами из пяти цифр, работающих на Windows 10 x64):
ffmpeg.exe -framerate 60 -i %05d.jpg -vcodec libx264 out.mkv
Что я пробовал (взято из этой темы, может работать только на Linux, но я не мог проверить):
ffmpeg.exe -framerate 60 -i %04d%[13579%].jpg -vcodec libx264 out.mkv
и различные варианты с и без опций glob и так далее. Все не удались. Всегда приводят к “%04d%[13579%].jpg: Нет такого файла или каталога” или чему-то подобному.
Рабочий пример для каждого десятого кадра (т.е. 00001 00011 00021 и т.д.).
ffmpeg.exe -framerate 60 -i %04d1.jpg -vcodec libx264 out.mkv
Кто-нибудь уже решил эту проблему или есть новая идея?
В настоящее время решение в два этапа.
Создайте список:
dir *1.jpg *3.jpg *5.jpg *7.jpg *9.jpg /b /on | c:\prog\unix\sed "s/^/file /" > "!list.txt"
Используйте список:
ffmpeg.exe -r 60 -f concat -safe 0 -i "!list.txt" -vcodec libx264 out.mkv
Плюсы: Экономит мне около терабайта на то, чтобы иметь копию этих файлов под другим именем как входные или время декодирования на уровне ввода. Почти в 1.5 раза быстрее по сравнению с конвертацией на уровне фильтра с моими огромными файлами .jpg как входные.
Минусы: Кажется, требует больше оперативной памяти, чем использование на уровне фильтра, но почему?
У кого-то есть лучшее решение?
Ответ или решение
Рассмотрим проблему, изложенную в вопросе, с точки зрения теории, примеров и применения технологий. На основе предоставленной информации задача заключается в оптимизации процесса обработки изображений с использованием FFmpeg, исключая каждое второе изображение на этапе ввода, чтобы ускорить процесс кодирования. Особенно важно это в ситуации, когда обрабатываются изображения высокого разрешения (15360×8640), что делает требования к вычислительным ресурсам и времени особенно строгими.
Теория
FFmpeg — это мощный, но довольно сложный инструмент командной строки для обработки мультимедиа. Одной из его многочисленных возможностей является обработка последовательностей изображений для их преобразования в видеофайлы. В типичной ситуации вы бы использовали шаблон с подстановочными знаками для работы с последовательностями, например, %05d.jpg
, где %05d
— это форматный спецификатор, означающий, что ожидаются изображения с нумерацией в пять цифр (например, 00001.jpg
, 00002.jpg
и т. д.).
Однако, если вы хотите обработать только изображения с нечетными номерами (например, 00001.jpg
, 00003.jpg
, 00005.jpg
и так далее), стандартный подход FFmpeg, заключающийся во включении всех изображений и последующем их фильтрации на уровне фильтров, становится неэффективным. Именно поэтому вы рассматриваете возможность оптимизации на этапе ввода, чтобы избежать лишних операций и сэкономить ресурсы.
Пример
Применение FFmpeg к обработке только нечетных изображений на этапе ввода возможно, но требует более продвинутого подхода к управлению файлам. На Windows, стандартные приемы Unix, такие как обобщенные глобальные выражения (например, %04d%[13579%].jpg
), как правило, не работают из-за разницы в интерпретации командной строки между разными ОС.
Следовательно, вы нашли способ создать список файлов вручную, как это видно в вашем примере с использованием команды dir
.
dir *1.jpg *3.jpg *5.jpg *7.jpg *9.jpg /b /on | sed "s/^/file /" > "!list.txt"
Эта команда выполнит обход директории, отбирая файлы с соответствующими номерами, и сохранит их список в list.txt
. Затем этот список используете в FFmpeg:
ffmpeg.exe -r 60 -f concat -safe 0 -i "!list.txt" -vcodec libx264 out.mkv
Этот подход эффективен для управления ресурсами, хотя и увеличивает требования к использованию оперативной памяти, поскольку FFmpeg пытается оптимизировать доступ к файлам.
Применение
Для более эффективной работы можно рассмотреть использование скриптового подхода, например, посредством скриптов Batch в Windows или более развитых решений, таких как Python. Пример:
import os
# Создаем список нужных файлов
files = [f for f in os.listdir('.') if f.endswith('.jpg') and int(f[:5]) % 2 == 1]
# Записываем их в текстовый файл
with open('list.txt', 'w') as f:
for file in sorted(files):
f.write(f"file '{file}'\n")
# Выполняем FFmpeg
os.system('ffmpeg.exe -r 60 -f concat -safe 0 -i list.txt -vcodec libx264 out.mkv')
Используя такую автоматизацию, вы можете сэкономить еще больше времени, избегая ручных операций и улучшив управление файлами. Также стоит отметить, что применение Python позволяет значительно упростить кроссплатформенную совместимость.
Заключение
Оптимизация ввода изображений в FFmpeg при работе на платформе Windows требует нестандартного подхода ввиду ограничений системных команд. Лучшие результаты достигаются за счет предварительной подготовки списков файлов для последующей обработки. Таким образом, предоставленный двухшаговый подход вполне оправдан в контексте ограничения ресурсов и времени, предоставляя значительное улучшение по сравнению с изначально предложенной методологией работы с фильтрами на уровне FFmpeg.