我想使用SoX更改音频文件中特定时间范围/切片的音量级别。
现在,我不得不:
有没有更好的方法来执行此操作,而不涉及编写脚本来执行上述操作?
答案 0 :(得分:10)
对于那些偶然发现这个排名靠前的线程的人来说,找到一种方法来躲避音频文件的中间位置:
我已经玩SoX多年了,我构建的方法使用管道处理每个部分,而不用创建所有这些临时文件!
结果是单线解决方案,但您需要设置时序,因此,除非您的淡入淡出时间对所有文件都相同,否则使用算法生成线可能很有用。
我很高兴让管道工作,因为我知道这方面对其他人来说很难。命令行选项可能很难正确。但是,我真的不喜欢凌乱的附加文件作为替代方案。
通过使用混合功能并使用垫定位每个部件,然后给每个部分修剪和放大。褪色我们也可以避免使用' splice'这里。我真的不是一个粉丝。
在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命令行
' fade t 0 2.2 0.4 ' ..淡出整卷部分。 t =线性。 0淡入。然后(因为我们希望交叉淡入淡出的中间点为2秒)我们淡出2.2秒,淡出0.4秒(淡出参数用于淡入淡出时!)
' -t wav ' ..建议下一部分的类型 - 如上所述
然后...... SECOND管道部分(鸭子部分)
'的 -V1 强>' ..再次,忽略输出长度警告 - 见上文 那么相同的输入文件名
' -t wav ' ..强制输出类型,如上所述
'的 - 强>' ..用于管道输出,见上文
' 修剪1.8 ' ..因为这个中间部分会在2秒内到达转换的中间位置,所以(使用0.4秒交叉淡入淡出),鸭子音频文件将在此之前0.2秒开始
' 淡出0.4 3.4 0.4 ' ..淡化鸭子部分&再次淡出。所以0.4渐弱。然后(最复杂的部分)作为下一个交叉渐变将在5.2秒结束我们必须采取该数字减去该部分的修剪量,所以5.2-1.8 = 3.4(再次这是因为淡出位置处理结束时间的淡出)
' 获得-6 ' ..是以dB为单位的数量,我们应该用它来消费
' pad 1.8 ' ..必须与上面的修剪图匹配,以便在开始时插入静音量,以便在切片混合时使其同步
' -t wav ' ..建议下一部分的类型 - 如上所述
然后...... THIRD管道部分(返回完整级别)
'的 -V1 强>' ..再次 - 见上文
然后输入相同的文件名
-t wav ' ..强制输出类型,如上所述
<强> - 强>&#39; ..用于管道输出,见上文
修剪4.8 &#39; ..这最后一节将在5秒开始,但是(用0.4秒交叉渐变)音频将在此前0.2秒开始
&#39; 淡出0.4 0 0 &#39; ..只是淡入这个完整的卷部分。没有淡出
&#39; pad 4.8 &#39; ..必须与上面的修剪图匹配,如上所述 然后输出文件名
&#39; 获得9.542 &#39; ..看起来很棘手,但基本上当你&#34; -m&#34;混合3个文件,SoX将音量减少到1/3(三分之一)以提供空间。
而不是打败它,我们提升到300%。我们得到这个公式20 * log(3)/ log(10)
的dB量为9.542如果你复制&amp;将单行粘贴到您可以轻松看到的地方,它比解释要简单得多!
最后 - 我最初担心交叉渐变是否需要对数而不是线性,但在我的情况下,从听取结果线性确实给出了我期望的声音。
您可能希望尝试更长时间的交叉淡入淡出,或者更早或更晚地发生转换,但我希望单行给那些认为需要许多临时文件的人带来希望!
如果有更多说明可以帮助我,请告诉我们。
答案 1 :(得分:3)
好的,使用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 之间的差值来应用音量过滤器。< / p>
这将在一个范围内将音量从初始音量线性增加到所需值。 atrim 将修剪音频块。 ffmpeg真是太棒了,表达式可能非常复杂,许多数学函数都可以用在表达式中。