答案1
當 ffmpeg 載入 AAC 串流時,它會在內部添加額外的 2 個靜音幀用於填充,通常稱為「啟動樣本」。上面的評論說添加 0.2322 的入點對於特定的取樣率是正確的,但如果您希望它完全無縫,還有更多工作要做。
要無縫連接,沒有間隙,您可以執行以下操作:
- 根據取樣率計算AAC幀長度,例如44.1KHz為1024/44100 = 0.02321995。
- 在每個段落的開頭和結尾額外編碼 2 個 AAC 幀。
- 考慮 ffmpeg 始終在內部添加的 2 個無聲填充幀。
- 在 concat txt 檔案中指派 inpoint 和 outpoint 指令,以便在建立輸出檔案時僅使用「好」內容。
需要 2 個額外的起始幀,因為每個 AAC 幀都依賴其之前的最多 2 個幀。因此,要正確編碼第一幀,需要該上下文。最後需要 2 個額外的幀,因為 ffmpeg 在最後逐漸縮小音訊以避免突然彈出。透過增加 2 個額外的幀,我們改變了錐度,這樣就不會影響我們的實際內容。然後使用入點和出點刪除這些額外的幀,以避免重複內容。
使用此方法時,重要的是所有段的長度必須是 AAC 幀持續時間的精確倍數。如果不這樣做,您將在段邊界處看到不可預測的偽影。
我最近發布了一個儲存庫,用實際程式碼進一步演示了這一點:https://github.com/wistia/seamless-aac-split-and-stitch-demo。