新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 基于SMP8654的MKV播放器設計與實現

        基于SMP8654的MKV播放器設計與實現

        作者: 時間:2010-09-07 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/166596.htm

        10e.jpg


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

        10f.jpg

        4 結語
        本文詳細介紹了MKV封裝格式的特點。并提出了一種MKV方案,經驗證,能夠達到對高清MKV文件的流暢播放,并已經實際應用到產品上。接下來將做進一步研究,在MKV的基礎上,一種針對多種封裝格式的通用媒體框架,將FLV、FLAC等其他格式也融合進來,并提供較好的可擴展性,方便后續擴充其他的封裝格式。

        adc相關文章:adc是什么



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 襄垣县| 林口县| 定边县| 东乌珠穆沁旗| 文登市| 高碑店市| 邛崃市| 武宁县| 宜君县| 石柱| 黄陵县| 得荣县| 宜良县| 通山县| 上犹县| 日照市| 伊金霍洛旗| 东兴市| 汝州市| 五大连池市| 禹城市| 务川| 黄平县| 和田县| 余姚市| 黄龙县| 海盐县| 甘泉县| 乡宁县| 临潭县| 天镇县| 垦利县| 石棉县| 乡城县| 云林县| 庆阳市| 兴和县| 浮山县| 正镶白旗| 正蓝旗| 台安县|