2016-09-20 94 views
2

使用MS Media Foundation,我試圖從圖像幀創建視頻(H.264/AAC),並在各個位置添加包含聲音效果的音軌。聲音效果之間的音頻流中會存在間隙。我正在使用配有音頻和視頻流的IMFSinkWriter(詳情如下)。我目前正在測試僅在視頻中放置2秒的單一聲音效果。在Windows下(通過Windows媒體播放器或「電影&電視」),MP4文件呈現沒有錯誤並正確播放(聲音效果在正確位置播放)。但是,當我在MacOS(QuickTime)下播放視頻時,音頻無法正確同步。聲音效果比預期的要早得多。Media Foundation - 創建MP4時的跨平臺音頻同步問題

詳細

SinkWriter我被配置爲與視頻流,用輸出亞型MFVideoFormat_H264和輸入亞型MFVideoFormat_RGB32。音頻流配置爲輸出子類型MFAudioFormat_AAC和輸入子類型MFAudioFormat_PCM(匹配提供音頻樣本的IMFSourceReader)。

我先寫所有的視頻幀,然後寫出音頻採樣。在寫音頻時,如果在音效之前和之後都存在音頻間隙,我會使用SendStreamTick(每0.5秒)。我還在第一個音頻樣本上設置了MFSampleExtension_Discontinuity。聲音效果後我也嘗試發送NotifyEndOfSegment,但這似乎沒有什麼區別。

我不寫樣本描述框,因爲我相信它是爲我的配置自動生成的。

任何幫助,將不勝感激。謝謝!

+0

在合適的視頻編輯器中打開並檢查視頻和音頻軌道的時間。可能是你有更多的幀比同步音軌。同時檢查幀持續時間。 –

回答

2

MP4文件渲染,沒有錯誤,並且在Windows下可以正常播放(聲音效果發揮在正確的位置)(通過Windows Media Player或「電影&電視」)。但是,當我在MacOS(QuickTime)下播放視頻時,音頻無法正確同步。聲音效果比預期的要早得多。

不同的播放器處理軌道間隔的方式不同,很多時候它們無法保持軌道之間的良好同步。更令人困惑的是,他們以不同的方式做到了這一點:一些人在保持同步的同時跳過空白,另一些人則順利地播放「主」樂曲,同時忽略另一首樂曲的差距。

也就是說,即使一個文件是用正確的數據定時創建的,它也可能發生,並且確實發生了玩家未能發揮出色的情況。

生成適合所有玩家的文件的最佳策略是避免視頻和音頻軌道數據中的空白。對於音頻,編碼人工靜音是一個很好的解決方案。

1

我想出了一個似乎工作得很好的解決方案。我的解決方案是將沉默(零)寫入音頻流,而不是使用SetStreamTick

+0

+1解決自己的問題。關於_「輸入子類型'MFAudioFormat_PCM'」_你應該快速閱讀PCM和採樣如何工作。預期的解決方案是在PCM數據中寫入具有零值的採樣(填充)。你說對了!!現在唯一的奧祕是「在Windows下(通過W.M.Player)正確播放......」,微軟真的很好嗎? –

+0

謝謝@ VC.One!似乎MS球員處理流勾號的方式與其他球員不同(如@羅曼的回答中所述)。再次感謝! – Avidd