[英]Using SoX to change the volume level of a range of time in an audio file
我想使用SoX更改音频文件中特定时间范围/切片的音量级别。
现在,我不得不:
有没有更好的方法来做这个不涉及编写脚本来执行上述操作?
对于任何偶然发现这个排名很高的线程的人来说,寻找一种方法来躲避音频文件的中间部分:
我已经玩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.