<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    H264 TS/ES

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    ES流(Elementary Stream): 也叫基本碼流,包含視頻、音頻或數據的連續碼流.

          PES流(Packet Elementary Stream): 也叫打包的基本碼流, 是將基本的碼流ES流根據需要分成長度不等的數據包, 并加上包頭就形成了打包的基本碼流PES流.

          TS流(Transport Stream): 也叫傳輸流, 是由固定長度為188字節的包組成, 含有獨立時基的一個或多個program, 一個program又可以包含多個視頻、音頻、和文字信息的ES流; 每個ES流會有不同的PID標示. 而又為了可以分析這些ES流, TS有一些固定的PID用來間隔發送program和ES流信息的表格: PAT和PMT表.

    (在MPEG-2系統中,由視頻, 音頻的ES流和輔助數據復接生成的用于實際傳輸的標準信息流稱為MPEG-2傳送流)

          封裝 : 就是捆綁打包, 將畫面視頻文件和音軌文件打包在一起, 并按照一定規則建立排序和索引, 便于播放器或播放軟件來索引播放. 包括AVI / PS(Program Stream)/ TS(Transport Stream)/ MKV(Matroska)等.

     

    1. 視頻解碼的整個流程大致如下:

     

    點擊查看原始尺寸

     

     

          說明了視頻文件解碼的整個過程,而在做s3c6410硬件解碼中,我們需要關注的是怎樣把一個視頻文件(avi/mkv/mp4)拿來,然后做demuxer變成raw video stream,接著就能輸入到硬件中:

    點擊查看原始尺寸

    得到raw video后視頻解碼的整個過程,在編寫過程中主要用到的API以及包含的文件如下圖:

    點擊查看原始尺寸

    點擊查看原始尺寸

    單純的從raw video到播放比較簡單,大部分的api都有了根據demo的程序改改,就可以基本解決了。

    但還是有很多沒搞定的:

    1. 解復用demux這部分,我用ffmpeg來分流,avi格式的文件直接獲取流以后,

    while(av_read_frame(pFormatCtx, &packet) >= 0) 
        { 
            if(packet.stream_index == videoStream) 
            {}}

    就可以一幀一幀的把他導入到另外一個文件中,然后就是可以播放的,但是ISO Media的就不行,mkv也不行。不知道是不是跟video container的格式有關。

     

    2. 在硬件解碼過程中,manual中說了,S3C6410 MFC codec支持兩種模式的輸入流(LINE_BUF和RING_BUF)。

    LINE_BUF是the application needs to fill the input buffer with the video stream of the exact size of one frame.

    RING_BUF是the application needs to fill the input buffer with the video stream of the size of PART. The size of PART is determined by the device driver.

    點擊查看原始尺寸

    但什么時候用RING_BUF什么時候用LINE_BUF我沒弄明白。LINE_BUF, RING_BUF支持4種流解碼的,而我在樣例程序中使用的是LINE_BUF,測試的視頻卻是m4v, 264, rcv(上表中用ring_buf)。對這兩個模式認識非常混亂。有待進一步研究。

    感謝:http://qwdu.cublog.cn/

    仔細看下MFC的那幾個文檔就可以了,文件封裝的H264可能需要自己做demuxer,那個文檔里面里面有提,ring buf模式支持文件封裝的數據,我沒測試,linebuf只支持標準的es流,我是用mplayer把文件demuxer出來的h264數據送到 linebuf模式的mfc,這樣來測試的。 
    網絡上取H264數據,是rtp/udp還是http?反正都是文件封裝的問題,最好用基本的es 流,如果沒有文件封裝,那需要在本地解析組裝NAL

    在第二個Q的回答中,我提到了兩者區別,ring_buf模式中,mfc使用了自身的一些文件容器的封裝,這樣就不需要文件容器的解析這一步,line_buf是支持編碼的幀數據,這樣的數據必須從文件容器中解析才來得到 

    TS流的解碼過程-ES-PES-DTS-PTS-PCR

    TS 流解碼過程:

    1. 獲取TS中的PAT

    2. 獲取TS中的PMT

    3. 根據PMT可以知道當前網絡中傳輸的視頻(音頻)類型(H264),相應的PID,PCR的PID等信息。

    4. 設置demux 模塊的視頻Filter 為相應視頻的PID和stream type等。

    5. 從視頻Demux Filter 后得到的TS數據包中的payload 數據就是 one piece of PES,在TS header中有一些關于此 payload屬于哪個 PES的 第多少個數據包。 因此軟件中應該將此payload中的數據copy到PES的buffer中,用于拼接一個PES包。

    6. 拼接好的PES包的包頭會有 PTS,DTS信息,去掉PES的header就是 ES。

    7. 直接將 被拔掉 PES包頭的ES包送給decoder就可以進行解碼。解碼出來的數據就是一幀一幀的視頻數據,這些數據至少應當與PES中的PTS關聯一下,以便進行視音頻同步。

    8. I,B,B,P 信息是在ES中的。

     

     

    ES 是直接從編碼器出來的數據流,可以是編碼過的視頻數據流,音頻數據流,或其他編碼數據流的統稱。 ES 流經過 PES 打包器之后,被轉換成 PES 包。 PES 包由包頭和 payload 組成.

     

     PES 層,主要是在 PES 包頭信息中加入 PTS( 顯示時間標簽 )  DTS (解碼時間標簽)用于視頻、音頻同步。 其實, Mpeg-2 用于視音頻同步以及系統時鐘恢復的時間標簽分別在 ES  PES  TS  3 個層次中。在 ES 層,與同步有關的主要是視頻緩沖驗證 VBV  Video Buffer Verifier ),用以防止解碼器的緩沖器出現上溢或下溢;在 PES 層,主要是在 PES 頭信息里出現的顯示時間標簽 PTS  Presentation Time Stamp )和解碼時間標簽 DTS  Decoding Time Stamp );在 TS 層中, TS 頭信息包含了節目時鐘參考 PCR  Program Clock Reference ),用于恢復出與編碼端一致的系統時序時鐘 STC  System Time Clock )。

    基本流程如下:首先 MPEG-2 壓縮編碼得到的 ES 基本流,這個數據流很大,并且只是 I  P  B 的這些視頻幀或音頻取樣信息,然后加入一些同步信息,打包成長度可變長度的數據包 PES ,原來是流的格式,現在成了數據包的分割形式。同時要注意的是, ES 是只包含一種內容的數據流,如只含視頻,或只含音頻等,打包之后的 PES 也是只含一種性質的 ES, 如只含視頻 ES  PES, 只含音頻 ES  PES 等。可以知道, ES 是編碼視頻數據流或音頻數據流,每個 ES 都由若干個存取單元( AU )組成,每個視頻 AU 或音頻 AU 都是由頭部和編碼數據兩部分組成, 1  AU 相當于編碼的 1 幅視頻圖像或 1 個音頻幀,也可以說,每個 AU 實際上是編碼數據流的顯示單元,即相當于解碼的 1 幅視頻圖像或 1 個音頻幀的取樣。 PEG-2 對視頻的壓縮產生 I 幀、 P 幀、 B 幀。把幀順序 I1,P4,B2,B3,P7,B5,B6 幀的編碼 ES ,通過打包并在每個幀中插入 PTS/DTS 標志,變成 PES 。在插入 PTS/DTS 標志時,由于在 B  PTS  DTS 相等,所以無須在 B 幀多插入 DTS 。而對于 I   P 幀,由于經過復用后數據包的順序會發生變化,顯示前一定要存儲于視頻解碼器的從新排序緩存器中,經過從新排序后再顯示,所以一定要同時插入 PTS  DTS 作為從新排序的依據。

     

    其中,有否 PTS/DTS 標志,是解決視音頻同步顯示、防止解碼器輸入緩存器上溢或下溢的關鍵所在。 PTS 表明顯示單元出現在系統目標解碼器( STD- System Target Decoder )的時間 , DTS 表明將存取單元全部字節從 STD  ES 解碼緩存器移走的時刻。 視頻編碼圖像幀次序為 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9  ES ,加入 PTS/DTS 后,打包成一個個視頻 PES 包。每個 PES 包都有一個包頭,用于定義 PES 內的數據內容,提供定時資料。每個 I  P  B幀的包頭都有一個 PTS  DTS ,但 PTS  DTS  B 幀都是一樣的,無須標出 B 幀的 DTS 。對 I 幀和 P 幀,顯示前一定要存儲于視頻解碼器的重新排序緩存器中,經過延遲(重新排序)后再顯示,一定要分別標明 PTS  DTS 。例如,解碼器輸入的圖像幀次序為 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9 ,依解碼器輸出的幀次序,應該 P4  B2  B3 在先,但顯示時 P4 一定要比 B2  B3 在后,即 P4 要在提前插入數據流中的時間標志指引下,經過緩存器重新排序,以重建編碼前視頻幀次序 I1,B2,B3,P4,B5,B6,P7,B8,B9,I10 。顯然, PTS/DTS 標志表明對確定事件或確定信息解碼的專用時標的存在,依靠專用時標解碼器,可知道該確定事件或確定信息開始解碼或顯示的時刻。例如, PTS/DTS 標志可用于確定編碼、多路復用、解碼、重建的時間。

           PCR   

    PCR 是 TS 里面的,即 TS packet 的 header 里面可能會有,他用來指定所期望的該 ts packet 到達 decoder 的時間,他的作用于 SCR 類似。

     

     

    DTS, PTS

    對于一個 ES 來說,比如視頻,他有許多 I,P,B 幀,而 P, B 幀都是以 I , P 幀作為參考。由于 B 幀是前向后向參考,因此要對 B 幀作 decode 的話,就必須先 decode 該 B 幀后面的 幀( P, 或者 I 幀),于是, decode 的時間與幀的真正的 present 的時間就不一致了,按照 DTS 一次對各個幀進行 decode ,然后再按照 PTS 對各個幀進行展現。

    有時候 PES 包頭里面也會有 DTS , PTS ,對于 PTS 來說,他代表了這個 PES 包得 payload 里面的第一個完整地 audio access unit 或者 video access unit 的 PTS 時間(并不是每個 audio/video access unit 都帶有 PTS/DTS ,因此,你可以在 PES 里面指定一個,作為開始)。

    PES 包頭的 DTS 也是這個原理,需要注意的是:對于 video 來說他的 DTS 和 PTS 是可以不一樣的,因為 B 幀的存在使其順序可以倒置。而對于 audio 來說, audio 沒有雙向的預測,他的 DTS 和 PTS 可以看成是一個順序的,因此可一直采用一個,即可只采用 PTS。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全