ts碼流 獲取指定section

2021-10-07 19:52:24 字數 3023 閱讀 9035

啊啊啊啊啊啊啊啊啊啊啊啊…好不容易組出來了section,好幾周了吧,其中一周是回學校了,之後就是放空狀態了,感覺要是認真思考的話,應該不難的吧…

首先,需要清楚ts碼流裡的層次關係:

ts碼流是由很多的包組成的,即ts碼流是包的集合,而section是ts包的集合;

在碼流中會解析出各種table,這些table是實際業務中需要用到的東西,而table是section的集合;

其次,要清楚section的組成,以下是section頭部字段:

public

section

(byte

container,

int sectionstart)

接下來就是思考section組成的流程:

乙個個包的獲取,首先判斷包是不是要找的包(pid),其次這個包能否作為section的包,如果是首包,判斷table_id是不是要尋找的。確定了這個包的payload可以作為section的資料部分,將資料部分裝入sectioncontainer中。

@requiresapi

(api = build.version_codes.n)

public

static list

formtable

(string file,

short targetpid,

byte targettable_id)

throws exception

@requiresapi

(api = build.version_codes.n)

public

static list

gettable

(transportstream ts,

short targetpid,

byte targettable_id)})

;int from = ts.

getposition()

;int to = ts.

getposition()

+ ts.

getpackagelen()

;/**transport stream invalid*/

if(ts.

gettsdata()

== null)

while

(to < ts.

gettsdata()

.length)

from = to;

to = from + ts.

getpackagelen()

;}return sections;

}

public

static

intgetsection

(getsectionparameters parameters)

sectionflag =

true

; continuity_counter =

(packet.

getcontinuity_counter()

+1)% package.continuity_counter_max;

tag =

true;}

else

if(sectionflag && packet.

getcontinuity_counter()

== continuity_counter)

if(tag)}}

}return to;

}

public

static initsectionreturn initsection

(initsectionparameters parameters)

size += parameters.

getparameters()

.getts()

.getpackagelen()

- sectionstart;

/**the last package in section*/if(

(parameters.

getparameters()

.getts()

.getpackagelen()

- sectionstart)

>

(parameters.

getparameters()

.getsection()

.getsection_length()

+3- parameters.

getsectionposition()

))/**data input */

for(

int i = sectionstart; i < sectionstart + size; i++)if

(sectionend)

return

newinitsectionreturn

(sectionend, parameters.

getsectionposition()

);}

public

static

intgetsectionstart

(package packet)

if(packet.

getpayload_unit_start_indicator()

==1)return sectionstart;

}

對於入門新手,組建section看似是最難的,也是最關鍵的,其實理解了section的組成,再結合tsread軟體把section拆分,逆推他是怎麼組成的,會發現所有的問題都是小cese啦。

其次在檢視資料時,對於section的很多細節都還沒注意到,可以對其進行大膽猜想說不定就是你推測的那個意思呢!

在解析之前還參考了這篇部落格:

如果理解上有什麼偏差忘指正…

ES PS PES以及TS碼流

一 基本概念 1 es 個au 相當於編碼的11 2 pes pes packetized elementary streams 分組的es es形成的分組稱為pes分組,是用來傳遞es的一種資料結構。pes流是es流經過pes打包器處理後形成的資料流,在這個過程中完成了將es 流分組 打包 加入包...

關於ES PES PS以及TS碼流

一 基本概念 1 es 個au 相當於編碼的11 2 pes pes packetized elementary streams 分組的es es形成的分組稱為pes分組,是用來傳遞es的一種資料結構。pes流是es流經過pes打包器處理後形成的資料流,在這個過程中完成了將es 流分組 打包 加入包...

關於ES PES PS以及TS碼流

一 基本概念 1 es 個au 相當於編碼的11 2 pes pes packetized elementary streams 分組的es es形成的分組稱為pes分組,是用來傳遞es的一種資料結構。pes流是es流經過pes打包器處理後形成的資料流,在這個過程中完成了將es 流分組 打包 加入包...