Ffmpeg adelay的單位及對齊的標的
Medium好讀版:點這裡
前言
接續前一篇:ffmpeg依不同offset合併多個音檔
在開發時有2個不確定的問題:
-
timestamp是對齊誰?
-
adelay單位是秒還是毫秒。就做了個小實驗來驗證。
問題描述
更具體來説,上述的2個問題:
- timestamp是對齊誰? 是所有音檔都與第一個音檔算offset呢?(以下簡稱FIRST)還是彼此之間算offset (以下簡稱BETWEEN)。
- adelay的單位是秒還是毫秒? 根據ffmpeg的手冊,是用毫秒沒錯。
8.11 adelay Delay one or more audio channels.
Samples in delayed channel are filled with silence. The filter accepts the following option:
*delays Set list of delays in milliseconds for each channel separated by ’ ’.*
實驗
接下來就是要驗證對齊的目標,實驗設定我取了3個音檔,分別是RE、FA、LA這三個音。
彼此的長度都是5秒,5秒過後就換下一個聲音。因此預期的結果應該不會有和聲。
所使用的2組設定分別爲:
- 方法1 FIRST
## 方法1 FIRST: 所有音檔都跟第一筆算offset fmpeg -i re.mp3 -i fa.mp3 -i la.mp3 -filter_complex \ “[1]adelay=5000[a1]; [2]adelay=10000[a2]; [0][a1][a2]amix=3:normalize=0” misec_first.mp3
- 方法2 BETWEEN
## 方法2 BETWEEN: 所有音檔彼此跟前一筆算offset
fmpeg -i re.mp3 -i fa.mp3 -i la.mp3 -filter_complex \
"[1]adelay=5000[a1];
[2]adelay=5000[a2];
[0][a1][a2]amix=3:normalize=0" misec_first.mp3
實驗結果
從音檔的分佈可以看出,依序更換,沒有重叠的FIRST才是正確的方法:
- FIRST的方法
- BETWEEN的方法
結論
ffmpeg的adelay,計算offset是以第一筆音檔爲主 (大家都要跟第一筆算offset),
而單位是用millisecond。