Вопрос или проблема
как закодировать несколько видеофайлов (разные типы)
в одной главной папке с несколькими подпапками
в h265 с новым именем?
я нашел это:
@echo off
set "_x=сжатый"
for /r %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i "%%~fi" -vcodec libx265 -crf 24 "%%~dpni%_x%.mp4"`
НО эта команда также кодирует первый обработанный файл снова,
из
оригинал.mkv
в
оригинал_сжатый
и снова в:
оригинал_сжатыйсжатый
как этого избежать? запустить каждый найденный файл, каким бы он ни был – mkv или mp4 или avi – только один раз?
Ответ или решение
Как кодировать несколько видеофайлов в нескольких папках: Подробное руководство
В данном руководстве мы рассмотрим, как эффективно кодировать множество видеофайлов, расположенных в одной главной папке с несколькими подкаталогами, в формат H.265. Мы также должны убедиться, что каждый файл обрабатывается только один раз, избегая повторной обработки уже закодированных файлов.
Задача
Необходимость заключается в том, чтобы взять видеофайлы различных форматов (например, .mkv, .mp4, .mov) и закодировать их в формате H.265, сохранив определенный шаблон имени для выходных файлов, например, добавив суффикс "_compressed".
Однако вы столкнулись с проблемой, когда один из файлов обрабатывается дважды, что приводит к созданию некорректного имени (например, original_compressedcompressed
). Давайте решим эту задачу.
Подход к решению
-
Использование FFMPEG: FFMPEG — это мощный инструмент для обработки видео, который позволит нам выполнять конвертацию из одного формата в другой.
-
Структура скрипта: Мы будем использовать командный файл (.bat), который будет рекурсивно обрабатывать файловую структуру.
-
Проверка существования выходного файла: Прежде чем кодировать файл, мы должны проверить, существует ли уже выходной файл. Если он существует, мы пропустим кодирование для этого файла.
Скрипт для кодирования видеофайлов
Вот пример командного скрипта, который поможет вам выполнить задачу:
@echo off
setlocal enabledelayedexpansion
set "_x=_compressed"
rem Рекурсивный поиск видеофайлов в подкаталогах
for /r %%i in (*.mkv *.mp4 *.mov) do (
set "input_file=%%~fi"
set "output_file=%%~dpni%_x%.mp4"
rem Проверяем существует ли уже выходной файл
if not exist "!output_file!" (
ffmpeg -i "!input_file!" -vcodec libx265 -crf 24 "!output_file!"
) else (
echo Файл "!output_file!" уже существует, пропуск кодирования.
)
)
endlocal
Пояснение к скрипту
-
Параметры:
setlocal enabledelayedexpansion
позволяет изменять переменные внутри циклов. -
Цикл по файлам: Используя
for /r
, мы ищем все файлы с нужными расширениями (.mkv, .mp4, .mov) рекурсивно. -
Формирование имен файлов:
input_file=%%~fi
— это полный путь к обрабатываемому файлу.output_file=%%~dpni%_x%.mp4
— это полный путь к выходному файлу с добавленным суффиксом "_compressed".
-
Проверка на существование: Условие
if not exist "!output_file!"
проверяет, существует ли уже выходной файл.- Если файл не существует, выполняется кодирование с помощью FFMPEG.
- Если файл существует, выводится сообщение о пропуске.
Заключение
Используя предложенный скрипт, вы сможете эффективно и корректно кодировать видеофайлы из множества подпапок в один главный каталог, избегая повторной обработки и создания ошибочных имён файлов. Надеюсь, данное решение поможет вам в вашей работе!