本文意在設(shè)計(jì)一個(gè)最基礎(chǔ)的本地播放器的架構(gòu),不涉及網(wǎng)絡(luò)模塊魄幕。本文提及的各個(gè)模塊相艇,將在后續(xù)的文章中一一講解如何實(shí)現(xiàn)。
正文開始
從功能上分析纯陨,我們傳一個(gè)本地文件給播放器坛芽,需要播放器對(duì)文件解封裝、解碼為音視頻數(shù)據(jù)翼抠,需要音頻輸出模塊對(duì)解碼后的音頻進(jìn)行播放咙轩,需要視頻輸出模塊對(duì)解碼后的視頻數(shù)據(jù)進(jìn)行渲染。
然而簡(jiǎn)單的對(duì)音視頻數(shù)據(jù)渲染是不夠的阴颖,還必須保證音視頻的同步來保證用戶的視聽體驗(yàn)臭墨,所以還需要一個(gè)音視頻同步模塊來保證音視頻的同步。
另外膘盖,由于手機(jī)硬件的性能參差和用戶使用場(chǎng)景的復(fù)雜胧弛,為了讓用戶有更流暢的觀影體驗(yàn),我們?cè)谝粢曨l同步模塊中侠畔,在本地對(duì)解碼的音視頻做一個(gè)緩存(也方便以后向網(wǎng)絡(luò)點(diǎn)播和直播拓展)结缚,當(dāng)然緩存的數(shù)據(jù)需要一個(gè)上限,避免占用內(nèi)存過多软棺,需要一個(gè)下限红竭,低于這個(gè)下限的時(shí)候使用解碼模塊解碼數(shù)據(jù)進(jìn)行緩存。這里不可避免的涉及到多線程的使用,因?yàn)槿绻獯a和播放在同一個(gè)線程里茵宪,需要播放一幀的時(shí)候去解碼一幀最冰,或者解碼完一幀進(jìn)行播放,又或者邊緩沖邊播放稀火,都有可能會(huì)造成卡頓暖哨。
最后,選擇模塊凰狞,驅(qū)動(dòng)整個(gè)架構(gòu)運(yùn)轉(zhuǎn)篇裁。