sox 命令在 mp3 開始時自動添加延遲
我有一些影片文件在音頻中有“嗡嗡聲”。因此,我為批處理創建了以下腳本。**我正在使用
ffmpeg
, 將音頻提取為 .mp3,並使用sox進行降噪,**這將輸出無雜訊的 mp3 文件。mkdir -p ./tmp; for f in *.mp4; do title=${f%.mp4}; echo "Working on $f"; mv ./"$f" ./tmp/ && ffmpeg -i ./tmp/"$f" -f mp3 -ab 128000 -vn ./tmp/"$title"_noise.mp3; echo "Sox process started..."; sox -v 0.80 ./tmp/"$title"_noise.mp3 ./tmp/"$title"_128.mp3 noisered ./noise_profile 0.20 && sox ./tmp/"$title"_128.$mp3 -C 96 ./$title.mp3; echo "Removing Audio from video file..."; ffmpeg -loglevel warning -stats -y -i ./tmp/"$f" -c copy -an ./"$f"; done
但問題是,我觀察到
00:00:00.050s
最終的 mp3 文件中添加了 (HH:MM:SS.ms - Checked with Audacity) 延遲。我相信Sox正在增加這種延遲。
- **我該如何解決這個問題?或者,如何
00.050
從開頭刪除/修剪秒數並00.050
在音軌末尾添加幾秒的靜音?**或者- 還有其他更好的方法來完成我的任務嗎?
注意:我正在嘗試使用
.wav
而不是.mp3
在閱讀下面的回復後,如果它有效,我將在這裡更新。)
我找到了我自己問題的答案。有兩種方法可以解決這個問題。我的第一個問題的答案是…
1. 我該如何解決這個問題?或者,如何
00.050
從開頭刪除/修剪秒數並00.050
在音軌末尾添加幾秒的靜音?**答案 1:**這可能具有破壞性,因為我要多次轉換 mp3。如果有人想知道的話。
trim
在開頭使用以下命令並pad
在結尾使用添加靜音。sox Speech_01.mp3 Speech_01_Corrected.mp3 trim 0.049 pad 0 0.050
trim 0.049
將從一開始就消除 049ms 的沉默。pad 0 0.050
將在最後添加 050ms 的靜音。答案2:這就是解決我的問題的方法。我按照這個頁面的說明,拼湊了一個批處理腳本。
2. 還有其他更好的方法來完成我的任務嗎?
正如所**
@Artem S. Tashkinov
**指出的,LAME.wav
由於和.mp3
格式之間的樣本差異而增加了延遲。(這是我的理解)。所以,我只使用.wav
了這個頁面中提到的。**注意:出於某種未知原因,以下
sox
**命令從音頻文件的末尾刪除了一小部分。因此,我不得不pad
在音頻的末尾添加一些靜音,並避免意外失去音頻的任何部分。通過反複試驗,我知道這0.010ms
對我的情況來說已經足夠了。# You can observe pad here, which is adding silence at the end. sox ./tmp/"$title"_noisy.wav ./tmp/"$title"_noisy_s.wav pad 0 0.010 # Below command will delete small part from the end of output wav file, # Hence the above command. sox -v 0.80 ./tmp/"$title"_noisy_s.wav ./"$title".wav noisered ./allnoise_profile 0.30
收集雜訊以生成
noise profile.
就我而言,我的文件中有不同的“hmm”噪音變化。結果,為所有文件只選擇一個雜訊樣本對我不起作用。因此,我使用Audacity複製了正在轉義的變體並創建了一個
.wav
文件 (allnoise_samples.wav
) 。**注意:**在變體之間保持沉默對我不起作用。所以,樣本是連續的。# Use below command to generate a noise sample file. sox ./allnoise_samples.wav -n noiseprof ./allnoise_profile
這是批處理的最終腳本。
處理
.wav
文件會佔用大量儲存空間。所以,一旦他們的目的實現,我就會刪除它們。mkdir -p ./tmp; for f in *.mp4; do title=${f%.mp4}; echo -e "\n\n$f - Splitting Audio and video files..."; mv ./"$f" ./tmp/"$title"_O.mp4 && ffmpeg -i ./tmp/"$title"_O.mp4 -c:a pcm_s16le -ar 128k -vn ./tmp/"$title"_noisy.wav; ffmpeg -i ./tmp/"$title"_O.mp4 -c copy -an ./"$title"_v.mp4; echo "Adding Silence at the end..."; sox ./tmp/"$title"_noisy.wav ./tmp/"$title"_noisy_s.wav pad 0 0.010 && rm -rf ./tmp/"$title"_noisy.wav; echo "Sox process started..."; sox -v 0.80 ./tmp/"$title"_noisy_s.wav ./"$title".wav noisered ./allnoise_profile 0.30 && rm -rf ./tmp/"$title"_noisy_s.wav; echo -e "Sox finished... \nMerging Audio and video files..."; ffmpeg -loglevel warning -stats -y -i ./"$title"_v.mp4 -i ./"$title".wav -map 0:v -map 1:a -c:v copy -c:a aac -b:a 96k ./"$f"; rm -rf ./"$title"_v.mp4 ./"$title".wav; done
這可能歸結為 MP3(MPEG-1 音頻層 III)標準:
https://lame.sourceforge.io/tech-FAQ.txt
閱讀以下部分:“為什麼 LAME 會在每首歌曲的開頭添加靜音?”