Audio 具有不同持续时间输入的FFMPEG amix过滤器卷问题

Audio 具有不同持续时间输入的FFMPEG amix过滤器卷问题,audio,ffmpeg,Audio,Ffmpeg,我注意到,ffmpeg-amixfilter在特定情况下不能输出好的结果。如果输入文件的持续时间相等,则效果良好。在这种情况下,体积以恒定值下降,可以用”固定,体积=2“ 在我的例子中,我使用的文件具有不同的持续时间。结果是音量不好。第一条混流的体积最小,最后一条混流的体积最大。您可以在图像上看到,体积随时间线性增加 我的命令: ffmpeg -i temp_0.mp4 -i user_2123_10.mp4 -i user_2123_3.mp4 -i user_2123_4.mp4

我注意到,
ffmpeg-amix
filter在特定情况下不能输出好的结果。如果输入文件的持续时间相等,则效果良好。在这种情况下,体积以恒定值下降,可以用
”固定,体积=2“

在我的例子中,我使用的文件具有不同的持续时间。结果是音量不好。第一条混流的体积最小,最后一条混流的体积最大。您可以在图像上看到,体积随时间线性增加

我的命令:

ffmpeg -i temp_0.mp4 -i user_2123_10.mp4  -i user_2123_3.mp4  -i user_2123_4.mp4  
-i user_2123_7.mp4  -i user_2123_5.mp4  -i user_2123_1.mp4  -i user_2123_8.mp4  
-i user_2123_0.mp4  -i user_2123_6.mp4  -i user_2123_9.mp4  -i user_2123_2.mp4  
-i user_2123_11.mp4 -filter_complex "[1:a]adelay=34741.0[aud1];
[2:a]adelay=18241.0[aud2];[3:a]adelay=20602.0[aud3];
[4:a]adelay=27852.0[aud4];[5:a]adelay=22941.0[aud5];
[6:a]adelay=13142.0[aud6];[7:a]adelay=29810.0[aud7];
[8:a]adelay=12.0[aud8];[9:a]adelay=25692.0[aud9];
[10:a]adelay=32143.002[aud10];[11:a]adelay=16101.0[aud11];
[12:a]adelay=40848.0[aud12];
[0:a][aud1][aud2][aud3][aud4][aud5][aud6][aud7]
[aud8][aud9][aud10][aud11]
[aud12]amix=inputs=13:duration=first:dropout_transition=0" 
-vcodec copy -y temp_1.mp4
这可以通过在每个剪辑的开头和结尾应用静音来解决,然后它们将具有相同的持续时间,音量将处于相同的水平


请建议我如何使用
amix
混合许多输入并确保恒定音量。

很抱歉,没有发送ffmpeg输出

我们最终通过编写C++中的小UTIL来混合音频。但首先我们将mp4转换为原始(pcm)格式。这对我们来说很好,甚至需要为原始中间文件增加硬盘空间

代码如下所示:

short addSounds(short a, short b) {
    double da = a;
    da /= 65536.0;
    da += 0.5;
    double db = b;
    db /= 65536.0;
    db += 0.5;
    double z = 0;
    if (da < 0.5 && db < 0.5) {
        z = 2 * da*db;
    }
    else {
        z = 2 * ( da + db ) - 2 * da* db - 1;
    }
    z -= 0.5;
    z *= 65536.0;
    return (short)z;
}
short addSounds(短a、短b){
双da=a;
da/=65536.0;
da+=0.5;
双db=b;
db/=65536.0;
db+=0.5;
双z=0;
如果(da<0.5&&db<0.5){
z=2*da*db;
}
否则{
z=2*(da+db)-2*da*db-1;
}
z-=0.5;
z*=65536.0;
返回(短)z;
}

尝试使用乘法:

"amix=inputs="+ chunks.length + ":duration=first:dropout_transition=3,volume=" + chunks.length

尝试将退出转换更改为第一次输入的持续时间:

duration=first:dropout_transition=_duration_of_the_first_input_in_seconds_
以下是我的ffmpeg命令:

ffmpeg -y -i long.wav -i short.wav  -filter_complex "[1:a]adelay=6000|6000[a1];[1:a]adelay=10000|10000[a2];[1:a]adelay=14000|14000[a3];[1:a]adelay=18000|18000[a4];[1:a]adelay=21000|21000[a5];[1:a]adelay=25500|25500[a6];[0:a][a1][a2][a3][a4][a5][a6]amix=inputs=7:duration=first:dropout_transition=32[aout]" -map "[aout]" -ac 2 -b:a 192k -ar 44100 output.mp3

amix
1/n
缩放每个输入的音量,其中n=活动输入的数量。这将针对每个音频帧进行评估。因此,当一个输入退出时,其余输入的体积将按较小的量缩放,因此它们的体积将增加

正如其他答案中所建议的那样,更改所有早期输入的辍学转换是一种方法,但我认为这将导致粗略的音量调制。更好的方法是在amix之后对音频进行规范化

目前,您有两个选项,或过滤器。后者要快得多

语法是在amix之后添加它,所以

[aud11][aud12]amix=inputs=13:duration=first:dropout_transition=0,dynaudnorm"

如果您希望调整最大音量或RMS模式规范化的参数,请阅读文档。etc

正如Maxim所说,解决方案似乎是“前置放大器”或乘法的组合,并且您必须设置
dropout\u transition>=最大延迟+最大输入长度
(或非常高的数字):

