
FFmpeg 是開源界最強大的影音解決套件。
如何快速地調整影音不同步的問題呢?如果你不嫌棄用 CLI 介面的話,答案是用 FFmpeg 這個開源套件。
如何安裝 ffmpeg
如果你的 mac 有裝 homebrew 的話,那麼就是:
brew install ffmpeg
對!不要懷疑,用 homebrew 管理開源套件就是這麼輕鬆,一句簡單的指令就搞定。
它的簡易指令如下:
ffmpeg -i input.mp4 -itsoffset 0.5 -i input.mp4 -map 0:v -map 1:a -c:v copy -c:a aac output_fixed.mp4
- -i input.mp4:來源影片檔(宣告兩次,第一次是提取影片軌,第二次提取音訊軌)。
- -itsoffset 0.5:將聲音延遲 0.5 秒。
- -map 0:v:指定第一個來源檔的影片軌。
- -map 1:a:指定第二個來源檔的音訊軌。
- -c:v copy:保留原始畫面,畫質不變。
- -c:a aac:重新編碼音訊(避免不支援未編碼音訊的播放器出錯)
- output_fixed.mp4:輸出的影片檔案。
寫成可重複使用的指令腳本
懶人如我,一定要把寫過的程式變成可以重複執行的指令,於是:
#!/bin/bash
# FixAudioDelay_v0.1b
# Copyright (c) 2025 Alrin
# delay 正數 = 聲音延後(聲音比畫面快)
# delay 負數 = 影片延後(聲音比畫面慢)
if [ -z "$1" ]; then
echo "❗ 請提供 MP4 檔案路徑。"
echo "用法:./fix_audio_delay.sh input.mp4 [delay_in_seconds]"
exit 1
fi
INPUT="$1"
DELAY="$2" # 聲音延遲秒數
EXT="${INPUT##*.}"
BASENAME="${INPUT%.*}"
OUTPUT="${BASENAME}_fixed.${EXT}"
echo "🎬 修正中..."
echo "來源:$INPUT"
echo "延遲秒數(正=聲音延遲,負=影片延遲):$DELAY"
echo "輸出:$OUTPUT"
# 判斷 delay 是正或負
if (( $(echo "$DELAY > 0" | bc -l) )); then
# 聲音延後
ffmpeg \
-i "$INPUT" \
-itsoffset "$DELAY" -i "$INPUT" \
-map 0:v:0 \
-map 1:a:0 \
-c:v copy \
-c:a aac \
"$OUTPUT"
else
POS_DELAY=$(echo "${DELAY#-}") # 去掉負號
# 影片延後
ffmpeg \
-itsoffset "$POS_DELAY" -i "$INPUT" \
-i "$INPUT" \
-map 0:v:0 \
-map 1:a:0 \
-c:v copy \
-c:a aac \
"$OUTPUT"
fi
echo "✅ 完成!"
老規矩,如果你要分享這個指令我不反對,但請不要刪掉我前面的版權註記,我會在程式裡面標暗號,但是希望大家能在取用的時候尊重一下創作者,我會非常感激~
如何使用?
很簡單,假設你把上述程式碼存成「fix_audio_delay.sh」,並設定為可執行檔,就可以執行,它的語法邏輯是這樣的:
fix_audio_delay.sh [你的來源檔案] [你想要聲音延遲的秒數]
假設,你的影片「聲音比畫面快1秒」,就是幫聲音+1秒:
fix_audio_delay.sh input.mp4 1
如果反過來「聲音比畫面慢1秒」,就是幫聲音-1秒:
fix_audio_delay.sh input.mp4 -1
-itsoffset 參數
-itsoffset(時間偏移設定)是 ffmpeg 的基準參數,如果你對於其他 itsoffset 有興趣,不妨可以參考官方說明頁面:
https://trac.ffmpeg.org/wiki/UnderstandingItsoffset
歡迎成為 CLI 的愛好者~