在 Bash 的迴圈裡面跑 FFmpeg 有時候會遇到奇怪的靈異現象,發現是這個問題:「execute ffmpeg command in a loop」。
原因是當你用 while
+ read
產生迴圈時會有對 stdin 的操作行為,而 FFmpeg 預設也會去讀 stdin (WTF),於是兩邊就打架了。
解法是用 -nostdin
叫 FFmpeg 不要手賤去讀 stdin,這樣就可以解決這個問題。
幹壞事是進步最大的原動力
在 Bash 的迴圈裡面跑 FFmpeg 有時候會遇到奇怪的靈異現象,發現是這個問題:「execute ffmpeg command in a loop」。
原因是當你用 while
+ read
產生迴圈時會有對 stdin 的操作行為,而 FFmpeg 預設也會去讀 stdin (WTF),於是兩邊就打架了。
解法是用 -nostdin
叫 FFmpeg 不要手賤去讀 stdin,這樣就可以解決這個問題。
先提供指令 (需要新版 FFmpeg),把單聲道的 1.wav
加工成 2.wav
(兩聲道):
ffmpeg -i 1.wav -filter_complex '[0:0]stereotools=delay=20[aout]' -map '[aout]' -y 2.wav
這是看了『如何讓聲音有「立體感」?』後的實驗:
裡面提到要怎麼讓單聲道錄音產生空間感,其中一個方式是將單聲道的 audio stream 複製到兩邊,但讓左右聲道差 0.02 秒 (也就是 20ms),讓兩邊聲音有些微差距而產生空間感。
查了資料後發現這個功能可以靠 FFmpeg 裡 stereotools
的 delay
達成:
- delay
- Set delay in milliseconds how much to delay left from right channel and vice versa. Default is 0. Allowed range is from -20 to 20.
但 Ubuntu 16.04 內的 FFmpeg 版本不夠新 (2.8.15),測試時說沒有 stereotools
這個 filter,所以找了「FFMPEG 4 : Jonathon F」這個 PPA,改用 4.x 版的 FFmpeg 就可以用了。
算是找個機會玩看看... 另外也熟悉一下 FFmpeg 的 -filter_complex
到底是什麼語法。