DVB系統(tǒng)中多路TS流的軟件復(fù)用關(guān)鍵技術(shù)及實現(xiàn)
PMT 表替換后,每一路流中原有的視音頻幀的 PID 應(yīng)與其對應(yīng)替換的 PMT 表中的視音頻 PID 保持一致,即需要進行 PID 重映射。 在傳輸流處理過程中,先分析每一個讀入的 TS 幀,根據(jù) PID的不同,選擇替換的內(nèi)容,如果是 PAT 和 PMT 表,則整個 TS幀替換,如果 是視音頻幀,則只替換 PID,替換之后,應(yīng)該對連續(xù)計數(shù)器加一。
需要注意的是,單路傳輸流的構(gòu)成并不一樣,有的傳輸流是一路音頻一路視頻,有的是一路 視頻兩路音頻;有的 PCR 的 PID與視頻的 PID相同,有的則不同。所以,應(yīng)該為每一種情 況都準備一張 PMT 表,在新素材到來時,根據(jù)分析出來的 PSI 信息的情況,決定選用那一 張 PMT 表。這樣作雖然要創(chuàng)建很多靜態(tài)表,增加了系統(tǒng)內(nèi)存的占用,但是卻能使程序簡單 化,易于實現(xiàn),同時不用隨時計算 32 位的 CRC,提高了程序的穩(wěn)定性。在素材文件切換時, 如果 PMT 表需要發(fā)生變化,需要修改 PMT 表的版本號。
每一路流都有 PAT,假使復(fù)用的路數(shù)為 n,如果每一路的 PAT 都去替換,就會使得 PAT 表 發(fā)送頻率提升為原來的 n 倍。MPEG-2 規(guī)定,PSI 信息傳送的頻率每秒不低于 25 次,協(xié)議 中只規(guī)定了下限,沒有規(guī)定上限,雖然每一路都替換,并不違背協(xié)議,但是很多復(fù)用器和解 碼器在 PSI 信息過多的時候就會工作不正常,這是因為 PSI 信息的 32位 CRC 校驗很耗時, 所以通常只替換其中一路的 PAT, 其余的都用空包代替。 PSI 信息合成具體流程如圖 4 所示。
4.TS流的節(jié)目時鐘參考值修正
在 MPEG-2 編碼器中有一個系統(tǒng)時鐘,該系統(tǒng)時鐘用來生成一個共同的時序以便音頻/視頻 能夠正確地解碼與播放,同時可以用來指示在采樣瞬間系統(tǒng)時鐘的瞬時值[6]。正是由于編 碼器中有共同的系統(tǒng)時鐘,解碼器中的時鐘可以根據(jù)節(jié)目時鐘參考(PCR)重新恢復(fù),并通 過時間標記的正確使用為解碼器中操作的正確同步提供基準。
時鐘處理和碼率有很大的相關(guān)性,某個時間段的碼率就是這段時間的數(shù)據(jù)量與時鐘差值的比。為了防止在碼率出現(xiàn)波動的時 PCR 時鐘差值越界,導致解碼器不能正常工作,復(fù)用后 輸出碼率應(yīng)該比所有單路節(jié)目的總碼率稍大。在實際中,如果真的出現(xiàn)這種情況,為了避免 所有節(jié)目不能正常播放,本文采取的方法是停掉其中某一路,這樣降低輸出總碼率中的有效 碼率,保證其他節(jié)目正常播放。在這里需要說明的是,MPEG-2 中 TS流有兩種,一種 是恒碼率流,一種是變碼率流,本文研究的復(fù)用是針對恒碼率流的復(fù)用。
根據(jù) MPEG-2 標準,TS流中的 PCR字段長度為 48b, PCR 也是另外一種時間標記,是編碼 器 27MHz 時基的 42b 采樣值,解碼器利用它來恢復(fù)系統(tǒng)時鐘并進行恰當?shù)慕獯a操作,它有 兩個部分組成:一部分以本地參考時鐘的 1/300 (90kHz) 為單位,稱為 program_clock_reference_base ,為 33b 字段;另外一部分稱為
program_clock_reference_extension,是以本地參考時鐘(27MHz)為單位的 9b字段。
其中 sysclkfre 為系統(tǒng)時鐘 27MHZ。PCR 的單位是 1 /27M 秒,分為兩部分表示。實際編程中,當?shù)玫揭粋€新的 PCR 值,用式(1)和式 (2) 得到 PCR_base ( 33bit) 和 PCR_ext ( 9bit)兩 部分,填入 TS 幀中。在輸出碼率恒定的情況下,每一個 TS 幀傳輸所用的時間△PCR 值可以通過下式計算:
其中 nCoderate 為輸出的總碼率?!鱌CR 就是每一個 TS幀的時間刻度。
系統(tǒng)開始運行時,確定一個 PCR 的初始值,并為每一路申請一個計數(shù)器 nCounter變量,計數(shù)在兩個 PCR 幀之間的 TS幀數(shù),根據(jù)以下公式計算新的 PCR值:
式中,PCR_old 代表上一個 PCR 的值,PCR_new 代表當前新 PCR 的值。在得到新的 PCR 值之后, 用公式(1)(2)(3) 計算出 PCR_base和 PCR_ext 寫入幀中, 同時 PCR_old = PCR new, nCounter=0。 nCouter 是對整個傳輸流而言的,不管 TS 幀是不是當前計算的這路 TS 的內(nèi) 容,或者空幀,nCounter都要累加。
在 MPEG2 協(xié)議中,PCR 由 PCR_base(33bit)和 PCR_ext(9bit)表示,總共 42bit,當 PCR的值 超過 42bit 所能表達的范圍時,需要循環(huán)重新開始。由于 PCR 和 PTS以及 DTS的關(guān)系,在 重新開始循環(huán) PCR 的時候,一定要將 PTS 和 DTS 也重新回 0,同時要將 PCR 幀中調(diào)整域 中的 discontinuity_indicator字段置 1。
由于市場上的解碼器千差萬別, 有的解碼器中并沒有為PCR留足42bit, 在這種解碼器中PCR 通常會在解碼器端被提前回 0,而 PTS 和 DTS 并沒有隨之一起復(fù)位,這就會造成解碼器的 上溢,導致播放不正常。所以在實際中,本文判斷 PCR 是否達到回 0 的閥值略低于 42bit 所能表達的最大值,這樣會提高對解碼設(shè)備的適應(yīng)性,同時不會造成協(xié)議上的沖突。PCR 時鐘處理的具體流程如圖 5 所示.
5.TS流軟件復(fù)用系統(tǒng)的程序設(shè)計與測試結(jié)果分析
通過對 MPEG-2 傳輸流應(yīng)用結(jié)構(gòu)的仔細分析,可以看出 MPEG-2 傳輸流所傳送的只是彼此 獨立的原始流數(shù)據(jù)和把特定的原始流組合成一個節(jié)目的 PSI 信息, 并沒有傳送一個不可分割 的真正意義上的節(jié)目,因此在一定程度上保證了 TS流軟件復(fù)用程序的可行性。
所設(shè)計程序并不需要對組成節(jié)目的原始流進行內(nèi)容的處理, 不管構(gòu)成某節(jié)目的原始流是音頻 還是視頻還是私有數(shù)據(jù),程序所要做的只是改動攜帶原始流的傳輸流分組的標記信息,并把 它發(fā)送到輸出的傳輸流, 接著在復(fù)用后的傳輸流中也要發(fā)送該原始流所構(gòu)成的節(jié)目的節(jié)目映 射表。與此同時,需要注意的一點是,由于輸入的各個傳輸流相互獨立,它們?yōu)楦髯缘墓?jié)目 分配的 PID、節(jié)目號之類的標志信息很可能會發(fā)生重復(fù)的情況,所以對于原始流分組,并不 能簡單的轉(zhuǎn)發(fā),因此,程序?qū)楦鱾€傳輸流中的原始流分配新的 PID,以及為不同的節(jié)目分配新的節(jié)目號,從而形成一個新的傳輸流。
評論