Объединение более 32 входных файлов в FFmpeg

Я использую FFmpeg через Node.js через fluent-ffmpeg, чтобы объединить несколько небольших аудиофайлов в один. Каждый из аудио-файлов, которые я объединяю, имеет отложенное время начала (поэтому он не объединяет все при одном запуске и не объединяет). Я могу сделать это успешно, используя aevalsrc=0 а также concat с помощью этого аудио файла, а затем amix все вниз. Однако, хотя я не смог найти ссылку на максимальное количество входных данных в документации, я получил [amix @ 0x3fcd920] Value 78.000000 for parameter 'inputs' out of range [1 - 32] при попытке amix 78 файлов. Очевидно, что существует ограничение в 32 входных файла.

Учитывая это ограничение, я не уверен, как лучше поступить. Я это понимаю amerge существует, но останавливается после наименьшей длины файла, поэтому мне нужно apad все, и я просто проверил это и определил, что amerge имеет ограничение в 64 входных файла, что не всегда соответствует моим потребностям (у меня произвольное количество входов).

Я мог amix 32 файла, сохраните это где-нибудь, amix Еще 32 и т. Д., И amix результаты, достижения. Я бы предпочел не иметь дело с записью временных файлов на диск, чтобы потом их пришлось очистить позже. Я подумал о том, чтобы записать "временные" выходные данные в дуплексные потоки Node и прочитать их в моем последнем микшировании, но я боюсь, что это может быть довольно неэффективным.

Ниже то, что я сейчас делаю. Если это проблема XY и это тупой способ выполнить то, что я хочу, пожалуйста, дайте мне знать.

ffmpeg()
    //INPUTS
    .input('/drummachine/www/audio/bd/bd5025.wav')
    .input('/drummachine/www/audio/bd/bd5025.wav')
    .input('/drummachine/www/audio/bd/bd5025.wav')
    .input('/drummachine/www/audio/sd/sd5025.wav')
    .input('/drummachine/www/audio/sd/sd5025.wav')
    .input('/drummachine/www/audio/rs/rs.wav')
    .input('/drummachine/www/audio/rs/rs.wav')
    .input('/drummachine/www/audio/rs/rs.wav')
    .input('/drummachine/www/audio/cp/cp.wav')
    .input('/drummachine/www/audio/cp/cp.wav')
    .input('/drummachine/www/audio/cp/cp.wav')
    .input('/drummachine/www/audio/oh/oh25.wav')
    .input('/drummachine/www/audio/oh/oh25.wav')
    .input('/drummachine/www/audio/oh/oh25.wav')
    .input('/drummachine/www/audio/ch/ch.wav')
    .input('/drummachine/www/audio/ch/ch.wav')
    .input('/drummachine/www/audio/ch/ch.wav')
    // ...
    // you get the picture
    // ...
    .audioCodec('libmp3lame').format('mp3')
    .complexFilter([
        //GENERATE SILENCE TO PREPEND TO INPUTS
        'aevalsrc=0:d=6.857142857142857[s78]',
        'aevalsrc=0:d=0[s0]',
        'aevalsrc=0:d=0.857[s1]',
        'aevalsrc=0:d=1.714[s2]',
        'aevalsrc=0:d=2.571[s3]',
        'aevalsrc=0:d=3.429[s4]',
        'aevalsrc=0:d=4.286[s5]',
        'aevalsrc=0:d=5.143[s6]',
        'aevalsrc=0:d=6[s7]',
        'aevalsrc=0:d=0.429[s8]',
        'aevalsrc=0:d=1.286[s9]',
        'aevalsrc=0:d=2.143[s10]',
        'aevalsrc=0:d=3[s11]',
        'aevalsrc=0:d=3.857[s12]',
        'aevalsrc=0:d=4.714[s13]',
        'aevalsrc=0:d=5.571[s14]',
        'aevalsrc=0:d=6.429[s15]',
        'aevalsrc=0:d=0.536[s16]',
        // ...
        //CONCAT SILENCE AND AUDIO
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s0', '0:a'], outputs: 'ac0'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s1', '1:a'], outputs: 'ac1'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s2', '2:a'], outputs: 'ac2'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s3', '3:a'], outputs: 'ac3'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s4', '4:a'], outputs: 'ac4'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s5', '5:a'], outputs: 'ac5'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s6', '6:a'], outputs: 'ac6'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s7', '7:a'], outputs: 'ac7'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s8', '8:a'], outputs: 'ac8'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s9', '9:a'], outputs: 'ac9'},
        {filter: 'concat', options: {v: 0, a: 1}, inputs: ['s10', '10:a'], outputs: 'ac10'},
        // ...
        // again, this goes on for a while
        // ...
        //MIX IT ALL
        {filter: 'amix', options: {inputs: 78, duration: 'longest'},
            inputs: ['s78', 'ac0', 'ac1', 'ac2', 'ac3', 'ac4', 'ac5',
            'ac6', 'ac7', 'ac8', 'ac9', 'ac10', 'ac11', 'ac12', 'ac13',
            'ac14', 'ac15', 'ac16', 'ac17', 'ac18', 'ac19', 'ac20',    
            // ...
            'ac74', 'ac75', 'ac76'], outputs: 'out'}], 'out')
    //ERROR
    .on('error', function (err, stdout, stderr) {
        console.log('an error happened: ' + err.message);
        console.log('ffmpeg stdout: ' + stdout);
        console.log('ffmpeg stderr: ' + stderr);
    //SUCCESS
    }).on('end', function () {
        console.log('Processing finished !');
        res.end();
    }).pipe(res);

0 ответов

Другие вопросы по тегам