[英]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.