啊啊啊啊啊啊啊啊啊啊啊啊…好不容易組出來了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
的資料部分,將資料部分裝入section
的container
中。
@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 流分組 打包 加入包...