基于S3C6400的移動(dòng)多媒體廣播終端設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
0 引 言
移動(dòng)多媒體廣播目前已經(jīng)成為炙手可熱的發(fā)展熱點(diǎn)。移動(dòng)多媒體廣播業(yè)務(wù)是指通過衛(wèi)星和地面無線廣播方式,在具有7英寸以下小屏幕的移動(dòng)便攜式終端上,實(shí)現(xiàn)隨時(shí)隨地接收廣播電視節(jié)目收視與信息服務(wù)。
我國于2006年提出了具有自主知識產(chǎn)權(quán)的中國移動(dòng)多媒體廣播(China Mobile Multimedia Broadcast—ing,CMMB)系統(tǒng),能夠支持諸如手機(jī)、PDA、MP3、MP4、數(shù)碼相機(jī)、筆記本式計(jì)算機(jī)等小尺寸、小屏幕、移動(dòng)便攜的多種終端,實(shí)現(xiàn)隨時(shí)隨地提供廣播影視節(jié)目和信息服務(wù),滿足當(dāng)代社會(huì)“信息無處不在”的需求。為了實(shí)現(xiàn)較高質(zhì)量的電視節(jié)目接收和播放,終端的性能起著重要的作用,其中終端的音視頻解碼能力又是主要因素。同時(shí)兼顧到終端的成本,選擇合適的軟硬件平臺十分關(guān)鍵。因此本設(shè)計(jì)兼顧數(shù)字移動(dòng)電視的性能要求和成本兩個(gè)方面。
l CMMB系統(tǒng)架構(gòu)與終端結(jié)構(gòu)簡介
2006年10月24日,國家廣播電影電視總局正式頒布了中國移動(dòng)多媒體廣播CMMB系統(tǒng)的廣播信道行業(yè)標(biāo)準(zhǔn)《GY/T 220.1—2006移動(dòng)多媒體廣播第1部分:廣播信道幀結(jié)構(gòu)、信道編碼和調(diào)制》,確定了采用我國自主研發(fā)的移動(dòng)多媒體廣播傳輸技術(shù)標(biāo)準(zhǔn)(Satellite—Terrestrial Interactive Multi—service Infrastructure。STiMi)。目前國際上還沒有形成統(tǒng)一的移動(dòng)多媒體廣播技術(shù)標(biāo)準(zhǔn),尚處于大規(guī)模應(yīng)用的前期,因此該標(biāo)準(zhǔn)的及時(shí)出臺,對我國移動(dòng)多媒體廣播和相關(guān)民族工業(yè)的發(fā)展具有重要的促進(jìn)作用。
CMMB技術(shù)體系是利用大功率S波段衛(wèi)星信號覆蓋全國,利用地面增補(bǔ)轉(zhuǎn)發(fā)器同頻同時(shí)同內(nèi)容轉(zhuǎn)發(fā)衛(wèi)星信號補(bǔ)點(diǎn)覆蓋衛(wèi)星信號盲區(qū),利用無線移動(dòng)通信網(wǎng)絡(luò)構(gòu)建回傳通道,從而組成單向廣播和雙向交互相結(jié)合的移動(dòng)多媒體廣播網(wǎng)絡(luò)。CMMB體系架構(gòu)如圖1所示。
數(shù)字移動(dòng)電視終端的硬件部分主要分為兩部分:電視的接收模塊和播放顯示模塊。前者負(fù)責(zé)控制CMMB信號,后者負(fù)責(zé)播放音視頻數(shù)據(jù)。數(shù)字移動(dòng)電視的接收模塊采用泰合志恒公司生產(chǎn)的模塊。接收模塊的主要功能包含:電視芯片的初始化,設(shè)置頻點(diǎn),掃描頻點(diǎn);獲取頻道信息,設(shè)置頻道;接收及停止音視頻數(shù)據(jù);測試電視信號強(qiáng)度大小。播放顯示模塊以三星的ARMll處理器S3C6400為核心的嵌入式系統(tǒng)。
終端的軟件部分以Linux操作系統(tǒng)為平臺,而電視播放器軟件結(jié)合泰合志恒電視接收模塊的SDK,能夠?qū)崿F(xiàn)數(shù)字電視的控制和播放。
2 數(shù)字電視系統(tǒng)軟件設(shè)計(jì)
數(shù)字電視的系統(tǒng)結(jié)構(gòu)由主界面、電視接收模塊SDK和音視頻播放模塊3部分組成,如圖2所示。
3個(gè)模塊的主要功能如下:
主界面:提供數(shù)字移動(dòng)電視的用戶界面,與用戶交互,提供播放電視,選臺,設(shè)置音量,設(shè)置靜音等功能。電視接收模塊SDK:數(shù)字電視控制引擎,封裝SPI的驅(qū)動(dòng)程序,向上提供接口,用來接收數(shù)字電視信號,提供音視頻數(shù)據(jù),控制信息等。音視頻播放模塊:用于播放音視頻數(shù)據(jù)。
2.1 主界面[!--empirenews.page--]
主界面完成的具體工作包含:搜索可用的電視頻點(diǎn);選擇收看的電視頻道;檢測當(dāng)前的信號強(qiáng)度;讀取接收到的音視頻數(shù)據(jù);對接收到的音視頻數(shù)據(jù)進(jìn)行解碼;播放解碼后的音視頻數(shù)據(jù);對當(dāng)前播放的節(jié)目進(jìn)行錄像;調(diào)節(jié)音量大小;靜音功能。
主界面利用調(diào)用泰合電視接收模塊SDK,通過SPI驅(qū)動(dòng)程序讀寫數(shù)據(jù),并將接收到的CMMB復(fù)用子幀解析成H.264格式的視頻數(shù)據(jù),AAC格式的音頻數(shù)據(jù)和其他數(shù)據(jù)。然后調(diào)用播放器模塊,將H.264格式的視頻數(shù)據(jù)和AAC格式的音頻數(shù)據(jù)解碼并播放。
2.2 電視接收模塊SDK
電視接收模塊SDK提供對CMMB電視信號的控制,包括:電視芯片的初始化,設(shè)置頻點(diǎn),掃描頻點(diǎn);得到頻道信息,設(shè)置頻道;接收及停止音視頻數(shù)據(jù);測試電視信號強(qiáng)度大小。
該模塊主要由數(shù)據(jù)處理模塊及信號控制模塊2個(gè)子模塊組成。
數(shù)據(jù)處理子模塊在打開引擎時(shí),會(huì)生成一個(gè)線程,這個(gè)線程用來讀取CMMB信號,并進(jìn)行分析、處理,其流程如圖3所示。
這個(gè)子模塊是一個(gè)死循環(huán),在循環(huán)中,先通過一個(gè)標(biāo)志進(jìn)行判斷,如果需要處理數(shù)據(jù),首先讀取一幀數(shù)據(jù),如果沒有數(shù)據(jù),則阻塞在這兒。然后對這幀數(shù)據(jù)進(jìn)行分析,分別放入音頻,視頻,其他數(shù)據(jù)的緩沖區(qū),最后,調(diào)用回調(diào)函數(shù)對各種數(shù)據(jù)進(jìn)行處理,將音視頻數(shù)據(jù)發(fā)送給音視頻播放模塊來播放。
另一個(gè)子模塊,信號控制模塊主要是提供控制接口讓上層調(diào)用,以完成對CMMB信號的處理。該子模塊主要包含以下功能接口函數(shù):引擎的初始化:創(chuàng)建讀數(shù)據(jù)線程,啟動(dòng)初始化;引擎的打開:對電視芯片初始化;設(shè)置頻點(diǎn):設(shè)置當(dāng)前頻點(diǎn);得到ESG信息:從信號中提取ESG信息并分析;關(guān)閉引擎:清除用到的資源,硬件重置位;得到頻道信息列表:發(fā)送請求,分析頻道信號;設(shè)置頻道:設(shè)置當(dāng)前頻道;得到參數(shù):能得到信號強(qiáng)度,當(dāng)前頻道等參數(shù)。
2.3 音視頻播放模塊
音視頻播放由3個(gè)線程來完成。這3個(gè)線程分別為視頻處理線程、音頻處理線程、數(shù)據(jù)接收線程。
視頻處理線程:
(1)先判斷緩沖區(qū)隊(duì)列有沒有視頻數(shù)據(jù),如果沒有,休眠10 ms;
(2)有數(shù)據(jù)的話,因?yàn)橐曨l數(shù)據(jù)是根據(jù)時(shí)間戳順序作為隊(duì)列放在緩沖區(qū)的,取出第一幀,判斷是否已經(jīng)過時(shí),如果是很老的數(shù)據(jù),已經(jīng)錯(cuò)過了播放時(shí)間,則判斷幀類型,如果是關(guān)鍵幀,則解碼并顯示,否則,丟掉這一幀,然后轉(zhuǎn)到第(1)步;
(3)否則,判斷這一幀是否到了播放時(shí)間,如果是,則將這幀數(shù)據(jù)解碼并顯示,然后轉(zhuǎn)到第(1)步;
(4)如果沒有到播放時(shí)間,則休眠10 ms。然后轉(zhuǎn)到第(1)步。
音頻處理線程:
(1)先判斷緩沖區(qū)隊(duì)列有沒有音頻數(shù)據(jù),如果沒有,休眠10 ms;
(2)有數(shù)據(jù)的話,因?yàn)橐纛l數(shù)據(jù)是根據(jù)時(shí)間戳順序作為隊(duì)列放在緩沖區(qū)的,取出第一幀,判斷是否已經(jīng)過時(shí),如果是很老的數(shù)據(jù),已經(jīng)錯(cuò)過了播放時(shí)間,則丟棄,然后轉(zhuǎn)到第(1)步;
(3)否則,判斷是否到了播放時(shí)間,如果是,則將這幀數(shù)據(jù)解碼并播放,然后轉(zhuǎn)到第(1)步;
(4)如果沒有到播放時(shí)間,則休眠10 ms。然后轉(zhuǎn)到第(1)步。
數(shù)據(jù)接收線程:數(shù)據(jù)接收線程不屬于播放器模塊,它是電視接收模塊的一部分。
(1)如果有數(shù)據(jù)到來,判斷有沒有視頻數(shù)據(jù),如果有,將它們?nèi)坎迦氲揭曨l緩沖區(qū);[!--empirenews.page--]
(2)判斷有沒有音頻數(shù)據(jù),如果有,將它們都插入到音頻緩沖區(qū);
(3)阻塞,等待數(shù)據(jù)到來;
(4)當(dāng)有數(shù)據(jù)到來時(shí),轉(zhuǎn)到第(1)步。
音視播放器模塊共有4個(gè)子模塊:緩沖區(qū)管理、音視頻同步、音視頻解碼、視頻顯示。
2.3.1 緩沖區(qū)管理
一共設(shè)計(jì)2個(gè)隊(duì)列,音頻緩沖隊(duì)列,視頻緩沖隊(duì)列。每幀數(shù)據(jù)放入緩沖區(qū),成員分別為幀長,幀類型(視頻有,音頻無),時(shí)間戳,數(shù)據(jù)指針。幀長表示幀數(shù)據(jù)長度,幀類型里,1表示關(guān)鍵幀,0表示非關(guān)鍵幀,時(shí)間戳表示幀數(shù)據(jù)播放的時(shí)間,數(shù)據(jù)指針指向幀數(shù)據(jù)緩沖區(qū)。當(dāng)有新的數(shù)據(jù)到來時(shí),構(gòu)造一個(gè)幀成員,填入各項(xiàng)參數(shù),然后根據(jù)時(shí)間戳,將他插入到緩沖隊(duì)列,播放時(shí)間近的放在前面。流程如下:
(1)首先構(gòu)造一個(gè)幀緩沖成員;
(2)按照幀數(shù)據(jù)內(nèi)容填充幀緩沖;
(3)根據(jù)時(shí)間戳,按照近的在前面的原則,放入緩沖區(qū)隊(duì)列。
2.3.2 音視頻同步
音視頻數(shù)據(jù)始終與系統(tǒng)時(shí)間進(jìn)行同步,起初初始化時(shí),先在緩沖區(qū)存放1 s的數(shù)據(jù)。因?yàn)橄到y(tǒng)時(shí)間與發(fā)送的數(shù)據(jù)時(shí)間戳不一定相同,所以不用絕對時(shí)間,而是以緩沖區(qū)的第一幀時(shí)間戳為開始時(shí)間,后面的數(shù)據(jù)都以與這幀數(shù)據(jù)的時(shí)間差這個(gè)相對時(shí)間為準(zhǔn)。
視頻和系統(tǒng)時(shí)間同步的流程如下:
(1)判斷緩沖隊(duì)列是否為空,如果是空,休眠10 ms;
(2)如果非空,從緩沖隊(duì)列取出一幀,判斷這幀數(shù)據(jù)是否已經(jīng)過時(shí),如果超過播放時(shí)間100 ms以上,則判斷幀類型,如果是非關(guān)鍵幀,丟掉這幀數(shù)據(jù),否則處理這幀數(shù)據(jù),然后跳到第(1)步;
(3)如果這幀數(shù)據(jù)剛剛超過播放時(shí)間并且超過時(shí)間不超過100 ms,則處理這幀數(shù)據(jù),然后跳到第(1)步。
音頻和系統(tǒng)時(shí)間同步的處理流程如下:
(1)判斷音頻緩沖區(qū)是否為空,如果是空,休眠10 ms;
(2)如果非空,取出一幀數(shù)據(jù),判斷是否已經(jīng)超過播放時(shí)間100 ms,如果是,丟棄這幀數(shù)據(jù),跳到第(1)步;
(3)否則,處理這幀數(shù)據(jù),跳到第(1)步。
2.3.3 音視頻解碼
數(shù)字移動(dòng)電視信號目前音頻采用的是AAC編碼,利用開源解碼庫libfaad2來解碼,libfaad2的使用流程如下:
(1)首先對解碼器進(jìn)行配置,設(shè)置一些解碼參數(shù),例如采樣率,聲道數(shù)等;
(2)然后初始化解碼器;
(3)如果有需要解碼的音頻幀,依次調(diào)用NeAAC—DecDecode進(jìn)行解碼;
(4)當(dāng)音頻幀都解碼完畢,需要關(guān)閉解碼器。
三星的S3C6400芯片提供了多種格式視頻的硬件編解碼器,簡稱為MFC(Multi—format Video Codec),支持的功能有:MPEG一4 Simple Profile編解碼;H.264/AVC Baseline Profile編解碼;H.263 P3編解碼;VC一1(WMV9)Main Profile編解碼;支持多任務(wù),如同時(shí)完成1路編碼和3路解碼;支持多格式,如同時(shí)進(jìn)行MPEG一4編碼和H.264解碼。理論上MFC性能可以達(dá)到全雙工的720*480 30幀/s(或720*576 25幀/s)的編解碼。
MFC驅(qū)動(dòng)負(fù)責(zé)直接控制MFC硬件完成實(shí)際的編解碼操作,提供類似字符設(shè)備的接口;MFC API封裝了底層驅(qū)動(dòng)的控制接口,給上層提供函數(shù)調(diào)用的接口方式,解碼器調(diào)用流程如圖4所示。
2.3.4 視頻顯示[!--empirenews.page--]
對于解碼后的數(shù)據(jù),首先要將YUV格式轉(zhuǎn)換為RGB格式,轉(zhuǎn)換可以使用硬件來進(jìn)行。三星的S3C6400芯片提供的PostProcessor(以下簡稱Post或PP)支持的功能有:視頻/圖像的縮放;視頻格式轉(zhuǎn)換;顏色空間轉(zhuǎn)換(RGB<一>YUV);視頻輸入支持420,422格式,輸出支持YCbCr420,YCbCr422格式;圖像格式支持16位RGB(565格式)、24位RGB;最大分辨率支持2 048×2 048;支持單幀模式(Per Frame RunMode)和自動(dòng)模式(Free Run Mode)。
3 結(jié) 語
本數(shù)字電視系統(tǒng)能夠?qū)崿F(xiàn)穩(wěn)定可靠的對CMMB信號的控制并具有完善的正?;虍惓M顺鰴C(jī)制。接收CMMB標(biāo)準(zhǔn)(H.264 320*240/AAC)的音視頻數(shù)據(jù)時(shí),播放速率達(dá)到25幀/s。畫面流暢,停頓少,沒有明顯的馬賽克。界面友好,操作簡便,功能穩(wěn)定,同時(shí)具有較高的實(shí)時(shí)性。