Динамически изменяйте имя файла при использовании FFmpeg

Вопрос или проблема

В настоящее время я пытаюсь сжать все свои видеофайлы (размером от 30 ГБ до 500 ГБ) и нашел способ запустить пакетный файл для всех моих файлов в папке, но он постоянно выдает сообщение ‘файл уже существует, перезаписать?[y/N]‘. Однако даже если я нажимаю “да” (так как я все равно буду удалять оригинальные файлы), это не позволяет мне сделать это, так как не может записать файл того же имени. В настоящее время у меня есть следующий код

@echo off
set _compressed=compressed
for %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i "%%i" -vcodec libx265 -crf 24  "%%i%_compressed%.mp4"

Хотя, когда я использую %%i.mp4 или %%~ni.mp4, имя выходного файла не изменяется. Однако мне нужно, чтобы оно изменилось.

Также, как побочный вопрос, как я могу заставить ffmpeg видеть подпапки, а не только папку, в которой он находится?

@echo off

:: set   0=compressed  ❌
   set _x=compressed" ✅

:: for %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i  "%%i" -vcodec libx265 -crf 24  "%%i%0.mp4"     ❌
   for %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i "%%~i" -vcodec libx265 -crf 24  "%%~ni%_x%.mp4" ✅

Вы используете %0 как переменную, но в пакетном скрипте %0 интерпретируется как имя самих файлв пакета, включая путь, если он указан.

Избегайте использования чисел в качестве имен переменных. %0, %1, %2 и т. д. считаются аргументами: %0 относится к файлу пакета, в то время как %1, %2 и т. д. относятся к аргументам #1, #2 и так далее. Избегайте использования чисел в качестве имен переменных и также избегайте создания имен переменных, начинающихся с чисел.


Что касается использования расширений для имен файлов в цикле: "%%~ni%_x%.mp4" развертывает %%~ni в имя файла без расширения, добавляя значение %_x% и .mp4.

Познакомьтесь и используйте Расширения параметров правильно…

%~f1  Развернуть %1 в полностью квалифицированное имя пути - C:\utils\MyFile.txt
%~d1  Развернуть %1 в только букву диска - C:
%~p1  Развернуть %1 только в путь, например, \utils\, включая завершающий 
      \, который будет интерпретироваться как символ экранирования некоторыми командами.  
%~n1 Развернуть %1 в имя файла без расширения или пути - MyFile  
      или, если присутствует только путь без завершающего обратного слэша, последний каталог в этом пути.  
%~x1  Развернуть %1 только в расширение файла - .txt  
%~s1  Изменить значение f, n, s и x так, чтобы они ссылались на короткое имя 8.3 (если оно существует.)  
%~1   Развернуть %1, удаляя любые окружающие кавычки (")  
%~a1  Показать атрибуты файла %1  
%~t1  Показать дату/время %1

@echo off

set "_x=compressed"

for %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i "%%~i" -vcodec libx265 -crf 24  "%%~ni%_x%.mp4"

:: или ...
for %%i in (*.mkv, *.mp4, *.mov) do ffmpeg -i "%%~i" -vcodec libx265 -crf 24  "%%~dpni%_x%.mp4"

Обратитесь к материалам, размещенным по ссылкам.

Ответ или решение

Конечно! Давайте подробно рассмотрим вашу задачу по изменению имен файлов при использовании FFmpeg для сжатия видеофайлов. Вы столкнулись с проблемой, когда FFmpeg пытается перезаписать существующий файл, и это вызывает проблемы. Важно понять, как правильно настраивать имена выходных файлов для избежания конфликтов, а также как обрабатывать файлы в подпапках.

Решение задачи

  1. Изменение имени выходного файла:
    Вы правильно отметили, что используете %0, что является именем вашего сценария, а не переменной. Вместо этого замечу, что вы можете использовать переменные, которые являются более интуитивными. Например, мы можем использовать переменную _x для обозначения части имени файла.

    Чтобы правильно записать выходные имена файлов, используйте следующую конструкцию:

    @echo off
    set "_x=_compressed"
    for %%i in (*.mkv *.mp4 *.mov) do (
       ffmpeg -i "%%~i" -vcodec libx265 -crf 24 "%%~ni%_x%.mp4"
    )

    Здесь %%~ni возвращает имя файла без расширения, и мы добавляем новый суффикс _compressed перед расширением .mp4.

  2. Поиск файлов в подпапках:
    Чтобы обработать файлы в подпапках, вы можете использовать следующую конструкцию:

    @echo off
    set "_x=_compressed"
    for /r %%i in (*.mkv *.mp4 *.mov) do (
       ffmpeg -i "%%~i" -vcodec libx265 -crf 24 "%%~dpi%%~ni%_x%.mp4"
    )

    Здесь /r в команде for позволяет рекурсивно проходить по всем подкаталогам, а %%~dpi выдаст путь к директории, содержащей исходный файл.

Примечания

  • Убедитесь, что у вас установлена последняя версия FFmpeg и что путь к нему добавлен в переменные окружения, чтобы ваш сценарий мог успешно вызывать его из командной строки.
  • Обязательно протестируйте скрипт на небольшом наборе файлов, прежде чем выполнять его на большом количестве, чтобы избежать нежелательных потерь данных.

Заключение

Пользуясь вышеизложенными примерами, вы сможете динамически менять имена файлов, избегать перезаписи и обрабатывать видео в подкаталогах. Убедитесь в корректности написанного скрипта, и это поможет вам успешно сжать ваши видеофайлы без проблем с перезаписью. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...