Agregar muchos sonidos a un archivo de video en cuadros específicos

Tengo un video de un TAS que he creado que lamentablemente no contiene sonido. Me gustaría agregar sonido al video antes de lanzarlo, pero obviamente no quiero tener que revisar y colocar cientos o miles de sonidos manualmente.

Aquí se puede ver un ejemplo de un producto terminado, con todos los sonidos presentes agregados manualmente:

Puedo modificar el código fuente del juego, por lo que es trivial crear una lista de fotogramas exactos en los que se reproducen los sonidos. Actualmente estoy usando Adobe Premiere Pro CC 2015, pero estoy feliz de cambiar a otro software si me proporciona la funcionalidad que quiero.

Parece que FFmpeg puede hacer lo que quiero, pero no sé lo suficiente sobre su uso y no he podido encontrar ningún ejemplo de cómo usarlo para lo que quiero hacer. También preferiría no crear un complemento (y no he podido encontrar ninguna información sobre secuencias de comandos) para Premiere ni nada por el estilo, aunque prefiero hacerlo manualmente.

¡Gracias por adelantado!

¿Cuántos sonidos diferentes? ¿Y puede generar un índice de cuadro separado para cada sonido único?
Diría probablemente 8-12 sonidos que quiero agregar. Un índice de marco separado es definitivamente posible.

Respuestas (1)

Muy bien, ¡buscando más en Google encontré que ffmpeg es definitivamente la solución a mi problema!

ffmpeg -i inputvideo.mp4 -i inputsound.wav -filter_complex "[1:0]adelay=leftchanneldelay|rightchanneldelay[delayed];[0:1][delayed]amix[mixout]" -map 0:v -map [mixout] -c:v copy -c:a aac outputvideo.mp4

Esta línea me permite determinar fácilmente en qué parte del video (hasta el milisegundo, que es lo suficientemente preciso con cada cuadro equivalente a 20 milisegundos) deseo colocar el sonido; envuélvalo en un bucle dentro de un archivo por lotes (o el método que prefiera) y listo.

Editar: una solución más completa escrita en Java, que solo crea el archivo de audio (para permitirle agregarlo manualmente):

package javaapplication4;

import java.io.IOException;

public class JavaApplication4 {
static String delay;

public static void main(String[] args) throws IOException, InterruptedException {
    String a = "0";
    String c = "1";
    String temp = "";
    String basePath = "C:\\Users\\Desktop\\Stuff\\FFMpeg\\";
    String fileIn = "blockbreak";
    int[] delays = {2740,5760,51381,61040,84520,109600,113660,156640,311260,312820,314100,443800,735120,740540};
    Runtime.getRuntime().exec(basePath + "ffmpeg.exe -y -i " + basePath + fileIn +".flac -filter_complex \"[0:0]adelay=" + delays[0] + "[mixout]\" -map [mixout] -c:a flac " + basePath + "output0.flac").waitFor();
    for (int i = 1; i <= delays.length - 1; i++) {
        delay = "" + delays[i];
        System.out.println("" + (i) + "/" + (delays.length - 1));
        Runtime.getRuntime().exec(basePath + "ffmpeg.exe -y -i " + basePath + "output" + a + ".flac -i " + basePath + fileIn +".flac -filter_complex \"[1:0]adelay=" + delay + "[delayed];[delayed][0:0]amix=inputs=2:duration=longest[mixin];[mixin]volume=6.0201dB[mixout]\" -map [mixout] -c:a flac " + basePath + "output" + c + ".flac").waitFor();
        temp = a;
        a = c;
        c = temp;
    }

}

}

Aumento el volumen del sonido en 6.021db cada vez que ffmpeg parece bajar el volumen al codificar; este no es un número perfecto, pero está lo suficientemente cerca como para que la diferencia de volumen entre el primer y el último sonido en un archivo que tiene unos pocos miles de sonidos termina siendo alrededor de 1 db.

Será más rápido construir primero la pista de audio y luego mezclarla con el video. Con su comando, pasará mucho más tiempo volviendo a envolver el video.