¿Cómo cambiar el nombre del archivo de salida en el lote ffmpeg?

Estoy usando Windows y ffmpeg para convertir video mp4 en audio mp3. Se me ocurrió la siguiente línea de lote que hará el trabajo:

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

Sin embargo, la %fvariable captura el nombre de archivo completo con la extensión, por lo que mi salida se parece a filename.mp4.mp3. Prefiero que se parezca filename.mp3.

He probado todo tipo de corchetes y métodos de truncamiento que conozco, pero no puedo hacer que nada funcione.

¿Cómo puedo cambiar los nombres de archivo en una conversión por lotes de ffmpeg en Windows?

Para los usuarios que buscan una solución de Linux, consulte Conversión por lotes en una nueva carpeta con ffmpeg .

Respuestas (2)

Puede extraer el nombre del archivo directamente del forparámetro de reemplazo. No es necesario establecer una nueva variable en absoluto.

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

Si desea hacer un munging de cadenas más complicado , es mucho más intuitivo en Powershell:

ls *.mp4|foreach{
    ffmpeg -i $_ -vn -ar 44100 -ac 1 -b:a 32k -f mp3 $_.name.replace("mp4", "mp3")
}
Para la primera solución, diceset was unexpected at this time.
La opción Powershell parece funcionar. Tal vez solo use eso. Gracias.
Diablos, error tipográfico. Estaba en mi Mac, así que no pude probarlo. Arreglado ahora.
Ahora aparece el nombre del archivo de salida %outfile.mp3. Se ejecuta, lo que sin duda está más cerca, pero el nombre del archivo de salida no funciona.
Otro error tipográfico. Ha pasado un tiempo desde que usé secuencias de comandos por lotes: hago todo en zsh y powershell. Inténtalo de nuevo si quieres, con suerte debería funcionar ahora.
Lo siento, pero todavía no funciona. Solo estoy en Windows normal cmd.exe, también conocido como "línea de comando". sale el archivo %outfile%. No tienes que seguir trabajando en esto si no quieres; Estoy contento con la solución de Powershell. Si tuviera que adivinar, la outfilevariable no se está configurando o llamando correctamente, o ambas cosas. O, %fen este contexto, no es una cadena del nombre, que es como estamos tratando de usarlo. Es un puntero al archivo.
Los chicos de SO lo descubrieron. Una solución elegante. He puesto una edición sugerida. El código for %f in (*.mp4) do ffmpeg -i "%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%~nf.mp3"funciona.

Para agregar a la respuesta de stib , también puede poner este comando en un archivo por lotes simple. Simplemente guarde el código a continuación en un .batarchivo, mueva el archivo a la carpeta en la que desea trabajar, luego haga doble clic para ejecutarlo. Esto supone que ha descargado y configurado 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

Observe que las %fvariables ahora son %%f. Esta es una convención de archivos por lotes y es obligatoria. El script no se ejecutará si esto no se modifica. titleEs exactamente eso: el título del guión. remes la abreviatura de "comentario": es un comentario y también puede cambiarlo. Ninguna línea es realmente necesaria.