繁体   English   中英

使用SoX更改音频文件中一段时间​​的音量级别

[英]Using SoX to change the volume level of a range of time in an audio file

我想使用SoX更改音频文件中特定时间范围/切片的音量级别。

现在,我不得不:

  1. 修剪原始文件三次得到:音频效果改变前的部分,(我改变声级的部分),以及之后的部分
  2. 执行效果以在其自己的文件中更改提取的“中间”音频块上的声级
  3. 考虑到SoX推荐的淡入/交叉淡化5ms重叠,将所有内容拼接在一起

有没有更好的方法来做这个不涉及编写脚本来执行上述操作?

对于任何偶然发现这个排名很高的线程的人来说,寻找一种方法来躲避音频文件的中间部分:

我已经玩SoX多年了,我构建的方法使用管道处理每个部分而不创建所有这些临时文件!

结果是单线解决方案,但您需要设置时序,因此,除非您的淡入淡出时间对所有文件都相同,否则使用算法生成线可能很有用。

我很高兴让管道工作,因为我知道这方面对其他人来说很难。 命令行选项可能很难正确。 但是我真的不喜欢凌乱的附加文件作为替代。

通过使用混合功能并使用垫定位每个部件,然后给每个部分修剪和褪色,我们也可以避免在这里使用“拼接”。 我真的不是粉丝。


一个工作的单行示例,在SoX 14.4.2 Windows中测试:

它在2秒时衰减(鸭子)-6dB,在5秒时恢复到0dB(使用0.4秒的线性衰落):

sox -m -t wav "|sox -V1 inputfile.wav -t wav - fade t 0 2.2 0.4" -t wav "|sox -V1 inputfile.wav -t wav - trim 1.8 fade t 0.4 3.4 0.4 gain -6 pad 1.8" -t wav "|sox -V1 inputfile.wav -t wav - trim 4.8 fade t 0.4 0 0 pad 4.8" outputfile.wav gain 9.542

让我们通过将其分解为几个部分来使其更具可读性:

第1节=满量,第2节=低头,第3节=满量

sox -m
    -t wav "|sox -V1 inputfile.wav -t wav - fade t 0 2.2 0.4" 
    -t wav "|sox -V1 inputfile.wav -t wav - trim 1.8 fade t 0.4 3.4 0.4 gain -6 pad 1.8"
    -t wav "|sox -V1 inputfile.wav -t wav - trim 4.8 fade t 0.4 0 0 pad 4.8"
    outputfile.wav gain 9.542

现在,要彻底打破它

' -m '..说我们要混合(这会自动降低增益,参见最后一个参数)

' -t wav '..说接下来的管道命令将返回一个WAV(似乎WAV标题在管道中丢失)

然后..第一个管道部分(鸭子前的全卷)

' -V1 '..表示忽略警告 - 会发出一个警告,说明这个特定部分的输出文件长度不知道,因为它已经输出,但此操作不应该有其他警告

然后是输入文件名

' -t wav '..强制输出类型

' - '..是管道输出的标准名称,它将返回到SoX命令行

' 淡出t 0 2.2 0.4 '..淡出整个音量部分。 t =线性。 0淡入。然后(因为我们希望交叉淡入淡出的中间点为2秒),我们淡出2.2秒,淡入0.4秒(淡出参数用于淡入淡出时!)

' -t wav '..建议下一部分的类型 - 如上所述

然后..第二个管道部分(鸭子部分)

' -V1 '..再次,忽略输出长度警告 - 见上面然后相同的输入文件名

' -t wav '..强制输出类型,如上所述

' - '..用于管道输出,见上文

' 修剪1.8 '..因为这个中间部分会在2秒内到达转换的中间位置,所以(使用0.4秒的交叉渐变)躲避的音频文件将在此之前0.2秒开始

' 淡出t 0.4 3.4 0.4 '..淡化鸭子部分并再次淡出。 所以0.4渐弱。然后(最复杂的部分)作为下一个交叉渐变将在5.2秒结束我们必须采取该数字减去该部分的修剪量,所以5.2-1.8 = 3.4(再次这是因为淡出位置处理结束时间的淡出)

' 增益-6 '..是我们应该躲避的数量,以dB为单位

' pad 1.8 '..必须与上面的修剪图匹配,以便在开始时插入静音量,以便在切片混合时使其同步

' -t wav '..建议下一部分的类型 - 如上所述

然后..第三个管道部分(返回完整级别)

' -V1 '..再次 - 见上文

那么相同的输入文件名

-t wav '..强制输出类型,如上所述

- '..用于管道输出,见上文

修剪4.8 '..这个最后一节将在5秒开始,但是(用0.4秒交叉渐变)音频将在此前0.2秒开始

' 淡出t 0.4 0 0 '..只是淡入这个完整的音量部分。 没有淡出

' pad 4.8 '..必须与上面的修剪图匹配,如上所述然后输出文件名

' 获得9.542 '..看起来很棘手,但基本上当你“-m”混合3个文件时,SoX的音量减少到1/3(三分之一)以提供空间。

而不是打败它,我们提高到300%。 我们得到的dB量为9.542,该公式为20 * log(3)/ log(10)


如果您将单行复制并粘贴到某个地方,您可以轻松地看到它,这比解释要简单得多!

最后 - 我最初担心交叉渐变是否需要是对数而不是线性,但在我的情况下,从听取结果线性确实给出了我预期的声音。

您可能希望尝试更长时间的交叉淡入淡出,或者更早或更晚地发生转换,但我希望单行给那些认为需要许多临时文件的人带来希望!

如果有更多的说明会有帮助,请告诉我!

大胆波形

好的,使用ffmpeg和过滤器都非常简单。

想象一下,你有2首曲目,A和B.你想要裁剪一些并对音量做些什么。 所以解决方案是:

ffmpeg -y -i 1.mp3 -i 2.mp3 i f454495482c151aea8761dda.mp3 -i f5544954796af4a171f11b57.mp3 -i f754495448788e35e6123679.mp3 -i f754495448788e35e6123679.mp3 -i f85449545e646dea98e5dd19.mp3 \
-filter_complex "[0]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume='if(between(t,129.00,129.20),0.15000*(t - 129.00) + 0.03,1)':eval=frame,volume='if(between(t,129.20,181.50),-0.00057*(t - 129.20) + 0.06,1)':eval=frame,volume='if(between(t,181.50,181.60),0.40000*(t - 181.50) + 0.03,1)':eval=frame,volume='if(between(t,181.60,183.50),-0.03684*(t - 181.60) + 0.07,1)':eval=frame,volume='if(between(t,183.50,188.00),0.00000*(t - 183.50) + 0.00,1)':eval=frame,atrim=0.00:56.00,adelay=129000|129000|129000|129000,apad[0:o];[1]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume='if(between(t,0.00,134.00),0.00000*(t - 0.00) + 0.06,1)':eval=frame,atrim=0.00:134.00,apad[1:o];[0:o][1:o]amix=inputs=28,atrim=duration=185.00" -shortest -ac 2 output.mp3

这将获取2个输入文件,将两个流转换为适当的格式 ,然后应用过滤器。

音量的语法很简单:如果时间t 某个开始时间和结束时间之间 - 然后应用音量滤波器,基于所需的起始音量水平加上某个系数乘以开始时间和当前时间t之间的差值。

这将在一定范围内将体积从初始体积线性增加到期望值。

在所有范围上调整音量后, atrim将修剪音频块。

ffmpeg真是太棒了,表达式可能非常复杂,许多数学函数都可以用在表达式中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM