最近在嘗試制作音視頻播放器,翻了各種資料,已經(jīng)可以正常播放抖音小視頻了赞庶,但仍不知有哪些異常情況沒有處理,現(xiàn)在就記錄一下這段時間的所學與設計方案澳骤。
編程語言使用c++,界面使用qt澜薄,多媒體處理庫使用ffmpeg为肮。
概括來說,音視頻播放包括解封裝—>解碼—>幀同步三步驟肤京。解封裝是將文件流分離成音頻流和視頻流颊艳;解碼是對流數(shù)據(jù)進行解壓縮,還原為原始數(shù)據(jù)忘分;幀同步是依據(jù)時間戳將視頻幀和音頻幀進行同步播放棋枕。
為實現(xiàn)音視頻幀同步,方案采用了三個線程妒峦。第一個線程是數(shù)據(jù)包獲取線程重斑,此線程進行數(shù)據(jù)抓包,分別將音頻數(shù)據(jù)包和視頻數(shù)據(jù)包放入音頻包隊列和視頻包隊列肯骇;第二個線程是視頻幀播放線程窥浪,由于視頻流可看做是一組分布不均勻的離散圖像序列祖很,所以需要以系統(tǒng)時間戳為基準,根據(jù)每一幀的時間戳來進而確定此幀圖像的播放時機漾脂;第三個線程是音頻幀播放線程假颇,由于音頻幀序列分布均勻,所以只需不間斷的向設備中寫入音頻數(shù)據(jù)即可骨稿。
由此笨鸡,一個功能簡單的音視頻播放器即可完成。