注:

  • 无论如何都必须对浮点进行重采样,因此添加
    过滤器(默认情况下也会对浮点进行重采样)不会有任何负面影响。
    而且因为我们使用了浮动,所以没有剪辑,而且(几乎)没有精度损失
  • H不需要@Mulvya进行分析,但令人沮丧的是,他们的解决方案是非数学的
  • 我本来是想用这个,太慢了。Sox的
    remix
    过滤器具有
    -m
    开关,该开关禁用
    1/n
    调整
  • 虽然速度更快,但ffmpeg似乎在为同一任务使用更多的内存。YMMV-我没有彻底测试它,因为我最终决定使用一个小python脚本,它使用的是的
    overlay
    函数,并且只在内存中保留最终输出文件和一个片段(而ffmpeg和sox似乎将所有片段都保留在内存中)

我找到的解决方案是以“后代”顺序指定每个曲目的音量,然后不使用标准化过滤器

我使用此示例,其中我在不同位置查看相同的音频文件:

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3
更多详细信息,请参见此图。第一个轨道为正常混合,第二个轨道为规定体积的轨道;第三个是原始曲目。正如我们所见,第二轨道的音量看起来正常


我真的不明白为什么amix会改变音量;无论如何我一直在寻找一个好的解决办法

我遇到了同样的问题,但找到了解决办法

第一个问题是:我必须混合一个背景音乐文件和3个不同的TTS语音片段,它们以不同的延迟开始。最后,背景声音非常响亮

我尝试了建议的答案,但对我来说不起作用,最终的音量还是要高得多。因此,我的想法是:“所有输入必须具有相同的长度,以便每次在混音中激活相同数量的音频”

所有TTS输入上的apad和全套和最短选项的组合为我完成了这项工作

示例调用:

ffmpeg -y 
       -nostats 
       -hide_banner 
       -v quiet 
       -hwaccel auto 
       -f image2pipe 
       -i pipe:0 
       -i bgAudio.aac 
       -i TTS1.mp3 
       -i TTS2.mp3 
       -i TTS3.mp3 
       -filter_complex [1:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false[a0];[2:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=7680|7680,apad=whole_len=2346240[a1];[3:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=14640|14640,apad=whole_len=2346240[a2];[4:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=3240|3240,apad=whole_len=2346240[a3];[a0][a1][a2][a3]amix=inputs=4:dropout_transition=0,asplit=6[audio0][audio1][audio2][audio3][audio4][audio5];[0:v]format=yuv420p,split=6[1080p][720p][480p][360p][240p][144p] 
       -map [audio0] -map [1080p] -s 1920x1080 -shortest out1080p.mp4 
       -map [audio1] -map [720p] -s 1280x720 -shortest out720p.mp4 
       -map [audio2] -map [480p] -s 858x480 -shortest out480p.mp4 
       -map [audio3] -map [360p] -s 640x360 -shortest out360p.mp4 
       -map [audio4] -map [240p] -s 426x240 -shortest out240p.mp4 
       -map [audio5] -map [144p] -s 256x144 -shortest out144p.mp4

希望有人能帮上忙

我将向您展示我的代码

“amix=“+inputs.size()+”,volume=“+(inputs.size()+1)/2+”[mixout]\”

我不使用code
dropout\u transition=0
,因为它会导致您遇到的问题

但我也发现了一个问题,即随着投入规模的增加,数量会降低


所以我把音量调大了。

@Xumo这不是我的代码,但我想这是因为16位=65536hello,你知道如何在FFmpeg命令中使用这个代码吗?这是我同事用来创建linux命令行程序的C/C++代码,我后来用来合并混音文件。我想问题在于初始声音的音量问题不在于最终声音的音量增加了。因此,正确的解决方案应该是保留结束声音的音量,并首先放大声音的音量。但根据您的截图,似乎初始声音的音量一直保持到结束和结束音量很低。如果我需要更改-ac它不工作,它总是显示我2这只是增加了槽长音频中所有部分的音量。但仍然存在问题,并且音量从音频的末尾开始变低。如果您希望这样做,请将apad添加到除on之外的所有音频输入中
ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0[a];[1]adelay=2000|2000[b];[2]adelay=4000|4000[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-no-volume.mp3

ffmpeg -vn -i test.mp3 -i test.mp3 -i test.mp3 -filter_complex "[0]adelay=0|0,volume=3[a];[1]adelay=2000|2000,volume=2[b];[2]adelay=4000|4000,volume=1[c];[a][b][c]amix=inputs=3:dropout_transition=0" -q:a 1 -acodec libmp3lame -y amix-volume.mp3
ffmpeg -y 
       -nostats 
       -hide_banner 
       -v quiet 
       -hwaccel auto 
       -f image2pipe 
       -i pipe:0 
       -i bgAudio.aac 
       -i TTS1.mp3 
       -i TTS2.mp3 
       -i TTS3.mp3 
       -filter_complex [1:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false[a0];[2:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=7680|7680,apad=whole_len=2346240[a1];[3:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=14640|14640,apad=whole_len=2346240[a2];[4:a]loudnorm=I=-16:TP=-1.5:LRA=11:linear=false:dual_mono=true,adelay=3240|3240,apad=whole_len=2346240[a3];[a0][a1][a2][a3]amix=inputs=4:dropout_transition=0,asplit=6[audio0][audio1][audio2][audio3][audio4][audio5];[0:v]format=yuv420p,split=6[1080p][720p][480p][360p][240p][144p] 
       -map [audio0] -map [1080p] -s 1920x1080 -shortest out1080p.mp4 
       -map [audio1] -map [720p] -s 1280x720 -shortest out720p.mp4 
       -map [audio2] -map [480p] -s 858x480 -shortest out480p.mp4 
       -map [audio3] -map [360p] -s 640x360 -shortest out360p.mp4 
       -map [audio4] -map [240p] -s 426x240 -shortest out240p.mp4 
       -map [audio5] -map [144p] -s 256x144 -shortest out144p.mp4