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

          新聞中心

          EEPW首頁(yè) > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > 基于SMP8654的MKV播放器設(shè)計(jì)與實(shí)現(xiàn)

          基于SMP8654的MKV播放器設(shè)計(jì)與實(shí)現(xiàn)

          作者: 時(shí)間:2010-09-07 來(lái)源:網(wǎng)絡(luò) 收藏

          文件格式的顯著特點(diǎn)是模塊化、結(jié)構(gòu)化存儲(chǔ)。每一個(gè)高一級(jí)的元素由若干次一級(jí)的元素組成,直至最基本的組成元素,每個(gè)元素都是一個(gè)TLV結(jié)構(gòu)。一個(gè)標(biāo)準(zhǔn)的文件有兩部分組成:EBML Header和Segment。EBML Header由EBMLVersion、DocType等子元素組成,包含了文件的版本、文檔類型等相關(guān)信息。Segment部分保存了媒體文件的視頻和音頻的實(shí)際數(shù)據(jù),其data部分又可以分為SeekHead、Tracks、Cluster等若干子元素(表1)。所有元素的處理都可以按照一個(gè)統(tǒng)一的流程來(lái)進(jìn)行。我們可以仿照TCP/IP協(xié)議分層的思想,對(duì)每一層的每個(gè)功能都用一個(gè)函數(shù)來(lái)完成,使用更底層的函數(shù)完成此項(xiàng)功能,并可被更高層的函數(shù)調(diào)用。文件解析時(shí),從文件頂層開(kāi)始,每當(dāng)上一級(jí)的元素解析到有某個(gè)子元素時(shí),調(diào)用此函數(shù)進(jìn)行次一級(jí)的解析,依次直至文件結(jié)束,即可完成對(duì)文件的解析處理。整個(gè)的解析調(diào)用過(guò)程如圖3所示。Hea-der Parse和Segment Parse為文件最上層的元素解析函數(shù),Cluster Parse、Tracks_Parse等為次一級(jí)組成元素的解析函數(shù)。ebml_read_ele-ment_idebml read element length為最底層基本組成元素的解析函數(shù)。

          本文引用地址:http://www.ex-cimer.com/article/166596.htm

          10e.jpg


          3.2 設(shè)置硬件解碼器音視頻核心參數(shù)
          Tracks用來(lái)描述文件中包含的每一路多媒體流的信息。一路多媒體流用一個(gè)TrackEntry描述,所有的track都要在一個(gè)Tracks中進(jìn)行描述。一個(gè)TrackEntry主要包含:TrackNumber(判定屬于哪一路流的ID)、TrackType(video、audio或者subtitle)、TimeScale(時(shí)間戳單位)、CodecID(編碼格式);CodecPrivate(不同的編碼格式所需的私有數(shù)據(jù))等;對(duì)于視頻,還包含以下信息:PixelWidth、PixelHeight等。對(duì)于音頻,track還包含以下信息:channels、Sampling Frequency等。這些是關(guān)于音視頻能否正確解碼播放的關(guān)鍵參數(shù),需要在解析時(shí)獲得,然后通過(guò)硬件操縱函數(shù)設(shè)置。
          Cluster包含實(shí)際的數(shù)據(jù),一個(gè)Cluster塊,通常是幾秒鐘時(shí)間跨度的媒體數(shù)據(jù),一個(gè)文件有數(shù)以千計(jì)的Cluster。每個(gè)Cluster又有若干個(gè)BlockGroup。根據(jù)Cluster和BlockGroup的起始pts和持續(xù)時(shí)間,可以計(jì)算出當(dāng)前Block的實(shí)際pts。PTS是用來(lái)確定播放時(shí)間的重要數(shù)據(jù),也是音視頻同步的關(guān)鍵信息。這部分信息要在送入視頻或音頻數(shù)據(jù)的同時(shí)設(shè)置硬件解碼器。
          3.3 性能優(yōu)化
          MKV封裝的影片通常為高清影片,分辨率在1920×1080,即使采用H.264等先進(jìn)編碼格式,碼率依然非常高。同時(shí),MKV支持可變碼率,可變碼率能夠減少文件的體積,但是劇烈波動(dòng)的碼率會(huì)使播放不能流暢進(jìn)行。在高清文件中碼率一般在10~30M/ps之間,最高可達(dá)60Mp/ s,如此高的碼率,如果不做特殊處理,播放時(shí)很容易出現(xiàn)卡頓,播放不流暢等問(wèn)題。為解決這個(gè)問(wèn)題,我們從兩方面考慮。
          在解析方面,解析的效率關(guān)系到能否盡快將數(shù)據(jù)讀入緩沖區(qū),如果處理時(shí)間過(guò)長(zhǎng),造成一段時(shí)間內(nèi)緩沖區(qū)為空,這時(shí)候就會(huì)出現(xiàn)卡頓。 MKV文件中通常包含一路視頻、多路音頻和多路字幕,播放時(shí)只選中其中一路音頻和一路字幕,其他路的數(shù)據(jù)可以被視為無(wú)效數(shù)據(jù)。在解析時(shí),可以根據(jù)Block頭的標(biāo)記判斷出這路數(shù)據(jù)是當(dāng)前播放需要的有效數(shù)據(jù)還是無(wú)效數(shù)據(jù)。如果是有效數(shù)據(jù),則繼續(xù)解析,并將音視頻數(shù)據(jù)送入緩沖區(qū),如果是無(wú)效數(shù)據(jù),不進(jìn)行解析,直接移動(dòng)文件指針到下一個(gè)Block,這樣可大大加快文件解析和數(shù)據(jù)讀取速度。
          在播放方面,通常播放時(shí)的處理流程是讀取一幀數(shù)據(jù),然后送入硬件解碼器,等到收到硬件解碼器為空的信號(hào),再讀取下一幀的數(shù)據(jù)。如果是處理低碼率文件的播放,這樣做不會(huì)有問(wèn)題,但是當(dāng)文件分辨率比較高,碼率比較高時(shí),解析讀取時(shí)問(wèn)和解碼時(shí)間都會(huì)增加,這樣做就會(huì)造成卡頓。為解決這個(gè)問(wèn)題,我們?cè)趦?nèi)存中了一個(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ū)為空造成的卡頓,播放不流暢等問(wèn)題。

          10f.jpg

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

          adc相關(guān)文章:adc是什么



          上一頁(yè) 1 2 3 下一頁(yè)

          評(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); })();