ts流格式詳解
ts檔案為傳輸流檔案,視訊編碼主要格式h264/mpeg4,音訊為acc/MP3。
ts檔案分為三層:ts層Transport Stream、pes層 Packet Elemental Stream、es層 Elementary Stream. es層就是音視訊資料,pes層是在音視訊資料上加了時間戳等對資料幀的說明資訊,ts層就是在pes層加入資料流的識別和傳輸必須的資訊
注: 詳解如下
(1)ts層 ts包大小固定為188位元組,ts層分為三個部分:ts header、adaptation field、payload。ts header固定4個位元組;adaptation field可能存在也可能不存在,主要作用是給不足188位元組的資料做填充;payload是pes資料。
ts header
sync_byte | 8b | 同步位元組,固定為0x47 |
transport_error_indicator | 1b | 傳輸錯誤指示符,表明在ts頭的adapt域後由一個無用位元組,通常都為0,這個位元組算在adapt域長度內 |
payload_unit_start_indicator | 1b | 負載單元起始標示符,一個完整的資料包開始時標記為1 |
transport_priority | 1b | 傳輸優先順序,0為低優先順序,1為高優先順序,通常取0 |
pid | 13b | pid值 |
transport_scrambling_control | 2b | 傳輸加擾控制,00表示未加密 |
adaptation_field_control | 2b | 是否包含自適應區,‘00’保留;‘01’為無自適應域,僅含有效負載;‘10’為僅含自適應域,無有效負載;‘11’為同時帶有自適應域和有效負載。 |
continuity_counter | 4b | 遞增計數器,從0-f,起始值不一定取0,但必須是連續的 |
ts層的內容是通過PID值來標識的,主要內容包括:PAT表、PMT表、音訊流、視訊流。解析ts流要先找到PAT表,只要找到PAT就可以找到PMT,然後就可以找到音視訊流了。PAT表的PID值固定為0。PAT表和PMT表需要定期插入ts流,因為使用者隨時可能加入ts流,這個間隔比較小,通常每隔幾個視訊幀就要加入PAT和PMT。PAT和PMT表是必須的,還可以加入其它表如SDT(業務描述表)等,不過hls流只要有PAT和PMT就可以播放了。
PAT表:他主要的作用就是指明瞭PMT表的PID值。
PMT表:他主要的作用就是指明瞭音視訊流的PID值。
音訊流/視訊流:承載音視訊內容。
adaption
adaptation_field_length | 1B | 自適應域長度,後面的位元組數 |
flag | 1B | 取0x50表示包含PCR或0x40表示不包含PCR |
PCR | 5B | Program Clock Reference,節目時鐘參考,用於恢復出與編碼端一致的系統時序時鐘STC(System Time Clock)。 |
stuffing_bytes | xB | 填充位元組,取值0xff |
自適應區的長度要包含傳輸錯誤指示符標識的一個位元組。pcr是節目時鐘參考,pcr、dts、pts都是對同一個系統時鐘的取樣值,pcr是遞增的,因此可以將其設定為dts值,音訊資料不需要pcr。如果沒有欄位,ipad是可以播放的,但vlc無法播放。打包ts流時PAT和PMT表是沒有adaptation field的,不夠的長度直接補0xff即可。視訊流和音訊流都需要加adaptation field,通常加在一個幀的第一個ts包和最後一個ts包裡,中間的ts包不加。
PAT格式
table_id | 8b | PAT表固定為0x00 |
section_syntax_indicator | 1b | 固定為1 |
zero | 1b | 固定為0 |
reserved | 2b | 固定為11 |
section_length | 12b | 後面資料的長度 |
transport_stream_id | 16b | 傳輸流ID,固定為0x0001 |
reserved | 2b | 固定為11 |
version_number | 5b | 版本號,固定為00000,如果PAT有變化則版本號加1 |
current_next_indicator | 1b | 固定為1,表示這個PAT表可以用,如果為0則要等待下一個PAT表 |
section_number | 8b | 固定為0x00 |
last_section_number | 8b | 固定為0x00 |
開始迴圈 | ||
program_number | 16b | 節目號為0x0000時表示這是NIT,節目號為0x0001時,表示這是PMT |
reserved | 3b | 固定為111 |
PID | 13b | 節目號對應內容的PID值 |
結束迴圈 | ||
CRC32 | 32b | 前面資料的CRC32校驗碼 |
PMT格式
table_id | 8b | PMT表取值隨意,0x02 |
section_syntax_indicator | 1b | 固定為1 |
zero | 1b | 固定為0 |
reserved | 2b | 固定為11 |
section_length | 12b | 後面資料的長度 |
program_number | 16b | 頻道號碼,表示當前的PMT關聯到的頻道,取值0x0001 |
reserved | 2b | 固定為11 |
version_number | 5b | 版本號,固定為00000,如果PAT有變化則版本號加1 |
current_next_indicator | 1b | 固定為1 |
section_number | 8b | 固定為0x00 |
last_section_number | 8b | 固定為0x00 |
reserved | 3b | 固定為111 |
PCR_PID | 13b | PCR(節目參考時鐘)所在TS分組的PID,指定為視訊PID |
reserved | 4b | 固定為1111 |
program_info_length | 12b | 節目描述資訊,指定為0x000表示沒有 |
開始迴圈 | ||
stream_type | 8b | 流型別,標誌是Video還是Audio還是其他資料,h.264編碼對應0x1b,aac編碼對應0x0f,mp3編碼對應0x03 |
reserved | 3b | 固定為111 |
elementary_PID | 13b | 與stream_type對應的PID |
reserved | 4b | 固定為1111 |
ES_info_length | 12b | 描述資訊,指定為0x000表示沒有 |
結束迴圈 | ||
CRC32 | 32b | 前面資料的CRC32校驗碼 |
(2)pes層
pes層是在每一個視訊/音訊幀上加入了時間戳等資訊,pes包內容很多,我們只留下最常用的。
pes start code | 3B | 開始碼,固定為0x000001 |
stream id | 1B | 音訊取值(0xc0-0xdf),通常為0xc0 視訊取值(0xe0-0xef),通常為0xe0 |
pes packet length | 2B | 後面pes資料的長度,0表示長度不限制, 只有視訊資料長度會超過0xffff |
flag | 1B | 通常取值0x80,表示資料不加密、無優先順序、備份的資料 |
flag | 1B | 取值0x80表示只含有pts,取值0xc0表示含有pts和dts |
pes data length | 1B | 後面資料的長度,取值5或10 |
pts | 5B | 33bit值 |
dts | 5B | 33bit值 |
pts是顯示時間戳、dts是解碼時間戳,視訊資料兩種時間戳都需要,音訊資料的pts和dts相同,所以只需要pts。有pts和dts兩種時間戳是B幀引起的,I幀和P幀的pts等於dts。如果一個視訊沒有B幀,則pts永遠和dts相同。從檔案中順序讀取視訊幀,取出的幀順序和dts順序相同。dts演算法比較簡單,初始值 + 增量即可,pts計算比較複雜,需要在dts的基礎上加偏移量。
音訊的pes中只有pts(同dts),視訊的I、P幀兩種時間戳都要有,視訊B幀只要pts(同dts)。打包pts和dts就需要知道視訊幀型別,但是通過容器格式我們是無法判斷幀型別的,必須解析h.264內容才可以獲取幀型別。
舉例說明:
I P B B B P
讀取順序: 1 2 3 4 5 6
dts順序: 1 2 3 4 5 6
pts順序: 1 5 3 2 4 6
點播視訊dts演算法:
dts = 初始值 + 90000 / video_frame_rate,初始值可以隨便指定,但是最好不要取0,video_frame_rate就是幀率,比如23、30。
pts和dts是以timescale為單位的,1s = 90000 time scale , 一幀就應該是90000/video_frame_rate 個timescale。
用一幀的timescale除以取樣頻率就可以轉換為一幀的播放時長
點播音訊dts演算法:
dts = 初始值 + (90000 * audio_samples_per_frame) / audio_sample_rate,audio_samples_per_frame這個值與編解碼相關,aac取值1024,mp3取值1158,audio_sample_rate是取樣率,比如24000、41000。AAC一幀解碼出來是每聲道1024個sample,也就是說一幀的時長為1024/sample_rate秒。所以每一幀時間戳依次0,1024/sample_rate,...,1024*n/sample_rate秒。
直播視訊的dts和pts應該直接用直播資料流中的時間,不應該按公式計算。
(3)es層
es層指的就是音視訊資料,我們只介紹h.264視訊和aac音訊。
h.264視訊:
打包h.264資料我們必須給視訊資料加上一個nalu(Network Abstraction Layer unit),nalu包括nalu header和nalu type,nalu header固定為0x00000001(幀開始)或0x000001(幀中)。h.264的資料是由slice組成的,slice的內容包括:視訊、sps、pps等。nalu type決定了後面的h.264資料內容。
F | 1b | forbidden_zero_bit,h.264規定必須取0 |
NRI | 2b | nal_ref_idc,取值0~3,指示這個nalu的重要性,I幀、sps、pps通常取3,P幀通常取2,B幀通常取0 |
Type | 5b | 參考下表 |
nal_unit_type | 說明 |
0 | 未使用 |
1 | 非IDR影象片,IDR指關鍵幀 |
2 | 片分割槽A |
3 | 片分割槽B |
4 | 片分割槽C |
5 | IDR影象片,即關鍵幀 |
6 | 補充增強資訊單元(SEI) |
7 | SPS序列引數集 |
8 | PPS影象引數集 |
9 | 分解符 |
10 | 序列結束 |
11 | 碼流結束 |
12 | 填充 |
13~23 | 保留 |
24~31 | 未使用 |
紅色字型顯示的內容是最常用的,打包es層資料時pes頭和es資料之間要加入一個type=9的nalu,關鍵幀slice前必須要加入type=7和type=8的nalu,而且是緊鄰。
相關推薦
ts流格式詳解
ts檔案為傳輸流檔案,視訊編碼主要格式h264/mpeg4,音訊為acc/MP3。 ts檔案分為三層:ts層Transport Stream、pes層 Packet Elemental Stream、es層 Elementary Stream. es層就是音視訊資料,pe
hls之m3u8、ts流格式詳解
1、M3U8檔案 用文字方式對媒體檔案進行描述,由一系列標籤組成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./1.ts #EXTM3U:每個M3U8檔案第一行必須是這個tag。 #EXT-X-TARGETDURATIO
java Io 流類詳解
修改 文件目錄 != exe [] 深入 clas one fileinput 關於java 流類的復習;習慣性的復習按照圖結構一層層往下深入去了解去復習,最後通過代碼來實現感覺印象會更深刻一些; 關於 I/O流:IO可以理解為JAVA用來傳遞數據的管道
PE文件格式詳解,第一講,DOS頭文件格式
www new 中斷 relative fun 意義 word 作用 nor PE文件格式詳解,第一講,DOS頭文件格式 今天講解PE文件格式的DOS頭文件格式 首先我們要理解,什麽是文件格式,我們常說的EXE可執行程序,就是一個文件格式,那麽
函數中{}輸出格式詳解(C#)
with content c-s sort 命名方式 發現 1-1 原始的 des Console.WriteLine()函數中{}輸出格式詳解(C#) Console.WriteLine()函數的格式一直沒怎麽註意。今天同事問起Console.WriteLine({0
Linux下ps -ef和ps aux的區別及格式詳解
占用內存 style star wid 內存交換 現在 linu pts tar Linux下顯示系統進程的命令ps,最常用的有ps -ef 和ps aux。這兩個到底有什麽區別呢?兩者沒太大差別,討論這個問題,要追溯到Unix系統中的兩種風格,System V風格和BSD
常見圖片格式詳解
size 行為 spn pen huffman androi inux 大堆 aging 標明原作者信息 http://www.cnblogs.com/xiangism 做了幾年有關圖形、圖像的工作,對圖片格式算是小有經驗,在此寫成一文章總結下。雖然一開始並不想講很理
josn格式詳解
mat 之間 imp each 表示法 span table {} none josn格式詳解:!! JSON的全稱是”JavaScript Object Notation”,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量
TCP報文格式詳解
tail 圖片 緩沖 http 字節 gpo .net segment unix TCP報文是TCP層傳輸的數據單元,也叫報文段。 1、端口號:用來標識同一臺計算機的不同的應用進程。 1)源端口:源端口和IP地址的作用是標識報文的返回地址。 2)目的端口:端口指明接收方計
【轉載】s19文件格式詳解
strong 模式 blog 包含 需要 概述 摩托羅拉 csdn lec 來源:http://blog.csdn.net/xxxl/article/details/19494187 1.概述 為了在不同的計算機平臺之間傳輸程序代碼和數據,摩托羅拉將程序和數據文件以一種可打
RGB格式詳解(二)--索引格式
存儲 簡介 以及 關於 需要 色彩 顏色 針對 表現 本節針對RGB索引格式做簡單介紹,這些格式是比較老的格式,比較節省空間,在計算機發展的初期存儲的成本還是很高的,但是表現的色彩很有限,而隨著存儲成本的不斷降低,以及用戶越來越高的視覺體驗需求,這些格式也就基本被拋棄,不再
json文件格式詳解
with ++ 範例 使用 with open 輕量級 之間 關聯 不同 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming La
常見圖片格式詳解系列(一) ----簡介
圖片格式 png jpg bmp 常見圖片格式介紹 信息時代,豐富多彩的世界,我們用圖片來感知,來記憶,來存儲。多姿多彩的圖片格式,你是否了解其中奧妙呢。接下來的系列文章就要帶大家詳細解析常見圖片格式。 (一) BMP BMP格式,是windows的一種位圖格式,同時也是一種未經過壓縮的格式
常見圖片格式詳解(三)---JPEG
JPEG 圖片格式 編碼 解碼 壓縮 JPEG簡介 JPEG是一種比較成熟的有損的圖像壓縮格式,經過JPEG壓縮,圖像質量會有所損失,但是,人眼不容易分辨出來這種差別。jpeg圖像在質量和存儲空間得到了一個相對平衡的狀態。不過jpeg文件在組織方式上略顯復雜,詳細請向下看。 JPEG文
Java 常用IO流操作詳解
字符集 -s fileinput 顯式 print OS 數值 重寫 目錄 1.基本概念 IO:Java對數據的操作是通過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操作流的對象都在IO包中。 2.IO流的分類 圖示:(主要IO流)
C#中ToString()格式詳解
padding design otn href 有效 詳解 pattern console AS 以下內容均摘自博客園,僅供資料查詢。原文連接http://www.cnblogs.com/xdotnet/archive/2009/01/17/tostring_format.
Linux下ps -ef和ps aux的區別及格式詳解-轉
進程組 inux 詳解 少見 CP 被鎖 中斷 https www. 原文:https://www.linuxidc.com/Linux/2016-07/133515.htm Linux下顯示系統進程的命令ps,最常用的有ps -ef 和ps aux。這兩個到底有什麽區別呢
[轉載]PDB數據格式詳解
文本格式 charge 第一個 rst ide 小數 編輯 TE 修飾 完整的PDB文件提供了非常多的信息, 包括作者, 參考文獻以及結構說明, 如二硫鍵, 螺旋, 片層, 活性位點. 在使用PDB文件時請記住, 一些建模軟件可能不支持那些錯誤的輸入格式. PDB
AJAX之三種數據傳輸格式詳解
javascrip 無序 post object josn ans 利用 itl tar 一、HTML HTML由一些普通文本組成。如果服務器通過XMLHTTPRequest發送HTML,文本將存儲在responseText屬性中。 從服務器端發送的HTML的代
SSL證書格式詳解
常見 提取 文件中 global openss base64編碼 服務器 tex tiger SSL證書後綴面對不同後綴類型的證書是不是感到茫然,下面就針對幾種常用的證書後綴格式進行介紹:CSR – Certificate Signing Request,即證書簽名請求,這