mpeg-ts总结
ts header
結構
字段解釋
- sync_bye
- 是包中的第一個字節,TS包以固定的8bit的同步字節開始,所有的TS傳送包,同步字都是唯一的OX47,用于建立發送端和接收端包的同步。MPEG-2解碼器接收到MPEG-2 TS流時,首先檢測包結構,在TS流中查找同步字節:總是OX47,總位于TS包開始位置,固定間隔為188字節。同時滿足這兩個條件,可以確定同步。如果出現一個字節為47hex(OX47),解碼器將檢測這個字節前后n倍188字節的位置是否也是同步字節。如果是,則當前字節為同步字節;否則,當前字節只是碼流中偶爾出現的47hex,不是同步字節。接收端收到5個TS包之后開始同步。丟包3個之后解碼器即失步,需重新同步。
- payload_unit_start_indicator
- 對于PES的包,如果PES的包很大,一個ts包的大小固定為188字節,如果188個字節裝不下,那么就需要分包,假設總共要分3個包,那么第一包的PUSI就是1,剩下的兩個包就是0.然后下一個PES如果又分了三個包,同樣第一個ts包的PUSI是1,剩下的兩個是0
- 對于PSI的包,如果包很大,同樣需要分多個section,一個section分多個ts包,那么類似PES,第一個ts包的PUSI就需要設置為1.同時payload的第一個字節是pointer_field,指示新的section的第一個字節的位置。那么才能夠pointer_field的位置到新的section的第一個字節的位置的中間的這些byte,是上一個section的結尾部分。
- 0:有效載荷單元起始符為0,表示不是幀頭,不含PES包頭數據,只有PES負載(PES負載就是一幀數據)
- continuity_counter
- ffmpeg對continuit count的check是,無論是否一個新的pes開始,它的值總是0-15, 0-15,例如,pes1,最后一個包是12,那么新的一個pes2的第一個包,并不是0,而是13
adaption field
字段解釋
- PCR_Flag
- PCR主要用于對時
- stuffing_bytes
- 對于不足188字節的pes,填充0xff使用adaption field,而不是optional pes header的stuffing bytes
- 對于PES包,如果包的大小小于188個字節,那么必須要用自適應區域去填充到188字節
- 對于PSI,可以使用自適應區域,或者在后面填充0xFF,一般是在后面填充0xFF
PAT
字段解釋
- program_number
- 該號碼標志TS流的一個頻道,該頻道可包含很多節目(即可以包含多個Video PID和Audio PID),頻道和節目的關系,比如我們有中央電視臺綜合頻道,下屬CCTV-1 - CCTV14這些節目。一個PMT表格對應一個頻道,比如中央電視臺綜合頻道。而一個PMT里面包含所有節目的信息,比如CCTV1~CCTV14。
- pmt里面有個program number,pat里面也有個program number,這兩個不匹配,ffplay能播放,但是vlc不能播放,如果pmt的program number和pat的program number不匹配,會導致vlc無法播放
- program_map_PID
- 表示本頻道使用哪個PID做為PMT的PID,因為可以有很多的頻道,因此DVB規定PMT的PID可以由用戶自己定義
- PAT中可能包含多個頻道號,也就有多個PMT表格,一個頻道有多個節目
- section_length
- 多個PMT具體這個N是多少根據section_length來確定
- 段的大小,表示這個字節后面有用的字節數,包括CRC32.假如后面的字節加上前面的字節數少于188,后面會用0xFF填充,假如這個數值比較大,則PAT會分成幾部分來傳輸。
- section_syntax_indicator
- 固定為1 為了防止和ISO13818Video流格式中的控制字沖突而設置的
- transport_stream_id
- 該傳輸流的ID,區別于一個網絡中其他多路復用的流
- version_number
- 范圍0-31,表示PAT的版本號,標注當前節目的版本,這是個非常有用的參數,當檢測到這個字段改變時,說明TS流中的節目已經改變了,程序必須重新搜索節目
- current_next_indicator
- 表示發送的PAT是當前有效還是下一個PAT有效
- section_number
- 分段的號碼,PAT可能分為多個段傳輸,第一段為00,以后每個分段加1,最大可能有256個分段
- 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來標識】
- 偽代碼
- last_section_number
- 最后一個分段的號碼
- network_PID
- 網絡信息表(NIT)的PID,網絡信息表提供了該物理網絡的一些信息,和電視臺相關的,節目號為0時對應的PID為network_PID
PMT
字段解釋
- current_next_indicator
- 當該位置0時,指示當前傳送的Program map section不可用,下一個TS流的Program map section有效。
- program_info_length
- 前兩位bit為00。該域指出跟隨其后對節目信息的描述的byte數。
此為12 比特字段,該字段的頭兩比特必為‘00’,剩余10 比特指定該分段的字節數,緊隨section_length 字段開始,并包括CRC。此字段中的值應不超過1021(0x3FD).段長度,從program_number開始,到CRC_32(含)的字節總數
- 前兩位bit為00。該域指出跟隨其后對節目信息的描述的byte數。
- program_number
- 為16bit的頻道號碼,與PAT的program_number相對應,表示當前PMT關聯到的頻道
- version_number
- 用于通知解復用程序PMT表有更新,如果沒有更新版本號不變
- stream_type
- 標志是audio還是video還是其他數據,標志是Video還是Audio還是其他數據,h.264編碼對應0x1b,aac編碼對應0x0f,mp3編碼對應0x03
- elementary_PID
- 如果stream_type是video,那么這個pid就是video的pid,如果stream_type是audio,那么這個pid就是audio的pid
- PCR_PID
- PCR(節目時鐘參考)所在TS分組的PID,根據PID可以去搜索相應的TS分組,解出PCR信息。
PES
-
stream_id
- 音頻取值(0xc0-0xdf),通常為0xc0,視頻取值(0xe0-0xef),通常為0xe0
-
PES_scrambling_control
- 加密模式,00->不加密
-
data_alignment_indicator
- 1表示ES數據緊跟PES頭
-
copyright
- 1表示有效負載是有版權的
-
PTS_DTS_flag
- pts也是屬于pes頭的一部分,所以,如果一個pes很大,只有第一包才有pts
-
PES_packet_length
- 關于PES_packet_length,如果pes包大小大于65535, 那么這個字段就是0,因為這個字段的長度是16個bit,最大值就是65535。如果pes包大小小于0,那么這個字段就不是0.
- A value of zero for the PES packet length can be used only when the PES packet payload is a video elementary stream
- 這個長度是optional pes header加上h264負載總和的長度
-
關于optional_pes_header
if (stream_ id != program_stream_map&& stream_ id I= padding_stream&& stream_ id != private_stream_2&& stream id I= ECM&& stream_ id != EMM&& strean_ _id != program_ _stream_ directory&& stream_ id != DSMCC_ stream&& stream, id I= ITU-T H.222.1 建議書類型 stream) (optional_pes_geader)
總結
- 上一篇: 关于仿写00片刻企业站
- 下一篇: CSDN回帖得分大全 近两年