TS流解析【PCR】自己的總結


http://www.cnblogs.com/ztteng/articles/3166025.html

http://blog.csdn.net/liuhongxiangm/article/details/8981032

http://blog.sina.com.cn/s/blog_6b94d5680101ton7.html

http://blog.csdn.net/jl2011/article/details/47044647 

 

二.TS流包含的內容

一段TS流,必須包含PAT包、PMT包、多個音頻包、多個視頻包、多個PCR包、以及其他信息包PSI。

解析TS流數據的流程:查找PID為0x0的包,解析PAT,PAT包中的program_map_PID表示PMT的PID;查找PMT,PMT包中的elementary_PID表示音視頻包的PIDPMT包中的PCR_PID表示PCR的PID有的時候PCR的PID跟音頻或者視頻的PID相同,說明PCR會融進音視頻的包,注意解析,有的時候PCR是自己單獨的包;CAT、NIT、SDT、EIT的PID分別為: 0x01、0x10、0x11、0x12

 

PSI被分為4個表結構,他們應被進一步划分為各個段(SECTION)並插入到傳輸流TS分組中,一些帶有預先規定的PID,另一些帶有用戶可選的PID。

 

 

TS包中凈荷所承載的信息包括以下3種:

 

•    1、視頻/音頻的PES包以及輔助數據

 

•    2、描述單路節目復用信息的節目映射表(PMT)

 

•    3、描述單路節目復用信息的節目關聯表(PAT)

 

 

•    (1)系統復用時,對視頻和音頻的ES流進行打包,形成視頻和音頻的PES流,輔助數據不需要打成PES包.

•    (2)視頻和音頻的PES包以一幀編碼圖像為單位,音頻PES包恆定長度,視頻PES包長度可變。

•    (3)PES包的長度通常都是遠大於TS包的長度,一個PES包必須由整數個TS包來傳送,沒裝滿的TS包由填充字節填充。

•    (4)TS包長度固定,188字節,有效凈荷184字節。

 

一個PMT表包含了與單路節目復用有關的節目信息,典型的構成包括1路視頻ES流,2-5路音頻ES流,1路或多路輔助數據。

•    進行TS流復用時,各路ES流被分配了唯一的PID,ES流與被分配的PID值間的關系構成了一張表,稱為節目映射表PMT。

•    PMT完整描述了一路節目由哪些ES流組成,他們的PID分別是什么。

•    MPEG-2傳送層中,傳送PMT表的碼流稱為控制碼流,和其他ES流一樣,在TS包的凈荷中傳送,分配唯一的PID.

•    PAT包含了與多路節目復用有關的控制信息。

•    PAT描述了系統級復用中傳送每路節目PMT的碼流的PID。

•    PAT作為一個獨立的碼流,裝載在TS包的凈荷中傳送,分配唯一的PID。傳送PAT的碼流的PID值定義為固定的數值“0”。

•    若復用時(mux時)遇到有不同碼流的PID值相同,則必須把它記錄下來,記錄在PAT和PMT中

•    允許單路數字電視節目可由其中某些節目流(例如視頻,不同音頻,不同字幕)任意組合構成,節目可根據需要ES碼流進行增加或刪除。

•    允許對多路節目進行靈活復用,若其中某些節目流發生變化,只需要將PAT和PMT做相應修改即可。

•    能夠在TS級上提供本地節目插入和條件接收等對廣播界非常重要的功能。

 

 

 

PES包格式:

PES再打包成TS流或PS流,往往一個PES會分存到多個ts包中

每個ES都由若干個存取單元(AU)組成,每個視頻AU或音頻AU都是由頭部和編碼數據兩部分組成,1個AU相當於編碼的1幅視頻圖像或1個音頻幀,也可以說,每個AU實際上是編碼數據流的顯示單元,即相當於解碼的1幅視頻圖像或1個音頻幀的取樣。

簡而言之:一個AU對應一個幀,一個ES由多個幀組成

 

  •   PAT

–  每個TS流一個,每隔0.5秒重復。

–  描述TS流中有多少個節目。

–  包含該表的TS包的PID為0,便於識別。

–  PAT的payload中傳送特殊PID的列表,每個PID對應一個節目。

