以前理解psi的包和段都還不夠深刻,以至於寫的復用部分,表生成部分邏輯性,可用性不高,雖然使用沒啥問題的。在寫復用模組的時候,對psi理解度不夠的話,再去改復用模組,挺麻煩的,很費神。
常用的psi/si表:
psi表(4類):pat,pmt,cat,nit(nit當前網路 和 nit其他網路)。
si表:bat,sdt(sdt當前ts 和 sdt其他ts),tdt,tot,
eit(1.eit現行傳輸流,當前/後續事件資訊;2.其他傳輸流,當前/後續事件資訊;3.現行傳輸流,事件時間表資訊;4.其他傳輸流,事件時間表資訊)
也就是說,舉個例子:nit當前網路段nit_current只有1子表;nit其他網路nit_others可能多個子表,那麼可能新增多個段到nit_others節點下。同理,只要有current的都只有1個子表(頂多256個分段,看section_number,eit_current除外,和節目號也有關)。
1.psi各種表最基本單位是段section,若以包packet來進行復用,遇到乙個表由多個段組成的時候,就感覺明顯了,解析各種表也應該由段語法來解析。
所以,分析psi檔案的時候,我就根據pid和crc32來判斷是乙個唯一的段。當這個crc32重複1次時,這個段就重複了1次(crc32重複1次);來了n次,則crc32重複n次。
pat,pmt,cat都沒有其他流資訊(「psi 中的pat、cat、pmt只提供了它所在的復用流(現行符復用流)的資訊
」,解釋一下就是pat,cat,pmt都只有1個段),
所以,只有1個段,若檔案中有多個pat段,那麼就出現重複段(用t***pert可以看見該段重複了多少次,但該軟體重複次數應減1;比如2個pat段,重複為1,但t***pert顯示的是2;若寫為出現次數為2,那比較恰當
。t***pert寫得非常優秀的了。);
其他的psi表可能很多個段,特別是eit表,甚至上萬個段,解析起來很麻煩;那你需要比較當前的段的crc32是否和這萬多個段是否重複,效率是比較低的。
理論上,發覺2個相同crc32後直接判斷重複了,那我們不必讀取下乙個包了,覺得psi表獲取齊了;但這樣還是有bug,eit段就是可能忽然增加幾個段的,所以,程式設計師需要選擇把檔案讀取完畢,效率低一些還是只要有2個相同的crc32就斷定這個段獲取齊全,不必讀取整個檔案了。
2.發表:
(1).乙個sdt段有6個包,若這個段傳送期間,有bat的段假設為2個包進入,那怎麼準確提取sdt表的資訊呢?
(2).提取psi表資訊時候,是必須先分析完pat表,從中獲取pmt表後,再解析其他表的嗎?(pat表解析pmt表就是:節目號pmt表的pid)
答2:當乙個檔案用來分析的時候,可能先出來pmt表等,sdt表等,那等我先解析pat表後解析出pmt表,再將讀取檔案的指標放到檔案開頭,再解析其他表,這樣效率不是不高?!
所以,我覺得直接將檔案預想為足夠大,pmt不可能只出現在pat前,解析了pat表後一定能再次解析到pmt表,這樣就不必再將檔案指標放到檔案開頭,繼續分析就是的了。有時候演算法能照顧大多數情況就可以的了,面面俱到還是比較困難的。
3.段結構:
(1).其實1個psi表的段語法雖然看上去都不同,但實際上是遵從段語法的,在寫程式時,我覺得應該乙個段結構=段頭(段資訊)+段內容+crc32構成。
段頭的長度是固定的(8位元組,到last_section_number為止),內容也是固定的,只是x_id(16位)在sdt表中是transport_stream_id ,bat中bouquet_id,nit中network_id,eit中service_id,pat中 transport_tream_id,pmt中 program_number 。cat比較特殊,x_id是保留的了,全部置1。
tdt和tot不遵從於段語法,段語法指示符 section_syntax_indicator: 1 位欄位,為「0」 。而上面這些psi/si全部是遵從段語法,section_syntax_indicator=1的。
所以,建議tdt和tot不遵從段語法,可以取個統稱叫時間資訊表,需單獨處理提取出 時間段結構time_section_st;其他表則用段結構psi_section_st。下一步,有這 段結構資訊的表就可以用其段內容進行分析了,比如psi_section_st->分析為pat段psi_section。
22:33 2018/1/22
PSI SI表的深度摘要 2
psi標準裡面沒說 分段也是具有結構性的,各種psi表的分段結構基本一致,參見psi section st結構體。nit和bat表基本可以用乙個函式實現的。本文用c 實現,需注意的就是arraylist的結構體新增的元素需匹配,需要在除錯的時候看見其具體元素型別,一旦不匹配直接報錯退出,比較傷腦筋的...
表的建立與管理(章節摘要)
1,資料庫中常用的基本型別number,varchar2,date,clob。2,表的建立使用create table語法完成,建立表時需要為表中定義若干個列,每個列上可以通過default設定列的預設值。3,表的刪除操作使用drop table語法來完成,但是從oracle 10g起,如果要徹底刪...
深度學習day3(深度網路的數學基礎)
1.什麼是深度學習?前兩篇流水賬大概了解一下子深度學習是什麼,現在正是進入學習 如 使用 python 的 keras 庫來學習手寫數字分類 要解決的問題是,將手寫數字的灰度影象 28 畫素 28 畫素 劃分到 10 個類中 0 9 使用的資料集 mn這個資料集包含 60 000 張訓練影象和 10...