ffmpeg sobrescribe los archivos de entrada cuando se llama en un bucle forfiles

Necesito unir varios pares de archivos mp4 y wav usando ffmpeg.

Cuando ejecuto el comando especificando los nombres de los archivos, funciona bien:

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

Pero cuando integre esta llamada en un bucle forfiles, el archivo mp4 fuente está sobrescrito y el archivo mp4 de salida contiene sólo el audio:

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

Realmente no entiendo lo que pasa antes de que se unen los archivos MP4 y WAV. ¿Por qué la fuente MP4 está siendo sobrescrito?

¿Cómo escribo este guión para que funcione? Gracias por su apoyo.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebarde61c


3 Respuestas:

  • Permítanme recomendar que use for en lugar de forfiles, porque este último es bastante lento y expande su @-variables con las citas circundantes, que podrían ser problemáticas:

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

    Respondida el Dec 17, 2020 a las 22:02 - por scriptsorcerer4f7e

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando al ejecutar ffmpeg en un bucle forfiles se debe a que el comando de ffmpeg se está ejecutando de manera incorrecta dentro del bucle.

    Dentro del bucle forfiles, cada vez que se procesa un archivo, se ejecuta el comando indicado en la misma línea de comandos del bucle. En tu caso, el comando de ffmpeg no se está ejecutando correctamente dentro del bucle, lo cual está causando la sobrescritura del archivo mp4 de origen.

    Para solucionar este problema, debes modificar tu script de forma que el comando de ffmpeg se ejecute de manera adecuada dentro del bucle forfiles. Puedes intentar lo siguiente:

    batch
    forfiles /M "*.mp4" /C ".\ffmpeg.exe -i @file -i @file.wav -c:v copy -c:a aac -b:a 96k @fname_new.mp4"
    

    En este comando, utilizamos las variables @file y @fname proporcionadas por forfiles para referenciar los archivos mp4 de entrada y sus nombres respectivamente. Con esto, deberías poder unir los archivos mp4 y wav correctamente sin sobrescribir los archivos de origen.

    Por favor, inténtalo y házmelo saber si tienes alguna otra pregunta. ¡Suerte!

    Respondida el Dec 18, 2020 a las 22:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Cuando utilizas forfiles para iterar sobre archivos y ejecutar comandos en ellos, el comando se ejecuta en la misma línea de comandos que forfiles. Esto significa que cualquier cambio realizado en los archivos por el comando afectará a los archivos originales, incluso si usas un nombre de archivo diferente para el archivo de salida.

    En tu caso, el comando ffmpeg está sobrescribiendo el archivo MP4 de entrada porque estás usando el mismo nombre de archivo para el archivo de salida (@FNAME_new.mp4). Para evitar esto, puedes especificar un nombre de archivo diferente para el archivo de salida, como @FNAME_new.mp4.new.

    Aquí tienes un ejemplo de un script modificado que debería funcionar:

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

    Este script utilizará un nuevo nombre de archivo para el archivo de salida, @FNAME_new.mp4.new, para evitar sobrescribir el archivo MP4 de entrada.

    Respondida el Dec 18, 2020 a las 22:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0