#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"
)