Node.js を介して fluent-ffmpeg を介して FFmpeg を使用して、多数の小さなオーディオ ファイルを 1 つに結合しています。結合している各オーディオ ファイルの開始時刻が遅れています (したがって、すべてを同時に結合したり、連結したりしていません)。オーディオ ファイルを使用してそれにingし、すべてをing することで、これを正常に実行できます。ただし、ドキュメントで最大入力数への参照を見つけることができませんでしたが、78 ファイルにしようとすると得られました。明らかに、32 個の入力ファイルの制限があります。aevalsrc
=0
concat
amix
[amix @ 0x3fcd920] Value 78.000000 for parameter 'inputs' out of range [1 - 32]
amix
この制限を考えると、続行する最善の方法がわかりません。それが存在することは理解していamerge
ますが、ファイルの長さが最短になると停止するため、apad
すべてを実行する必要があり、テストしたところ、amerge
入力ファイルが64個に制限されていることがわかりました。入力の)。
32個のファイルをどこかに保存し、さらに32個など、結果を得ることができ ました。一時ファイルをディスクに書き込んで後でクリーンアップする必要はありません。「一時」出力を二重ノード ストリームに書き込み、最終的なミックスダウンでそれらから読み取ることを検討しましたが、それはかなり非効率的である可能性があります。amix
amix
amix
以下は私が現在行っていることです。これが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);