–  這些PID是描述每個獨立節目詳細信息的指針。

–  PID指向PMT表。

•    PMT

–  對應TS包有特殊的PID和特殊的payload。

–  PMT的PID由PAT傳送。

–  例如要接收節目3時,先從PAT的payload中的所有PID列表中選出節目3的PID為1FF3hex,然后查找包頭中PID=1FF3hex的TS包,就是節目3的PMT。

–  PMT包含該節目中所有ES流(視頻、音頻或數據)的PID

一個節目可能有多個視頻和音頻流,解碼器必須選擇2個PID,一個視頻流的PID(100hex),一個音頻流的PID(200hex)。

此后解碼器只收集這些TS包,解復用,重新組成PES包,這些PES包再送到視頻或音頻解碼器。

傳輸過程中TS流的結構也可能發生改變。解碼端機頂盒,如DVB-S,必須連續檢測TS流瞬時結構,讀出PAT和PMT,做自適應調整。

 

•    PAT和PMT讀出以后,用戶確定出一個節目的兩個PID:

    待解碼視頻信號的PID(如100hex)

    待解碼音頻信號的PID(如200hex)

解碼器只處理這兩個PID的TS包:

    解復用過程中,PID為100hex的所有TS包集合成視頻PES包,送到視頻解碼器。

    同樣,PID為200hex的所有TS包重新集合成音頻PES包,送到音頻解碼器。

如果ES流沒有加擾,這時可以直接解碼。

 

 對付費電視或許可證和地域限制等情況,ES流利用電子碼進行傳輸保護。

–  ES流利用各種方法進行混擾,接收端必須配有附加硬件並授權。

–  附加硬件必須有TS流中合適的解擾和授權數據。

–  因此TS流中傳送一個特殊的表CAT(conditionalaccess table)

•  CAT提供了TS流其他數據包的PID,該數據包傳送了解擾所需信息

–  ECM(entitlement control message)     用於傳送加擾碼

–  EMM(entitlement management message)     用於用戶管理

•    只有ES流本身可以加擾,TS包頭、表格和adaptation field不能加擾

•    解擾本身在MPEG解碼器以外的附加硬件設備進行,附加硬件與解擾方法相關,可以做成智能板卡通過CI(common interface)插入機頂盒。

•    在MPEG解碼器做進一步處理之前,TS流在該硬件設備中循環。

•    ECM和EMM的信息,以及用戶的個人碼可以將碼流解擾。

–  亮度信號采樣頻率13.5MHz,色度信號6.75MHz。27MHz是采樣頻率的倍數,作為發送端MPEG編碼器所有處理過程的參考或基本頻率。

–  編碼器中27MHz振盪器作為系統時鍾(STC)的輸入。

–  STC是42bit計數器,由27MHz時鍾計數,溢出后重新從0開始。

–  接收端也必須提供STC,其27MHz振盪器和42bit計數器必須與編碼器STC完全同步。

MPEG碼流中需傳送參考信息——PCR(program clock reference),即在固定時刻將最新的STC計數器值復制到TS流中

•    碼流中傳送的PCR值必須足夠多,有最大間隔的限制;而且要相對准確,沒有抖動。

MPEG標准規定:

–  每個節目PCR的最大間隔為40ms。

–  PCR的抖動小於±500ns。

•    PCR如果出錯:

–  本來應該顯示彩色圖像,卻顯示出黑白圖像。

–  TS流重復用時會出現抖動,因為TS包順序改變,但其中PCR信息卻沒變。經常會有最大±30μs的PCR抖動,該問題許多機頂盒可以解決。

•    PCR信息在相應節目TS包的adaptation field中傳送,而TS包類型的准確信息可以從PMT中獲得。

•    節目時鍾同步以后,視音頻編碼就可以鎖定系統時鍾進行了。

•    歐洲DVB項目組和美國ATSC項目組都定義了數字視音頻節目傳輸的附加信息,以便簡化機頂盒操作,使其更加人性化:

–  在TS流中傳送節目名稱來分辨不同節目;

•    MPEG-2為擴展留有空間,在PSI、PMT和CAT之外,TS流中還可以有private tables,定義了用戶表的結構以及如何將用戶表插入到TS流中

 

 

TS包頭定義:

