2010-12-04 103 views
3

我正在解碼一個在單獨文件中有伴音軌的視頻格式。根據規格,我每1/75秒渲染一幀視頻。視頻文件的長度與音軌的長度相同。將音頻與音頻隊列服務同步的建議?

我正在使用Audio Queue Services播放音頻(我之所以選擇這個音頻是因爲我認爲會出現需要精確定時控制的情況 - 只是我遇到的情況!)。這是一個很大的API,我沒有在Apple的編程指南中通過示例代碼取得很大進展(儘管我已經用更好的ObjC API封裝了這些代碼)。

在理想情況下,基本播放設置可以正常工作。視頻和音頻保持同步,並在同一時間結束(在我自己的能力區分)。但是,如果性能打嗝(或者我附上泄漏儀器或其他東西),它們很快就會失去同步。

這是我第一次寫這種性質的東西:我以前沒有聲音或視頻的經驗。我當然沒有使用音頻隊列服務的經驗。所以我不確定該從哪裏出發。

你做過這樣的事嗎?你有一些建議或提示或技巧提供?是否有一些我需要閱讀的基礎文檔?任何幫助將不勝感激。

+0

你用什麼來播放視頻? – sbooth 2010-12-08 17:22:17

+0

我用CGBitmapContextCreate創建了一個CGContextRef,並將像素寫入其數據流,並將其轉化爲CGImageRef以繪製到CALayer中。爲了提高效率,我只更新每幀更改的像素。幸運的是,這是一種質量很低的視頻格式。 – 2010-12-08 19:11:08

回答

2

首先,我從來沒有真正編碼過這樣的東西,所以我從臀部拍攝。另外,我用HAL和AUHAL做了大量的編程,但從來沒有用過AudioQueue,所以我的方法可能不是使用AQ的最佳方法。

顯然,首先要決定是將音頻同步到視頻還是將視頻同步到音頻。從這個問題看,你已經決定視頻將成爲主,音頻應該同步到它。

我會通過跟蹤呈現的視頻幀數以及幀頻來解決這個問題。然後,在排隊音頻緩衝區時,不要爲startTime傳遞單調遞增的值,而是調整緩衝區的開始時間以匹配在視頻中觀察到的任何不連續點。這有點含糊,因爲我不確切知道你的音頻來自哪裏,或者你是如何排隊的,但希望原理很清楚。