Как изменить имя выходного файла в пакете ffmpeg?

Я использую Windows и ffmpeg для преобразования видео mp4 в аудио mp3. Я придумал следующую пакетную строку, которая выполнит эту работу:

 for %f in (*.mp4); do ffmpeg -i %f -vn -ar 44100 -ac 1 -b:a 32k -f mp3 %f.mp3

Однако %fпеременная фиксирует полное имя файла с расширением, поэтому мой вывод выглядит как filename.mp4.mp3. Я предпочел бы, чтобы это выглядело так filename.mp3.

Я пробовал всевозможные скобки и методы усечения, которые я знаю, но ничего не могу заставить работать.

Как я могу изменить имена файлов при пакетном преобразовании ffmpeg в Windows?

Для пользователей, которые ищут решение для Linux, см. Пакетное преобразование в новую папку с помощью ffmpeg .

Ответы (2)

Вы можете извлечь имя файла непосредственно из forпараметра замены. Нет необходимости устанавливать новую переменную вообще.

for %f in (*.mp4) do ffmpeg -i "%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%~nf.mp3"

Если вы хотите выполнить более сложную работу со строками , в Powershell это гораздо более интуитивно понятно:

ls *.mp4|foreach{
    ffmpeg -i $_ -vn -ar 44100 -ac 1 -b:a 32k -f mp3 $_.name.replace("mp4", "mp3")
}
Для первого решения он говоритset was unexpected at this time.
Вариант Powershell вроде работает. Возможно, я просто использую это. Спасибо.
Дэн, опечатка. Я был на своем Mac, поэтому я не мог его проверить. Исправлено сейчас.
Имя выходного файла теперь выходит %outfile.mp3. Запускается, что конечно ближе, но именование выходного файла не работает.
Еще одна опечатка. Давненько я не использовал пакетный скриптинг - я все делаю в zsh и powershell. Попробуйте еще раз, если хотите, если повезет, это должно сработать сейчас.
Извините, но это все еще не работает. Я просто на обычной винде cmd.exe, она же "командная строка". Выходит файл %outfile%. Вам не нужно продолжать работать над этим, если вы этого не хотите; Я доволен решением Powershell. Если бы я предположил, outfileпеременная не устанавливается или не вызывается правильно, или и то, и другое. Или %fв этом контексте это не строка имени, как мы пытаемся ее использовать. Это указатель на файл.
Ребята из SO разобрались. Элегантное решение. Я внес предложенное редактирование. Код for %f in (*.mp4) do ffmpeg -i "%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%~nf.mp3"работает.

Чтобы добавить к ответу stib , вы также можете поместить эту команду в простой пакетный файл. Просто сохраните приведенный ниже код в .batфайл, переместите файл в папку, с которой вы хотите работать, затем дважды щелкните его, чтобы запустить. Предполагается, что вы загрузили и настроили ffmpeg.

@echo off
title Extract MP3 from MP4 with FFMPEG. 
rem Mono Channel, 32kbps.
for %%f in (*.mp4) do ffmpeg -i "%%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%%~nf.mp3"
pause

Обратите внимание, что %fпеременные теперь %%f. Это соглашение о пакетном файле, и оно является обязательным. Скрипт не запустится, если это не изменить. titleименно это: название сценария. remсокращение от «замечание»: это комментарий, который вы тоже можете изменить. Ни одна из строк на самом деле не нужна.