ffmpeg перезаписывает входные файлы при вызове в цикле forfiles

#windows #batch-file #cmd #ffmpeg #forfiles

#Windows #пакетный файл #cmd #ffmpeg #forfiles

Вопрос:

Мне нужно объединить несколько пар файлов mp4 и wav с помощью ffmpeg.

Когда я запускаю команду, указывающую имена файлов, она работает хорошо:

.ffmpeg.exe -i file01.mp4 -i file01.wav -c:v copy -c:a aac -b:a 96k file01_new.mp4

Но когда я интегрирую этот вызов в цикл forfiles, исходный файл mp4 перезаписывается, а выходной файл mp4 содержит только аудио:

forfiles /M "*.mp4" /C ".ffmpeg.exe -i @FNAME.mp4 -i @FNAME.wav -c:v copy -c:a aac -b:a 96k @FNAME_new.mp4"

Я не совсем понимаю, что происходит до объединения файлов MP4 и WAV. Почему перезаписывается исходный MP4?

Как мне написать этот скрипт, чтобы он работал? Спасибо за вашу поддержку.

Комментарии:

1. Я думаю, проблема в том, что данный шаблон *.mp4 также охватывает выходные файлы *_new.mp4 , поэтому они тоже обрабатываются; вы могли бы попытаться поместить выходные файлы в отдельный подкаталог: 2> nul md "result" amp; forfiles /M "*.mp4" /C "cmd /C if @isdir==FALSE ffmpeg.exe -i @FNAME.mp4 -i @FNAME.wav -c:v copy -c:a aac -b:a 96k result@FNAME_new.mp4"

2. Спасибо. Я уже пытался использовать подкаталог для сгенерированных файлов MP4. Это ничего не меняет. Проблема возникает при первом обнаруженном файле MP4, даже до вызова FFMPEG. И это не объясняет, почему исходные файлы используются в качестве целевых. Если мы будем следовать этой логике, у меня должен быть file01.mp4, который генерирует file01_new.mp4, который генерирует file01_new_new.mp4 и так далее.

3. Добавьте отчет в ffmpeg cmd и поделитесь журналом одного из запусков выполнения ffmpeg.

4. Тогда не используйте forfiles , используйте for вместо этого: 2> nul md "result" amp; for %%I in ("*.mp4") do ffmpeg.exe -i "%%~I" -i "%%~nI.wav" -c:v copy -c:a aac -b:a 96k "result%%~I"

5. Спасибо @aschipfl. Я подтверждаю, что это предложение отвечает на мой вопрос.

Ответ №1:

Позвольте мне рекомендовать использовать for вместо forfiles , потому что последний довольно медленный, и он расширяет свои @ переменные окружающими кавычками, что может быть проблематично:

 rem // Create sub-directory for resulting files, so resulting files cannot become reprocessed:
2> nul md "result"
rem // Loop through `*.mp4` files:
for %%I in ("*.mp4") do (
    rem /* Process current file, together with the related `*.wav` file,
    rem    and write the result into the new sub-directory: */
    ffmpeg.exe -i "%%~I" -i "%%~nI.wav" -c:v copy -c:a aac -b:a 96k "result%%~I"
)