<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 機頂盒平臺的字幕數據格式分析及其顯示實(shí)現

機頂盒平臺的字幕數據格式分析及其顯示實(shí)現

作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò ) 收藏

1 引言

隨著(zhù)數字電視的蓬勃發(fā)展,數字電視已逐漸進(jìn)入千家萬(wàn)戶(hù),除了傳統的電視節目外,通過(guò)利用先進(jìn)的數字電視技術(shù)為廣大用戶(hù)提供更多的信息服務(wù),是廣播電視事業(yè)發(fā)展的必然趨勢。字幕(subtitle)作為一種簡(jiǎn)便而直觀(guān)的信息提供途徑,其重要性主要體現在兩個(gè)方面。一是字幕可以為聽(tīng)力有障礙的人提供另一個(gè)語(yǔ)音信息途徑;二是字幕功能可以通過(guò)簡(jiǎn)單的后期制作(如多語(yǔ)言顯示),配合電視節目的全球化推廣提供便捷的平臺。DVB 作為全球應用最廣泛的數字電視傳輸標準,也為多種語(yǔ)言的字幕提供了相應的規范,從而使字幕成為不同國家和地區電視節目交流的良好載體。

  2 DVB 數字電視字幕規范

2.1 字幕控制信息規范
控制信息的規范主要包括有效數據的加載和提取索引信息的存放兩個(gè)方面。DVB 中規定,字幕信息要以節目的私有數據包形式復用到節目的基本流中,與音視頻數據加載形式類(lèi)似。提取索引信息則是利用DVB 中的描述符(descriptor)語(yǔ)法插入到節目映射表(PMT)的私有數據段中。

流類(lèi)型為0×06 的私有數據段,承載本節目私有數據提取的相關(guān)信息:私有數據包的PID 及其描述符。字幕描述符的標簽值(descriptor_tag)為0×59,語(yǔ)法如下:
  
分析字幕描述子可得出該字幕的語(yǔ)言代碼(ISO639_language_code)、字幕類(lèi)型、合成頁(yè)及可選的輔助頁(yè)。這些信息在字幕數據的提取中將作為數據提取的索引信息。

2.2 字幕數據編碼規范

在終端是以頁(yè)的形式顯示出來(lái),每一頁(yè)又分成多個(gè)區域,每一個(gè)區域里又關(guān)聯(lián)著(zhù)多個(gè)圖形對象和區域的顏色。因此,字幕數據編碼是根據這些需求來(lái)定義的。字幕數據承載在PES 包的負載中,結構如圖1 所示。

圖1 字幕數據的數據結構

