基于S3C6400的移動(dòng)多媒體廣播終端設(shè)計(jì)
主界面完成的具體工作包含:搜索可用的電視頻點(diǎn);選擇收看的電視頻道;檢測當(dāng)前的信號(hào)強(qiáng)度;讀取接收到的音視頻數(shù)據(jù);對(duì)接收到的音視頻數(shù)據(jù)進(jìn)行解碼;播放解碼后的音視頻數(shù)據(jù);對(duì)當(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提供對(duì)CMMB電視信號(hào)的控制,包括:電視芯片的初始化,設(shè)置頻點(diǎn),掃描頻點(diǎn);得到頻道信息,設(shè)置頻道;接收及停止音視頻數(shù)據(jù);測試電視信號(hào)強(qiáng)度大小。
該模塊主要由數(shù)據(jù)處理模塊及信號(hào)控制模塊2個(gè)子模塊組成。
數(shù)據(jù)處理子模塊在打開引擎時(shí),會(huì)生成一個(gè)線程,這個(gè)線程用來讀取CMMB信號(hào),并進(jìn)行分析、處理,其流程如圖3所示。
本文引用地址:http://m.butianyuan.cn/article/152507.htm
這個(gè)子模塊是一個(gè)死循環(huán),在循環(huán)中,先通過一個(gè)標(biāo)志進(jìn)行判斷,如果需要處理數(shù)據(jù),首先讀取一幀數(shù)據(jù),如果沒有數(shù)據(jù),則阻塞在這兒。然后對(duì)這幀數(shù)據(jù)進(jìn)行分析,分別放入音頻,視頻,其他數(shù)據(jù)的緩沖區(qū),最后,調(diào)用回調(diào)函數(shù)對(duì)各種數(shù)據(jù)進(jìn)行處理,將音視頻數(shù)據(jù)發(fā)送給音視頻播放模塊來播放。
另一個(gè)子模塊,信號(hào)控制模塊主要是提供控制接口讓上層調(diào)用,以完成對(duì)CMMB信號(hào)的處理。該子模塊主要包含以下功能接口函數(shù):引擎的初始化:創(chuàng)建讀數(shù)據(jù)線程,啟動(dòng)初始化;引擎的打開:對(duì)電視芯片初始化;設(shè)置頻點(diǎn):設(shè)置當(dāng)前頻點(diǎn);得到ESG信息:從信號(hào)中提取ESG信息并分析;關(guān)閉引擎:清除用到的資源,硬件重置位;得到頻道信息列表:發(fā)送請求,分析頻道信號(hào);設(shè)置頻道:設(shè)置當(dāng)前頻道;得到參數(shù):能得到信號(hào)強(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ū);
評(píng)論