typedef struct TS_packet_header
{
    unsigned sync_byte                        : 8; //同步字節, 固定為0x47,表示后面的是一個TS分組
    unsigned transport_error_indicator        : 1; //傳輸誤碼指示符
    unsigned payload_unit_start_indicator    : 1; //有效荷載單元起始指示符
   
    unsigned transport_priority              : 1; //傳輸優先, 1表示高優先級,傳輸機制可能用到,解碼用不着
    unsigned PID                            : 13; //PID
    unsigned transport_scrambling_control    : 2; //傳輸加擾控制 
    unsigned adaption_field_control            : 2; //自適應控制 01僅含有效負載,10僅含調整字段,11含有調整字段和有效負載。為00解碼器不進行處理
    unsigned continuity_counter                : 4; //連續計數器 一個4bit的計數器,范圍0-15
TS_packet_header;    //總共32位,4個字節

 

TS包, 很多地方packet譯為分組,即傳輸分組,XX分組

 

  • sync_byte

是包中的第一個字節,TS包以固定的8bit的同步字節開始,所有的TS傳送包,同步字都是唯一的OX47,用於建立發送端和接收端包的同步。

MPEG-2解碼器接收到MPEG-2 TS流時,首先檢測包結構,在TS流中查找同步字節:

總是OX47,總位於TS包開始位置,固定間隔為188字節。同時滿足這兩個條件,可以確定同步。

如果出現一個字節為47hex(OX47),解碼器將檢測這個字節前后n倍188字節的位置是否也是同步字節。

如果是,則當前字節為同步字節;否則,當前字節只是碼流中偶爾出現的47hex,不是同步字節。

接收端收到5個TS包之后開始同步。丟包3個之后解碼器即失步,需重新同步。

  • transport_error_indicator

用於從解碼器向分接器指示傳輸誤碼。若這個比特被設置,表示此TS包中所攜帶的凈荷信息有錯誤,無法使用。

傳輸錯誤標志位,一般傳輸錯誤的話就不會處理這個包了

  • payload_unit_start_indicator

有效負載的開始標志
標志PES包頭以及包含節目特定信息的表(PMT,PAT)的頭是否出現在該包中,在失步后的重新同步中起着重要的作用
一個PES包會被封裝在很多小的TS包中,該標識指示是否是一個PES包的第一個TS包,用於重新同步

  • PID

PID是識別TS包的重要參數,用來識別TS包所承載的數據類型。在TS碼流生成時,每一類業務(視頻,音頻,數據)的基本碼流均被賦予一個不同的識別號PID,解碼器借助於PID判斷某一個TS包屬於哪一類業務的基本碼流。

               //0X00 -> PAT,  0x01->CAT, PMT與NIT的TS包的PID在PAT中指定

               //0X1FFF->空分組、空包, 0X0002-0X000F也被保留
               //ISO/IEC13818-1中定義,通過傳輸流傳送PSI表時, PSI應被划分為一個或多個段(SECTION)后, 將SECTION映射到傳輸流中進行傳送, ISO/IEC13818-1 中定義了這種傳輸段(SECTION)的語法結構,通過這種結構,將PSI的數據填充到傳輸流中進行傳送. 為什么要把PSI划為多個SECTION來傳輸了,一次傳輸不就行了? 因為每個TS包的數據負載能力是有限的,即每個TS包的長度是有限的,所以當有些PSI表很長很大時,就需要將表拆分成一個一個SECTION語法數據段,再把這鍾結構的SECTION填充到TS包中進行傳輸 
             【每一個段的長度不一,一個段的開始由TS包的有效負載中的payload_unit_start_indicator來標識】

DVB <wbr>傳輸流TS <wbr>傳輸流語法規格

 

 

   if (adaption_field_control == '10' || adaption_field_control == '11')
   {
        adaption_fields() //調整字段的處理
   }
   if (adaption_field_control == '01' || adaption_field_control == '11')
   {
       for(i = 0; i < N ; i++) // N值 = 184 - 調整字段的字節數
       {
 
       }
   }  
 
  • transport_scrambling_control

傳送信息通過加入擾碼來加密,各個基本碼流可以獨立進行加擾。加擾控制字段說明TS包中的凈荷數據是否加擾。如果加擾,標志出解擾的密匙。

 

  • adaption_field_control
調整字段控制
   0x0: // reserved for future use by ISO/IEC 
     0x1: // 無調整字段,僅含有效負載    
     0x2: // 僅含調整字段,無有效負載 
     0x3: // 調整字段后含有效負載 

適配域是一個可變長度的域,它在TS包中是否存在,由適配域控制標識決定。
  • continuity_counter

用於對傳輸誤碼進行檢測。在發送端對所有的包都做0-15的循環計數,在接收終端,如發現循環計數器的值有中斷,表明數據在傳輸中有丟失。

 

 

 

============

TS包頭解析:

oid adjust_TS_packet_header(TS_packet_header* pheader)
{
    unsigned char buf[4]; 
    memcpy(buf, pheader, 4);
    pheader->transport_error_indicator        = buf[1] >> 7;
    pheader->payload_unit_start_indicator    = buf[1] >> 6 & 0x01;
    pheader->transport_priority                = buf[1] >> 5 & 0x01;
    pheader->PID                            = (buf[1] & 0x1F) << 8 | buf[2];
    pheader->transport_scrambling_control    = buf[3] >> 6;
    pheader->adaption_field_control            = buf[3] >> 4 & 0x03;
    pheader->continuity_counter                = buf[3] & 0x03;

例如要提取結構體中的adaption_field_control,因為它是第26~27位,也就是第3(基於0)字節的第2~3位(共兩位),所以要取第3字節,然后右移2位(把右邊多余的2位拋棄),再“與”3(屏蔽左邊多余的位)。

 

 

==========================PCR================

http://dekst.awardspace.com/project/download/PCR.pdf

 
時間上的同步包括音頻和視頻上的同步,然而 在傳輸流(Transport Stream, TS)的傳輸過程中, 由於網絡延遲、復接,以及在適配器(網卡)中適時的加 入了空包和兆幀初始化包( Mega-frame Initialization Packet,MIP)等種種因素,使得附 帶音頻和視頻時間信息的兩個相鄰 PCR 的相對位 置發生了改變,這將可能造成接收端解出的圖像 出現馬賽克和唇音不同步等現象,即 PCR 發生了 抖動,因此,在單頻網適配器中,需要對接收到 的 PCR 信息進行校正
 
編碼器中使用一個 27MHz 的系統時鍾來產 生一系列時間標簽,包括指示音頻、視頻正確顯 示(PTS)和解碼的時間(DTS),以及采樣過程中系統時鍾本身 的瞬時值。
在 TS 流中描述該系統時鍾瞬時值的時 間標簽稱為節目參考時鍾標簽(PCR),是編碼器 27MHz 系統時鍾的 42 比特采樣值。
解碼器中也 有一個 27MHz 的系統時鍾,它根據打包的基本碼 流 (Packetized Elementary Stream, PES)中的顯 示時間標簽 (Presentation Time Stamp, PTS)和 解碼時間標簽 (Decoding Time Stamp, DTS)字段 所指示的時間進行解碼和顯示。
如果前端編碼器 的時鍾與后端解碼器中時鍾“絕對”同步,那么 TS 傳輸流中的 PCR 就沒有任何意義了
但是如 果“絕對”變為“相對”以后,它們之間的“微 小”誤差經過長時間的累積(1~2 小時足以),機 頂盒中解碼器就會因為自己的時鍾“快”了而造 成 buffer 中沒有數據(即停幀),或是因為時鍾“慢” 了而造成 buffer 中數據溢出(即丟幀)。
所以 解碼 器就需要用 TS 流中的 PCR 字段來不斷修正自己 與編碼器時鍾之間的“微小”誤差
同時 TS 流經 過適配器時,在原有的 TS 流中插入了用於調整 速率的空包和控制TS流傳輸的MIP包,因此PCR 必須進行非均勻延遲修正
 
  • PCR的查找和提取

在 TS 流的傳輸過程中,並不是每一個 TS 包 (188 個字節)都帶有 PCR 信息,這樣,在處理 流入單頻網適配器中的 TS 流的 PCR 信息時,就 需要先查找到 PCR 信息,將其提取出來,然后再 對 PCR 信息進行修正。

 

如上圖所示,PCR是存在自適應區的。有沒有自適應區由TS包頭中的adaption_field_control字段控制。

如果有自適應區,那么其內容存放在TS流中數據域中,在有效負載(音視頻數據)之前。

 

圖 1 給出了 TS 流的幀結構,由此可以看出, 要查找 PCR,首先應檢查包頭中自適應控制位adaption_field_control的 值,當其為“10”或“11”時,表示連續計數器后緊跟 着自適應區,當其為“00”或“01”時,就不存在自適 應區,那么,連續計數器后緊跟着的就是有效負 載。

 

當判定 TS 包中存在自適應區后,就查詢自適應區中的 PCR 標志位是否為 1,如果是 1,則該 TS 包中有 PCR 信息,且 PCR 信息就存放在可選 字段的前 48 位中

 

4. PCR 改進校正算法

對 PCR 字段進行校正的基本思路是在原始的 PCR 上加上一個校正值。一般校正值的計算公式 如下:

∆PCR = delact − delconst (4)

其中,delact是某 TS 流的 PCR 從進入本地系統到 離開系統所經歷的實際延遲,delconst 是節目的所 有 PCR 使用的一個常數。

假定 PCR 進入適配器時,本地有一個以 27MHZ 時鍾計數的計數器,此時該計數器的值記 為 PCRin;當 PCR 離開適配器時,計數器的值記 為 PCRout,

那么: ∆PCR = PCRout − PCRin (5)

 

對 PCR 先做減法后做加法,中間的差值實質 上就是系統引入非恆定延時所需要校正補償的 值,這樣就間接地實現了 PCR 校正

按照上述原理,傳統的 PCR 間接校正算法就 是在 TS 流進入單頻網適配器時,經過 PCR 包查 找和 PCR 域定位,將 PCR 域中的值提取出來和 本地計數器的當前計數值相減,差值存入 FIFO 當中。

TS 流輸出時,又一次對 PCR 包進行查找 和域定位,然后從 FIFO 中取出數據,和本地計數 器的當前值相加,將結果按照 TS 包的格式轉換為6 個字節數據插入到 TS 流相應的 PCR 域里,從 而完成對 PCR 的校正。

 

這種設計方式和 PCR 直接校正算法(用 27MHZ 的計數器,直接記錄 PCR 信息從流入適 配器到流出適配器的時間,然后將這段時間直接 在輸出時加在原有的 PCR 值上)相比具有占用邏 輯資源少,不用記錄與當前 PCR 相匹配的計數器 號,及時序控制相對簡單等優點。

但是,由於本 文設計的是單頻網適配器中的 PCR 校正,在適配 器中,對TS流進行去空包處理時用到了一個FIFO 作為緩沖器,若用上訴 PCR 間接算法的設計方式, 還將用到一個 FIFO,兩個內部 FIFO 的使用將大 大提高對 FPGA 邏輯資源的占用。

另外,在 TS 輸入和輸出適配器時,都要進行 PCR 的查找和定 位,兩個過程完全相同,這也同樣增加了 FPGA 的邏輯資源占用

為了減少 FPGA 的邏輯資源占用率,優化設 計,我們在對 TS 流進行第一次 PCR 查找和定位 以后,就在原有的每個字節前均加上一個標志位。 當定位到的 PCR 域時,將 PCR 域的每個字節前 的標志位置 1;其他情況下,每個字節前的標志位 均為 0。這樣,在輸出 TS 流進行第二次查找和定 位 PCR 時,只需看字節前的標志位為 1 還是為 0, 只對標志位為 1 的字節進行處理即可。在第一次 查找定位 PCR 信息后,將 PCR 值提取出來與本 地計數器做了減法,差值不再放入 FIFO 而是重 新插入 TS 流中;輸出時再從 TS 流中取出這個 差值與本地計數器做加法,將結果再插回 TS 流, 完成 PCR 校正的間接算法。通過 TS 流本身來 傳遞減法差值,這樣就既節省了一個 FIFO 所要 占用的邏輯資源,又避免了在減法差值存儲過程 中對 FIFO 的讀寫控制,徹底杜絕了數據競爭冒 險的潛在危險,同時還簡化了程序。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM