Вопрос или проблема
Я пытаюсь использовать ffmpeg для конкатенации нескольких video файлов, используя пример сохранения всех файлов, предоставленных в файл с здесь (под Автоматическая генерация входного файла
), с помощью цикла for. Файл успешно создан в том месте, где я хотел, но при выполнении команды вывод сообщает: Небезопасное имя файла '"C:\Users\Mr. Mendelli\Desktop\Track 1.mp4"'
. Содержимое моего индексного файла выглядит следующим образом:
file '"C:\Users\Mr. Mendelli\Desktop\Track 1.mp4"'
file '"C:\Users\Mr. Mendelli\Desktop\Track 2.mp4"'
Я полагаю, что проблема в том, что пути к файлам обрамлены двойными кавычками, но я не могу понять, как избавиться от них в примере использования цикла for. Я пробовал их пример с обрамлением одинарными кавычками %%i
и без него, но безрезультатно:
...
(
for %%i in (
%*
) do @echo file '%%i') > "%temp%\FileIndex"
...
В дополнение, если только не существует альтернативного подстановочного знака, я использую %*
, так как использование этого скрипта может потребовать два или более файлов, не гарантируя, что я всегда буду объединять только два.
Обновление:
Я выяснил проблему, хотя все еще не могу решить ее в своем коде:
- Пути к файлам должны быть обрамлены только одинарными кавычками.
- Разделители путей должны быть прямыми слешами, а не обратными, даже на Windows.
Как мне гарантировать, что одинарные кавычки и прямые слеши будут напечатаны в FileIndex
в моем пакетном скрипте?
Я не думаю, что это связано с двойными кавычками, это связано с полными путями к файлам (а не относительными именами файлов).
Смотрите https://www.ffmpeg.org/ffmpeg-formats.html#Options:
Путь к файлу считается безопасным, если он не содержит спецификации протокола и является относительным
Вы можете просто игнорировать “Проверку безопасности” FFmpeg, добавив -safe 0
к команде FFmpeg. Это широко используется и в целом не должно вызывать никаких проблем.
Я случайно ответил на свой собственный вопрос ранее в моем коде, который я упустил с циклом for, который перечисляет все файлы, предоставленные скрипту, и это так же просто, как добавить один символ в существующую переменную. Использование %%~i
стало ключом, так как оно не включает двойные кавычки в пути к файлам, обрабатываемым в цикле.
...
(
for %%i in (
%*
) do @echo file '%%~i') > "%temp%\FileIndex"
...
Ответ или решение
Для того чтобы использовать FFmpeg для конкатенации нескольких видеофайлов и избежать проблемы с обрамлением путей к файлам кавычками, важно правильно сформировать содержимое вашего файла-индекса. В данном ответе мы рассмотрим, как это можно сделать, а также обеспечим правильное форматирование путей к файлам.
Шаги по созданию файла-индекса без обрамления кавычками
-
Использование переменной
%%~i
: Как вы уже заметили, использование конструкции%%~i
в циклеfor
позволяет использовать путь к файлу без обрамляющих кавычек. Это означает, что вам не нужно дополнительно заботиться о кавычках, которые могут быть не нужны в вашем случае. -
Правильное форматирование пути: FFmpeg требует, чтобы пути к файлам были указаны с использованием одинарных кавычек и прямых слэшей. Поэтому мы должны замещать обратные слэши на прямые. Это можно сделать с помощью команды
setlocal enabledelayedexpansion
и обработки каждого пути в цикле.
Пример кода
Вот пример полного кода в рамках пакетного файла, который создает файл-индекс с правильным форматированием:
@echo off
setlocal enabledelayedexpansion
(
for %%i in (%*) do (
set "filepath=%%~i"
rem Замена обратных слэшей на прямые
set "filepath=!filepath:\=/!"
echo file '!filepath!'
)
) > "%temp%\FileIndex.txt"
echo Файл-индекс успешно создан: %temp%\FileIndex.txt
Объяснение кода
-
setlocal enabledelayedexpansion
: Эта команда позволяет использовать!var!
для доступа к переменным внутри блокаfor
, что критично для изменения значений переменных в пределах цикла. -
set "filepath=%%~i"
: Сохраняет путь к файлу без обрамляющих кавычек в переменнойfilepath
. -
set "filepath=!filepath:\=/!"
: Заменяет все обратные слэши на прямые, что делает путь совместимым с требованиями FFmpeg. -
echo file '!filepath!'
: Печатает строку форматаfile '...'
в файл-индекс, используя одинарные кавычки.
Общие рекомендации
-
Проверка на безопасность: Хотя вы можете использовать параметр
-safe 0
в команде FFmpeg, чтобы игнорировать проблемы с безопасностью путей, удобнее и надежнее предварительно отформатировать пути в вашей программе. -
Обращение к документации: Всегда стоит обращаться к официальной документации FFmpeg для получения наиболее актуальных требований и рекомендаций.
Теперь вы сможете с легкостью генерировать список файлов для объединения с FFmpeg, избегая проблем с кавычками и форматом путей.