簡體   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