基于SMP86 54芯片的MKV播放器設(shè)計
在解析方面,解析的效率關(guān)系到能否盡快將數(shù)據(jù)讀入緩沖區(qū),如果處理時間過長,造成一段時間內(nèi)緩沖區(qū)為空,這時候就會出現(xiàn)卡頓。 MKV文件中通常包含一路視頻、多路音頻和多路字幕,播放時只選中其中一路音頻和一路字幕,其他路的數(shù)據(jù)可以被視為無效數(shù)據(jù)。在解析時,可以根據(jù)Block頭的標記判斷出這路數(shù)據(jù)是當前播放需要的有效數(shù)據(jù)還是無效數(shù)據(jù)。如果是有效數(shù)據(jù),則繼續(xù)解析,并將音視頻數(shù)據(jù)送入緩沖區(qū),如果是無效數(shù)據(jù),不進行解析,直接移動文件指針到下一個Block,這樣可大大加快文件解析和數(shù)據(jù)讀取速度。
在播放方面,通常播放時的處理流程是讀取一幀數(shù)據(jù),然后送入硬件解碼器,等到收到硬件解碼器為空的信號,再讀取下一幀的數(shù)據(jù)。如果是處理低碼率文件的播放,這樣做不會有問題,但是當文件分辨率比較高,碼率比較高時,解析讀取時問和解碼時間都會增加,這樣做就會造成卡頓。為解決這個問題,我們在內(nèi)存中設(shè)計了一個緩沖FIFO,相當于一個滑動窗口(圖4),緩沖區(qū)可以存放若干個幀(一幀就是一個Block,根據(jù)幀的大小緩沖區(qū)存放的個數(shù)不等)。當緩沖區(qū)未滿時,讀取文件中的一個Block并解析,然后將實際數(shù)據(jù)到緩沖區(qū)的隊尾。當發(fā)現(xiàn)硬件緩沖區(qū)空閑時,將FIFO隊首的數(shù)據(jù)從內(nèi)存直接送入硬件緩沖區(qū),不需要再去讀取文件。由于緩沖區(qū)中有多個幀,能夠提供一定的緩沖,這樣在碼率波動時就仍然能夠及時提供數(shù)據(jù),避免出現(xiàn)硬件緩沖區(qū)為空造成的卡頓,播放不流暢等問題。
4 結(jié)語
本文詳細介紹了MKV封裝格式的特點。并基于SMP86 54提出了一種MKV播放器的設(shè)計與實現(xiàn)方案,經(jīng)驗證,能夠達到對高清MKV文件的流暢播放,并已經(jīng)實際應(yīng)用到產(chǎn)品上。接下來將做進一步研究,在MKV播放器的基礎(chǔ)上,設(shè)計一種針對多種封裝格式的通用媒體播放器框架,將FLV、FLAC等其他格式也融合進來,并提供較好的可擴展性,方便后續(xù)擴充其他的封裝格式。
評論