<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于SMP86 54芯片的MKV播放器設(shè)計(jì)

          基于SMP86 54芯片的MKV播放器設(shè)計(jì)

          作者: 時(shí)間:2011-04-28 來源:網(wǎng)絡(luò) 收藏
          60Mp/ s,如此高的碼率,如果不做特殊處理,播放時(shí)很容易出現(xiàn)卡頓,播放不流暢等問題。為解決這個(gè)問題,我們從兩方面考慮。

            在解析方面,解析的效率關(guān)系到能否盡快將數(shù)據(jù)讀入緩沖區(qū),如果處理時(shí)間過長,造成一段時(shí)間內(nèi)緩沖區(qū)為空,這時(shí)候就會(huì)出現(xiàn)卡頓。 MKV文件中通常包含一路視頻、多路音頻和多路字幕,播放時(shí)只選中其中一路音頻和一路字幕,其他路的數(shù)據(jù)可以被視為無效數(shù)據(jù)。在解析時(shí),可以根據(jù)Block頭的標(biāo)記判斷出這路數(shù)據(jù)是當(dāng)前播放需要的有效數(shù)據(jù)還是無效數(shù)據(jù)。如果是有效數(shù)據(jù),則繼續(xù)解析,并將音視頻數(shù)據(jù)送入緩沖區(qū),如果是無效數(shù)據(jù),不進(jìn)行解析,直接移動(dòng)文件指針到下一個(gè)Block,這樣可大大加快文件解析和數(shù)據(jù)讀取速度。

            在播放方面,通常播放時(shí)的處理流程是讀取一幀數(shù)據(jù),然后送入硬件解碼器,等到收到硬件解碼器為空的信號(hào),再讀取下一幀的數(shù)據(jù)。如果是處理低碼率文件的播放,這樣做不會(huì)有問題,但是當(dāng)文件分辨率比較高,碼率比較高時(shí),解析讀取時(shí)問和解碼時(shí)間都會(huì)增加,這樣做就會(huì)造成卡頓。為解決這個(gè)問題,我們?cè)趦?nèi)存中設(shè)計(jì)了一個(gè)緩沖FIFO,相當(dāng)于一個(gè)滑動(dòng)窗口(圖4),緩沖區(qū)可以存放若干個(gè)幀(一幀就是一個(gè)Block,根據(jù)幀的大小緩沖區(qū)存放的個(gè)數(shù)不等)。當(dāng)緩沖區(qū)未滿時(shí),讀取文件中的一個(gè)Block并解析,然后將實(shí)際數(shù)據(jù)到緩沖區(qū)的隊(duì)尾。當(dāng)發(fā)現(xiàn)硬件緩沖區(qū)空閑時(shí),將FIFO隊(duì)首的數(shù)據(jù)從內(nèi)存直接送入硬件緩沖區(qū),不需要再去讀取文件。由于緩沖區(qū)中有多個(gè)幀,能夠提供一定的緩沖,這樣在碼率波動(dòng)時(shí)就仍然能夠及時(shí)提供數(shù)據(jù),避免出現(xiàn)硬件緩沖區(qū)為空造成的卡頓,播放不流暢等問題。

            

            4 結(jié)語

            本文詳細(xì)介紹了MKV封裝格式的特點(diǎn)。并基于SMP86 54提出了一種MKV播放器的設(shè)計(jì)與實(shí)現(xiàn)方案,經(jīng)驗(yàn)證,能夠達(dá)到對(duì)高清MKV文件的流暢播放,并已經(jīng)實(shí)際應(yīng)用到產(chǎn)品上。接下來將做進(jìn)一步研究,在MKV播放器的基礎(chǔ)上,設(shè)計(jì)一種針對(duì)多種封裝格式的通用媒體播放器框架,將FLV、FLAC等其他格式也融合進(jìn)來,并提供較好的可擴(kuò)展性,方便后續(xù)擴(kuò)充其他的封裝格式。


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();