本文引用地址:http://dyxdggzs.com/article/201706/348284.htm

  分析字幕的數據結構可知,前兩個(gè)字節是字幕數據的確定信息,包括一個(gè)數據定義字節(該字段定義該數據流為DVB 字幕,其值為0×20)和一個(gè)字節的字幕流識別id(其值為0×00);最后一個(gè)字節為字幕數據結束標志(其值為0×ff)。中間填充的數據則是字幕段數據。在字幕段數據中前6 個(gè)字節為字幕段的頭信息,包括1 個(gè)同步字節(其值為0×0f)、1 個(gè)類(lèi)型字節(用來(lái)確定data_field()里攜帶的是哪種類(lèi)型的數據分段)、2 個(gè)字節的頁(yè)ID (用來(lái)唯一標志一個(gè)字幕段)以及2 個(gè)字節的段長(cháng)度標識(標識其后面攜帶負載的大?。?。

字幕段類(lèi)型主要有以下四種:

頁(yè)分段(page composition)。通過(guò)頁(yè)id(page_id)定義了該頁(yè)顯示終止時(shí)間、頁(yè)的狀態(tài)、該頁(yè)中區域數、各區域號、各區域的水平及垂直位置。


區域分段(region composition)。用于定義該區域的寬高、水平垂直位置、所使用的CLUT 表的CLUT_id值、對象的id、區域背景色以及像素深度等信息。

CLUT 分段(CLUT definition)。用于定義顏色,以便把傳輸的虛顏色轉換成實(shí)際色板中的顏色。
對象數據分段(object data)。用于定義對象的編碼方法和編碼數據。編碼方法包括像素編碼和字符編碼。每一個(gè)對象可以看作是一個(gè)可顯示的圖像單元。

每一頁(yè)數據的完整顯示都至少需要這四個(gè)數據分段,所以在解析字幕流時(shí),需要利用各種結構體及鏈表對這幾個(gè)數據段數據進(jìn)行解析并存儲。

  3 顯示系統設計

在STB 上實(shí)現字幕接收和顯示主要包括四大模塊:數據提取模塊、數據解碼模塊、圖層顯示模塊和用戶(hù)控制模塊。各模塊關(guān)系如圖2 所示。

圖中,用戶(hù)控制模塊用于響應用戶(hù)按鍵,并發(fā)送消息控制其它各模塊;數據提取模塊根據接收控制模塊發(fā)來(lái)的濾波啟動(dòng)、停止或提取字幕數據等控制消息,并完成數據的提取工作;數據解碼模塊負責對數據提取模塊送來(lái)的字幕原始數據進(jìn)行解碼,并將解碼后的數據送到指定的緩沖區內供圖層顯示模塊調用;圖層顯示模塊用于實(shí)現字幕界面的各種OSD 顯示操作。

圖2 字幕系統模塊關(guān)系圖。

3.1 字幕數據提取模塊

字幕數據提取模塊包括兩部分:字幕控制信息的提取和字幕數據包的提取。

用戶(hù)控制模塊發(fā)送字幕啟動(dòng)請求時(shí),提取模塊就啟動(dòng)SI 引擎。首先,啟動(dòng)本節目的PMT 表濾波工作,獲取PMT 數據并進(jìn)行分析。若當前節目沒(méi)有字幕信息,則發(fā)送無(wú)字幕消息至用戶(hù)模塊;若當前節目帶有字幕信息,則根據PMT 中的私有數據段和字幕描述符,獲取字幕數據對應的PID、字幕的語(yǔ)言代碼、字幕類(lèi)型、合成頁(yè)及可選的輔助頁(yè),并存放到字幕索引信息表中。其次,根據字幕索引信息表啟動(dòng)字幕有效數據的PES 濾波,提取對應字幕數據包。字幕數據提取總體流程如圖3 所示。

圖3 字幕數據提取流程

當獲得字幕的PID 及其它信息后,則按字幕語(yǔ)言的不同,把當前節目所攜帶的所有語(yǔ)言的字幕列表,供用戶(hù)選擇。當用戶(hù)選擇完一個(gè)條目后,可利用該條目相應的控制信息獲取字幕PES 包,把字幕PID,合成頁(yè)id 和輔助頁(yè)id 注冊進(jìn)濾波通道,并啟動(dòng)濾波器。

此時(shí),若濾波器接收到相匹配的數據,則會(huì )產(chǎn)生相應的中斷,通知上層進(jìn)程讀取數據;當獲取一個(gè)完整的PES 包后,就傳送給器進(jìn)行解碼顯示。

3.2 字幕數據解碼模塊

字幕數據解碼模塊負責對字幕PES 包進(jìn)行解碼。

字幕PES 包解碼流程如圖4 所示。

圖4 字幕PES 包解析流程。

主要是對PES 包進(jìn)行分析,包括PES包頭的檢測,PES 包頭信息的提取和字幕段的分析。

濾波得到一個(gè)PES 包后,首先判斷包頭是否合法,包括判斷前四個(gè)字節是否為0×000001BD 和PES包長(cháng)度是否合法。

PES 包頭信息提取包括提取PTS、PES 包頭長(cháng)度等。PTS 是該分組中承載的所要顯示的數據的顯示時(shí)間。根據包頭長(cháng)度可以定位到PES 的負載位置,進(jìn)而分析PES 包的負載。

分析PES 包的負載,首先判斷前兩個(gè)字節(定義字節和字幕流id)是否分別為0×20、0×00.若都符合,則可以確定這個(gè)包就是所要的封裝有字幕數據的PES 包。然后進(jìn)入字幕段分析,字幕字段的內容有四種情況。先找到同步頭字節0×0f,再往后分析8bit 的段類(lèi)型(segment_type),通過(guò)判斷該字節值來(lái)確定data_field()攜帶的是哪種類(lèi)型的數據。當segment_type為0×10 時(shí)[3],該段為頁(yè)分段;當segment_type 為0×11時(shí),則該段為區域分段;當segment_byte 為0×12 時(shí),該段為CLUT 分段;當segment_byte 為0×13 時(shí),該段為對象數據分段。最后,根據不同的類(lèi)型調用不同的函數對各種類(lèi)型的分段進(jìn)行下一步的分析。

在頁(yè)分段的解析中找到該頁(yè)的頁(yè)id、顯示終止時(shí)間、顯示狀態(tài)、該頁(yè)由幾個(gè)區域組成、每個(gè)區域的區域id 和每個(gè)區域的水平垂直坐標,并把這些數據存儲起來(lái)。然后,根據從頁(yè)分段中獲取的區域的id 找到相應的區域分段,獲取該區域的寬高、像素深度、該區域填充的顏色、顏色表id(CLUT_id)、區域的數據對象個(gè)數、每個(gè)數據對象編號(object_id),并存儲這些數據。

最后,通過(guò)CLUT_id 找到顏色表,得到顏色的Y、Cr、Cb、T 值。通過(guò)object_id 找到對象數據的內容,包括編碼方式及編碼數據。用相應的解碼方式把這些相關(guān)的編碼數據解碼出來(lái),并放入緩沖區。其中,在頁(yè)分析時(shí),當解析出的該頁(yè)的顯示終止時(shí)間已經(jīng)過(guò)了,則并不需要分析該頁(yè),把跟與該頁(yè)相關(guān)的數據緩沖區進(jìn)行清空操作。

由于一個(gè)PES 包可能包含多個(gè)字幕段(subtitling_segment),因此必須循環(huán)分析到最后一個(gè)字幕段。對每個(gè)字幕段分析完后,都要判斷下一個(gè)字節是下一個(gè)字幕段的同步頭(0×0f)還是字幕數據結束標志(0×ff)。若是下一個(gè)字幕段的同步頭則繼續分析,若是數據結束標志則代表該PES 包攜帶的負載分析完畢。最后,把得到的數據存放到顯示緩沖區,通過(guò)分析得到的PTS 創(chuàng )建一個(gè)定時(shí)時(shí)間,當時(shí)間到的時(shí)候從緩沖區中把數據讀出,并調用OSD 層驅動(dòng)顯示數據。

在該解碼中,對于合成頁(yè)(composition_page_id)的處理分為兩種,這是因為同一個(gè)PID 可能傳送不同語(yǔ)言的字幕流,即語(yǔ)言不同的多個(gè)信息共享同一個(gè)PID流,所以在處理的時(shí)候可以把合成頁(yè)設置為濾波器的深度。當一路數據流進(jìn)來(lái)的時(shí)候,對符合該PID 的PES 包中對應的頁(yè)ID 進(jìn)行判斷,與頁(yè)ID 相同的就提取,不同的就丟棄,這是其中的一種解析提取方式。另一種方式是采用多種語(yǔ)言共用的PID 值去設置濾波器,把與該PID 值符合的字幕流提取出來(lái),送去PES包解析。經(jīng)過(guò)PES 解析出該頁(yè)ID,這時(shí)再判斷該頁(yè)ID是否與在PMT 表解析得到的頁(yè)ID 一樣。如果一樣的話(huà),說(shuō)明正是要找的包,反之則說(shuō)明是一個(gè)無(wú)效的PES 包,則丟棄該包。

3.3 字幕圖層顯示模塊

當用戶(hù)在收看節目,啟動(dòng)字幕功能時(shí),用戶(hù)看到的是節目畫(huà)面和字幕畫(huà)面的疊加,OSD 界面顯示技術(shù)是指在圖像畫(huà)面上疊加圖文顯示,使屏幕提供更多附加信息。

為了控制字幕在屏幕上的正常顯示,需要利用OSD 驅動(dòng)模塊提供的區域操作功能。在該實(shí)現中主要用到的OSD 函數接口有OSD 初始化函數、區域清除函數、OSD 區域創(chuàng )建函數、OSD 區域顯示函數和OSD 區域隱藏函數,在該系統中以回調函數的形式利用這些接口函數。在系統初始化中,必須先初始化字幕OSD 區域,獲取OSD 層的設備id,注冊字幕區域創(chuàng )建回調函數、字幕區域顯示回調函數、字幕清屏回調函數和字幕區域隱藏回調函數。把這些函數的地址加以保存,當需要相應的OSD 服務(wù)時(shí),就通過(guò)函數指針調用相應的函數。

可以根據分析PES 包得到時(shí)間信息,并通過(guò)這個(gè)時(shí)間信息與音視頻同步。在每區域數據解碼完畢后,顯示模塊創(chuàng )建相關(guān)的OSD 區域,分配內存空間,把解析完的數據連同該數據要顯示的時(shí)間PTS 送到顯示緩沖區。此時(shí),根據當前系統時(shí)鐘STC 和存儲的PTS 創(chuàng )建一個(gè)定時(shí)器,如果顯示時(shí)間已經(jīng)超過(guò)了系統時(shí)間,那么顯示緩沖區的數據就要清空掉;反之,當顯示時(shí)間到的時(shí)候,定時(shí)器被觸發(fā),顯示內容輸出到OSD 緩沖區,并結合顯示持續時(shí)間來(lái)進(jìn)行字幕的顯示。顯示狀態(tài)流程如圖5 所示。

圖5 顯示狀態(tài)流程

由于字幕的顯示和菜單界面的顯示都是基于區域的,對于不同的應用,不能同時(shí)往同一個(gè)位置填充不同的數據。因此,在字幕顯示前要把菜單OSD 顯示區域隱藏起來(lái)。當字幕正在顯示又需要使用系統菜單時(shí),調用字幕區域隱藏函數,設置顯示標志為非需要顯示狀態(tài)。在菜單顯示結束后,調用字幕區域顯示函數,恢復字幕顯示。采用這種方式可以解決字幕顯示和界面顯示的沖突。

3.4 字幕用戶(hù)控制模塊

控制模塊是人機交換模塊,主要負責用戶(hù)請求的處理。本模塊的首要任務(wù)是將用戶(hù)的請求進(jìn)行消息分類(lèi),再根據不同的消息與相關(guān)的模塊進(jìn)行通信,消息可分為以下幾種:獲取字幕控制信息消息、啟動(dòng)及停止字幕數據濾波消息、字幕數據解碼及停止解碼消息、OSD 區域顯示消息、OSD 區域清除消息和OSD 區域隱藏消息。

系統軟件中,字幕的創(chuàng )建通過(guò)遙控器上的字幕鍵(SUBT)觸發(fā),發(fā)送消息啟動(dòng)數據控制信息提取模塊,解析完畢后顯示多語(yǔ)言字幕列表,供用戶(hù)選擇所要接收的語(yǔ)言(上下鍵選擇及OK 鍵觸發(fā))。用戶(hù)一旦選擇后,啟動(dòng)字幕數據提取模塊,進(jìn)行字幕PES數據流的濾波和緩沖,同時(shí)啟動(dòng)顯示模塊,根據各種時(shí)間進(jìn)行顯示或者清屏。字幕的關(guān)閉由遙控器上的退出(EXIT)鍵觸發(fā),進(jìn)而控制停止濾波、停止數據解碼,釋放字幕功能創(chuàng )建的各內存空間,停止字幕顯示。

在顯示字幕的同時(shí),進(jìn)行界面菜單操作分成兩種情況。一種是菜單操作進(jìn)行了調臺,用戶(hù)控制模塊發(fā)送消息關(guān)掉字幕功能、停止濾波、釋放字幕功能創(chuàng )建的各內存空間;另一種情況是非調臺的其他菜單操作,當界面操作結束后則發(fā)送字幕恢復顯示消息給圖層顯示模塊恢復顯示。

  4 結束語(yǔ)

本文采用模塊化的設計思路,按照功能將機頂盒字幕解碼系統分為四個(gè)模塊,即數據提取、數據解碼、數據顯示和用戶(hù)控制模塊。在各個(gè)模塊的實(shí)現上按照中間件和驅動(dòng)層兩個(gè)方面進(jìn)行程序設計,使得編寫(xiě)的代碼便于理解閱讀,同時(shí)又易于實(shí)現不同平臺間移植。



關(guān)鍵詞: 字幕解碼 字幕顯示 機頂盒

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>