文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2014)10-0009-03
0 引言
多媒體的呈現(xiàn)方式從本地播放,、下載存儲(chǔ)播放逐步發(fā)展到流式播放[1],。流媒體融合了網(wǎng)絡(luò)和多媒體編解碼等技術(shù),雖然在PC 領(lǐng)域上的應(yīng)用已比較成熟,,但是在嵌入式領(lǐng)域,,仍有著很大的開發(fā)空間。文中提到的向Mplayer的解碼庫中添加S3C6410的多媒體編解碼模塊MFC(multi format codec)[2],,具有很強(qiáng)的應(yīng)用價(jià)值,。
本設(shè)計(jì)的平臺(tái)是HINOC手持測(cè)試儀。HINOC[3](High performance Network Over Coax)是“三網(wǎng)融合”中的從光纖網(wǎng)到用戶的一個(gè)傳輸方案,,如圖1所示,。頭端設(shè)備(HINOC Brige,HB)對(duì)多個(gè)終端設(shè)備(HINOC Modem,,HM)進(jìn)行管理,。
HINOC 手持測(cè)試儀的主要功能是不僅有 HM的功能,還能協(xié)助工程人員進(jìn)行故障定位,。圖2和圖3顯示了其硬件和軟件結(jié)構(gòu),。
工作人員通過流式傳輸可以觀看遠(yuǎn)程業(yè)務(wù)視頻,而且能直觀地驗(yàn)證網(wǎng)絡(luò)的底層是否連通,。
1 需求分析
本系統(tǒng)采用了ARM-Linux,,處理器是基于ARM1176JZF-S的S3C6410,,播放器是Linux系統(tǒng)上最優(yōu)秀的播放器之一Mplayer[4],結(jié)構(gòu)如圖4所示,。將S3C6410的MFC加入Mplayer的解碼庫中,,通過移植協(xié)議棧live555,Mplayer支持流式傳輸,。
研究發(fā)現(xiàn)為Mplayer添加解碼器的方法有多種,,總結(jié)如表1所示,本文采用了第3個(gè)方案,。
2 硬件模塊
S3C6410這款16/32位的微處理器,,主頻可達(dá)667 MHz,主處理器之外集成了MFC,,如圖5所示,,能支持MPEG4/H.263/H.264/VC1的編解碼,解碼性能可達(dá) 720×480 30 f/s或者720×576 25 f/s,。S3C6410還支持實(shí)時(shí)視頻會(huì)議等功能,。
MFC由BIT和視頻編解碼器組成。BIT處理器對(duì)數(shù)據(jù)流進(jìn)行分解,,一方面與主處理器通信來協(xié)調(diào)整個(gè)流程,,另一方面控制視頻解碼器進(jìn)行解碼。BIT處理器主要包括:BIT處理器內(nèi)核,、程序內(nèi)存,、數(shù)據(jù)內(nèi)存、與主處理器進(jìn)行交互的接口,。視頻編解碼器受BIT處理器的控制來完成解碼,,內(nèi)部包含宏塊控制器、預(yù)測(cè),、塊效應(yīng)濾波,、重構(gòu)等子模塊。
解碼時(shí)需對(duì)中間運(yùn)算緩存,,圖5中的外部存儲(chǔ)器提供了這些空間,,可分為BIT處理器緩沖和數(shù)據(jù)緩沖,如圖6和圖7,。代碼緩沖區(qū)的主要作用是存儲(chǔ)啟動(dòng)代碼,。工作緩存區(qū)緩存中間結(jié)果,其配合流緩沖區(qū)進(jìn)行工作,。參數(shù)緩存區(qū)主要存幀緩沖的地址,。主處理器對(duì)流緩沖區(qū)進(jìn)行寫操作,BIT處理器對(duì)其進(jìn)行讀操作,其緩存的是待解碼的數(shù)據(jù),。幀緩沖區(qū)存儲(chǔ)的是解碼后的YUV數(shù)據(jù)。
3 軟件模塊
3.1 Mplayer結(jié)構(gòu)分析
由圖4知,,Mplayer的結(jié)構(gòu)是模塊化的,,各個(gè)模塊在mplayer.c的協(xié)同下工作。下面對(duì)其簡要分析,。
(1)stream.c所在的輸入層,,根據(jù)讀入方式來調(diào)用文件,正如圖4中stream_*.c所示,,如strean_file.c,、stream_ftp.c、stream_netstream.c等,。這個(gè)過程通過查詢,、跳轉(zhuǎn)、緩存等來完成,。
(2)demuxer.c所在的音視頻分流層,。demuxer.c是一個(gè)基本的框架,對(duì)于具體的流如mpeg-es,、avi,、asf等,都有相應(yīng)的demux_*.c,。
(3)解碼,。解碼器由libmpcodecs/*和分離的庫組成,如liba52,、libmpeg2等,。Mplayer.c通過dec_audio.c 和dec_video.c 對(duì)流頭sh_audio_t 和 sh_video_t中的格式進(jìn)行判斷來選擇解碼器。通過dec_audo.c來調(diào)用ad_*.c,;通過dec_video.c來調(diào)用vd_*.c,,即視頻解碼器。解碼之后還需對(duì)視頻后期處理,,即需用到視頻濾波器vf_*.c,。
(4)顯示。video_out.c和audio_out.c調(diào)用不同的顯示模塊,,如vo_directfb.c,、vo_fbdev.c等。
3.2 調(diào)用MFC的API
應(yīng)用程序調(diào)用MFC的API,,現(xiàn)在對(duì)其進(jìn)行介紹,,其中涉及了Mplayer中的函數(shù):
SsbSipH264DecodeInit():解碼實(shí)例的創(chuàng)建,即初始化,;
SsbSipH264DecodeGetInBuf():獲取輸入緩存區(qū)的地址,,待解碼數(shù)據(jù)從這里讀?。?/p>
以上函數(shù)作為初始化,,需要在編寫的vd_*.c中的初始化函數(shù)int init(sh_video_t *sh)中調(diào)用,;
SsbSipH264DecodeGetConfig():在vd_*.c的mp_image_t*
decode(sh_video_t *sh,void* data,int len,int flags)中兩處被調(diào)用:其一是為了獲得視頻流的信息,如分辨率的長,、寬等,,只能在mp_image_t* decode()第一次執(zhí)行時(shí)調(diào)用,否則因時(shí)間開銷而影響視頻的顯示,,調(diào)用的格式為:SsbSipH264DecodeGetConfig(handle,,H264_DEC_GETCONF_STREAMINFO, &stream_info);其二獲得輸出地址,,格式為:SsbSipH264DecodeGetConfig(handle,,H264_DEC_GETCONF_PHYADDR_FRAM_BUF,pYUVBuf),。其源碼結(jié)構(gòu)如下:
static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags)
{ ……
if(first)
{ ……
SsbSipMPEG4DecodeGetConfig(handle,H264_DEC_GETCONF_STREAMINFO,&strea_info);
first=0; }
else
{ ……
SsbSipMPEG4DecodeGetConfig(handle,H264_DEC_GETCONF_PHYADDR_FRAM_BUF, pYUVBuf);
……}
SsbSipH264DecodeExe():在函數(shù)mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags)中被調(diào)用的解碼函數(shù),。
SsbSipH264DecodeDeInit():最后對(duì)硬件資源的釋放,在void uninit(sh_video_t *sh)中調(diào)用,。
4 實(shí)現(xiàn)流程
首先,,將live555源碼中l(wèi)ive中的文件config.armlinux里的CROSS_COMPILE改為CROSS_COMPILE?=arm-linux-,;然后依次執(zhí)行./genMakefile armlinux,、make;最后,,將編譯好的目錄復(fù)制到/usr/local/lib 下,。其次完成Mplayer軟解碼的移植[5]。
下面介紹如何將MFC添加到Mplayer中,,這是本文的關(guān)鍵,。
首先,在文件etc/codecs.conf中增加解碼器實(shí)體,。codecs.conf是對(duì)音視頻解碼器的聲明,,其關(guān)鍵字是固定的,如videocodec說明是視頻解碼器,。
其次,,編寫解碼器vd_mfc264.c。Mplayer定義了一個(gè)vd_functions_t型結(jié)構(gòu)體,。原型定義在vd.h中,,如下所示:
typedef struct vd_functions_s
{
vd_info_t *info;
int (*init)(sh_video_t *sh);
void (*uninit)(sh_video_t *sh);
int (*control)(sh_video_t *sh,int cmd,void* arg, ...);
mp_image_t* (*decode)(sh_video_t *sh,void* data,
int len,int flags);
} vd_functions_t;
(1)int init(sh_video_t *sh)完成解碼之前的初始化,包括MFC的啟動(dòng)以及一些API句柄的獲得;
(2)void uninit(sh_video_t *sh)是結(jié)束函數(shù),,完成解碼后的資源的釋放,;
(3)mp_image_t* decode(sh_video_t *sh,void* data,,int len,int flags)完成解碼,。讀取到的待解碼數(shù)據(jù)填充到圖7中的流緩沖區(qū),通過與工作緩沖區(qū)的交互,,將解碼后的YUV數(shù)據(jù)放入圖7中的幀緩沖區(qū)。
Mplayer的視頻解碼器都被libmpcodec目錄下vd.c中的指針數(shù)組mpcodecs_vd_drivers所管理,因此增加:
extern vd_functions_t mpcodecs_vd_mfc264;
vd_functions_t* mpcodecs_vd_drivers []=
{ ……
#ifdef HAVE_MFC264
&mpcodecs_vd_mfc264,
#endif
……}
(4)int control(sh_video_t *sh,int cmd,void* arg,...)的作用是控制視頻的解碼和顯示,,這個(gè)函數(shù)是為保障音視頻的同步,。
再次,編寫顯示模塊vo_mfcfb.c,。S3C6410的MFC可以對(duì)解碼后的數(shù)據(jù)進(jìn)行縮放,、濾波等后期處理。在Mplayer的源碼中,,是把數(shù)據(jù)傳給video_out.c,,然后通過調(diào)用vo_fbdev.c來使用framebuffer顯示。在硬解碼中,,由于存儲(chǔ)解碼后的數(shù)據(jù)的物理地址,,并不是在處理器的緩存中,而是在外部存儲(chǔ)器中,,這導(dǎo)致Mplayer的vo_fbdev.c無法獲得緩存地址,。解決辦法就是編寫vo_mfcfb.c,它完成將幀緩存區(qū)中的YUV數(shù)據(jù)進(jìn)行后期處理并顯示,。整個(gè)流程如圖4所示,。將vo_mfcfb.c加入到video_out.c中,不再具體敘述,。
最后,,修改Mplayer下的相關(guān)Makefile,將編寫的兩個(gè)源文件和相應(yīng)的頭文件編譯成靜態(tài)鏈接庫,。
5 系統(tǒng)測(cè)試與分析
現(xiàn)在用一臺(tái)PC運(yùn)行l(wèi)ive555來充當(dāng)流媒體服務(wù)器,,通過搭建HB,來驗(yàn)證手持測(cè)試儀上的流媒體播放功能,。
通過軟件Media Coder將測(cè)試視頻轉(zhuǎn)換成編碼幀率25 f/s,、分辨率720×480和不同的編碼碼率的視頻。圖8從播放幀率角度顯示了對(duì)比的解碼性能,。
分辨率為720×480,、編碼幀率為25 f/s的H.264視頻,在Arm11平臺(tái)下,要想達(dá)到人眼視覺可以接受的流暢性,Mplayer的軟解只能達(dá)到的碼率為500 kb/s,,而使用MFC硬解可以高達(dá)3 500 kb/s,,比軟解碼提高約3 000 kb/s。
6 結(jié)論
流媒體最耗資源的是視頻的解碼,,本文利用支持live555的Mplayer的成熟框架,,將S3C6410的MFC添加到Mplayer的解碼庫中,不僅可以降低系統(tǒng)對(duì)CPU,、內(nèi)存等硬件資源的要求,,而且大大提高了視頻質(zhì)量,這體現(xiàn)了嵌入式應(yīng)遵循的高性價(jià)比理念,。而Mplayer在嵌入式領(lǐng)域的應(yīng)用,,通常是對(duì)已有軟件解碼器進(jìn)行算法的優(yōu)化,或者直接進(jìn)行移植應(yīng)用[5],,本文的開發(fā)方案為相關(guān)應(yīng)用提供了很好的借鑒,。
參考文獻(xiàn)
[1] CONKLIN G J,GREENBAUM G S,,LILLEVOLD K O,,et al.Video coding for streaming media delivery on the Internet[J].IEEE Transactions on Circuits And Systems for Video Technology,2001,,11(3):269-281.
[2] Samsung Electronics.S3C6410X RISC microprocessor user′s Manual[Z].2008.
[3] 國家廣播電影電視總局廣播科學(xué)研究院,,北京大學(xué),西安電子科技大學(xué),,上海明波通信技術(shù)股份有限公司,,上海未來寬帶技術(shù)及應(yīng)用工程研究中心有限公司.高性能同軸電纜接入技術(shù)(HINOC)研究與實(shí)現(xiàn)論文集[M].遼寧:遼寧石油化工大學(xué),2011.
[4] Mplayer.The online documentation of Mplayer[EB/OL].(2013-05-01)[2014-06-30].http://www.mplayerhq.hu/DOCS/HTML/zh_CN/intro.html.
[5] 慈文彥,,何君,,朱明祥.基于ARM處理器的流媒體播放器客戶端的構(gòu)建[J].信息技術(shù),2012(1):106-112.