唐雨薇
(四川財(cái)經(jīng)職業(yè)學(xué)院,四川 成都 610101)
?
基于Cortex-A系列處理器的網(wǎng)絡(luò)電視APP的開發(fā)
唐雨薇
(四川財(cái)經(jīng)職業(yè)學(xué)院,四川 成都 610101)
以Cortex-A系列處理器作為硬件平臺(tái),以Android作為軟件系統(tǒng),開發(fā)了一款網(wǎng)絡(luò)電視APP,該APP軟件由網(wǎng)絡(luò)傳輸模塊、解碼模塊、播放模塊以及UI設(shè)計(jì)模塊組成。提出了軟件需求分析,并在需求分析的基礎(chǔ)上提出總體的軟件結(jié)構(gòu)并設(shè)計(jì)了相應(yīng)的模塊,模塊間協(xié)同作用實(shí)現(xiàn)了軟件功能。軟件設(shè)計(jì)完成后,在基于Cortex-A8處理器的手機(jī)硬件平臺(tái)上進(jìn)行了軟件的功能測(cè)試和性能測(cè)試。
網(wǎng)絡(luò)電視;Android開發(fā);Cortex-A處理器;FFmpeg
Cortex-A系列處理器是以ARMv7架構(gòu)為基礎(chǔ)開發(fā)的最新ARM處理器,其廣泛應(yīng)用于消費(fèi)類電子產(chǎn)品中。目前風(fēng)靡全球的三星Galaxy S3就是采用了Cortex-A9四核處理器,可見Cortex-A系列處理器的應(yīng)用范圍是相當(dāng)廣闊的。該系列微處理器囊括了高性能的Cortex-A15、可伸縮的Cortex-A9、經(jīng)市場(chǎng)考驗(yàn)的Cortex-A8以及高效的Cortex-A7[1]。此外,操作系統(tǒng)方面,Android是一種基于Linux內(nèi)核的操作系統(tǒng),在智能手機(jī)操作系統(tǒng)中的市場(chǎng)占有率已經(jīng)超過70%。該系統(tǒng)采用Software Stack架構(gòu),底層由C語言開發(fā)的Linux內(nèi)核作為基礎(chǔ),提供基本的功能;中層則轉(zhuǎn)由C++開發(fā)出虛擬機(jī)和函數(shù)庫等,用以對(duì)上層應(yīng)用程序提供良好的支持;最上層是各式各樣通過JAVA開發(fā)的應(yīng)用程序[2]。
本文將就Cortex-A8作為硬件平臺(tái),Android作為軟件操作系統(tǒng),開發(fā)一款互動(dòng)性極強(qiáng)的電視客戶端APP軟件。
軟件主要以實(shí)現(xiàn)視頻播放功能為主,體現(xiàn)在能夠流暢地在手機(jī)網(wǎng)絡(luò)條件下觀看網(wǎng)絡(luò)電視。由于安卓系統(tǒng)的智能機(jī)不像iPhone手機(jī)那樣具有統(tǒng)一的硬件配置,其處理器運(yùn)算能力參差不齊,故客戶端在實(shí)現(xiàn)功能的基礎(chǔ)上必須充分考慮其適用范圍,盡可能地適配各種運(yùn)算能力的手機(jī)[3]。同時(shí),客戶端是實(shí)現(xiàn)網(wǎng)絡(luò)電視功能,故而必須保證能夠在常規(guī)網(wǎng)絡(luò)的情況下流暢地播放視頻。
客戶端的總體規(guī)劃上采用模塊化的設(shè)計(jì)方案,依次由網(wǎng)絡(luò)傳輸協(xié)議模塊、解碼模塊和播放模塊組成。
用戶通過WAP登錄服務(wù)器選擇想要觀看的視頻,接收到用戶的選擇信息之后,流媒體管理平臺(tái)將流媒體的地址通過SDP協(xié)議發(fā)送到手機(jī)電視客戶端,手機(jī)客戶端根據(jù)該地址經(jīng)由RTSP協(xié)議向流媒體服務(wù)平臺(tái)請(qǐng)求音頻和視頻數(shù)據(jù)流。服務(wù)器在接到請(qǐng)求后通過RTP協(xié)議將流媒體數(shù)據(jù)實(shí)時(shí)地傳輸給安卓客戶端,在傳輸過程中,RTCP協(xié)議實(shí)時(shí)地監(jiān)控著傳輸質(zhì)量,并將結(jié)果反饋給服務(wù)器,對(duì)RTP的傳輸過程進(jìn)行動(dòng)態(tài)調(diào)節(jié)[4]。
安卓客戶端APP的首要問題是解決視頻數(shù)據(jù)流在網(wǎng)絡(luò)中的傳輸難題,目前廣泛采用流媒體技術(shù)來實(shí)現(xiàn)流暢的視頻播放功能。流媒體技術(shù)顧名思義就是利用流式傳輸?shù)姆绞皆诨ヂ?lián)網(wǎng)上播放的媒體格式,視頻在流媒體傳輸技術(shù)的處理下被壓縮成一個(gè)一個(gè)的壓縮包,然后通過服務(wù)器向用戶連續(xù),實(shí)時(shí)發(fā)送;用戶在接受到壓縮包后,通過設(shè)備解壓,視頻就實(shí)時(shí)顯示出來,從而擺脫了傳統(tǒng)的先下載完視頻再播放的模式。
流媒體的網(wǎng)絡(luò)視頻協(xié)議包括了RTP/RTCP,RSVP和RTSP等。TCP/IP協(xié)議棧中包含了這些協(xié)議。因此,可以直接應(yīng)用RTP/RTCP,RSVP和RTSP等協(xié)議來進(jìn)行客戶端的設(shè)計(jì)。
4.1 選擇合適的壓縮標(biāo)準(zhǔn)
在高速網(wǎng)絡(luò)視頻協(xié)議支持的基礎(chǔ)上,為了提高視頻傳輸?shù)膶?shí)時(shí)性,達(dá)到移動(dòng)電視節(jié)目實(shí)時(shí)收看的要求,視頻的編碼壓縮也起著至關(guān)重要的作用。目前的視頻壓縮標(biāo)準(zhǔn)主要分為兩類,一類是由國際電信聯(lián)盟遠(yuǎn)程通信標(biāo)準(zhǔn)化組(ITU-T)的視頻編碼專家組(VCEG)制定的 H 系列,其中包含了 H.261、H.263、H.263+和H.264 等標(biāo)準(zhǔn);另一類則是由國際標(biāo)準(zhǔn)化組織(ISO)和國際電工委員會(huì)(IEC)組建的活動(dòng)圖像專家組(MPEG)制定的 MPEG 系列,包括了MPEG-1、MPEG-2和 MPEG-7 等標(biāo)準(zhǔn)。H.264標(biāo)準(zhǔn)以其高壓縮性和網(wǎng)絡(luò)親和性占領(lǐng)了網(wǎng)絡(luò)上視頻點(diǎn)播和視頻直播的半壁江山。H.264標(biāo)準(zhǔn)在流媒體業(yè)務(wù)中的廣泛使用使其成為Android移動(dòng)電視客戶端APP的不二選擇[5]。
4.2 移植FFmpeg
在確定了壓縮標(biāo)準(zhǔn)的基礎(chǔ)上,更為重要的是選擇一種移植性強(qiáng),并能夠錄制、轉(zhuǎn)換和流化音視頻的完整解決方案。這時(shí),F(xiàn)Fmpeg成為首選,它是基于linux開發(fā)的開源軟件,具有很高的可移植性。為了能夠適應(yīng)在Cortex-A9系列處理器上面的運(yùn)行,需要對(duì)FFmpeg進(jìn)行移植和功能裁剪。
首先,在Windows環(huán)境下安裝Cygwin軟件建立交叉編譯環(huán)境,或者直接在Ubuntu系統(tǒng)環(huán)境下進(jìn)行操作。在建立好編譯環(huán)境的基礎(chǔ)上就可以利用FFmpeg 0.7.1開源項(xiàng)目和Android NDK r5c開發(fā)工具進(jìn)行移植。通過修改FFmpeg的配置腳本文件config.sh中的各個(gè)參數(shù),可以根據(jù)具體需要對(duì)體系架構(gòu)、編譯器、編解碼器等進(jìn)行配置,編譯器根據(jù)該文件提供的宏定義等信息對(duì)源文件進(jìn)行選擇性的代碼編譯,從而獲取指定平臺(tái)下的可執(zhí)行程序。config.sh文件的部分內(nèi)容如下所示:
#運(yùn)用bash shell來執(zhí)行此腳本
#!/bin/bash
#設(shè)置選擇了體系架構(gòu),目標(biāo)系統(tǒng),版本鏈接庫
PREBUILT=/home/ my-android-edition /build/prebuilt/linux/arm-eabi-4.4.0
PLATFORM=/home/ my-android-edition /build/paltforms/android-3/arch-arm
#下面設(shè)置FFmpeg的參數(shù)
./configure --target-os=linux /
--enable-version3 /
--arch=arm /
--disable-stripping /
--enable-gpl /
...
由于并不需要FFmpeg的所有功能,所以只需根據(jù)本工程需要移植FFmpeg的avutil(基礎(chǔ)模塊),avcodec(音視頻編碼模塊)和avformat(音視頻解析模塊)即可。這時(shí)在libavutil(公共工具函數(shù)庫),libavcodec(音視頻編解碼函數(shù)庫),libavformat(demuxers和muxer函數(shù)庫)的目錄下創(chuàng)建Android.mk文件。在libavutil,libavcodec和libavformat目錄下的Android.mk相差不多,libavcodec目錄下的Android.mk文件如下所示:
#下面設(shè)置編譯路徑
LOCAL_PATH := $(call my-dir)
include $(LOCAL_PATH)/../av.mk
include $(CLEAR_VARS)
#下面設(shè)置源文件路徑
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES :=
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_CFLAGS += $(FFCFLAGS)
#下面指定編譯模塊
LOCAL_MODULE := %(FFNAME)
#BUILD_SHARED_LIBRARY指定給GNU Makefile的腳本文件
include $(BUILD_STATIC_LIBRARY)
在完成每個(gè)模塊的Android.mk編寫后,需要在FFmpeg的目錄下建立Android.mk文件,將上述三個(gè)模塊編譯成libaffmpeg.so的動(dòng)態(tài)鏈接庫。在此基礎(chǔ)上,在cywin編譯環(huán)境中執(zhí)行$NDK_ROOT進(jìn)行編譯,完成移植編譯工作。FFmpeg的Android.mk文件如下所示:
#下面設(shè)置編譯路徑
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#指定libavutil,libavcodec,libavformat這三個(gè)需要的編譯模塊
LOCAL_MODULE :=ffmpeg
LOCAL_WHOLE_STATIC_LIBRARIES :=libavformat libavcodec libavutil
include $(call all-makefiles -under, $(LOCAL_PATH))
include $(BUILD_SHARED_LIBRARY)
4.3 應(yīng)用FFmpeg實(shí)現(xiàn)解碼
本系統(tǒng)應(yīng)用Android NDK移植的FFmpeg,直接移植libavcodec庫中已有的H.264視頻解碼器模塊,從而可以調(diào)用FFmpeg的內(nèi)置函數(shù)進(jìn)行想要的解碼操作。調(diào)用的函數(shù)如圖1所示。
圖1 解碼流程
在這一解碼過程中,首先使用av_register_all()注冊(cè)容器格式,然后利用av_find_stream_info0提取視頻中的流信息,在獲得想要的流信息后,avcodec_find_decoder()函數(shù)找到對(duì)應(yīng)的解碼器,avcodec_open0函數(shù)打開這個(gè)解碼器,然后avcodec_alloc_frame()函數(shù)為解碼幀分配內(nèi)存。avcodec_get_fram()從緩存區(qū)中提取數(shù)據(jù)給avcodec_decode_vide()函數(shù)解碼,解碼完成后,由av_set_frame()函數(shù)將數(shù)據(jù)放入待播放區(qū)。最后av_has_next_frame()函數(shù)判斷是否還有待解碼的幀,若有,則跳轉(zhuǎn)到avcodec_get_fram()函數(shù)提取新的數(shù)據(jù);若無,則跳轉(zhuǎn)到avcodec_close()函數(shù),關(guān)閉解碼器。
5.1 播放功能的設(shè)計(jì)
Android的多媒體核心OpenCore提供了媒體播放器的功能,其中包含了MediaPlayer類,可以利用MediaPlayer來播放需要的網(wǎng)絡(luò)流媒體。首先,創(chuàng)建一個(gè)MediaPlayer對(duì)象,再通過調(diào)用getVideoHeight() 函數(shù)和getVideoWidth() 函數(shù)設(shè)置視頻播放窗口的高度和寬度,以適應(yīng)具體的手機(jī)屏幕。由于MediaPlayer類已經(jīng)具備了播放、暫停、停止等基本的播放器功能,可以調(diào)用Mediaplayer的相應(yīng)頭文件中的內(nèi)容來實(shí)現(xiàn)這些功能,大大簡(jiǎn)化了設(shè)計(jì)工作。網(wǎng)絡(luò)流媒體的緩沖播放功能實(shí)現(xiàn)的相關(guān)代碼如下:
String play_address = “rtsp://127.0.0.1:554/media.sdp”; /*設(shè)置流媒體源的網(wǎng)絡(luò)地址*/
MediaPlayer testPlayer = new MediaPlayer(); /*新建一個(gè)播放器testPlayer*/
testPlayer.setDataSource(play_address); /*setDataSource設(shè)置了一個(gè)MediaPlayer的數(shù)據(jù)源*/
testPlayer.setOnBufferingUpdateListener(this); /*setOnBufferingUpdateListener設(shè)置緩存*/
testPlayer.prepare(); /*準(zhǔn)備*/
testPlayer.start(); /*開始播放*/
5.2 UI界面的設(shè)計(jì)
目前Android的UI設(shè)計(jì)方法主要分為3種:通過XML配置生成、通過用戶界面接口生成和直接代碼生成。筆者選用配置XML的方法來生成所要的UI界面。main.xml的部分代碼如下:
android:layout_width=”fill_parent” /*設(shè)置屏幕顯示的寬度*/ android:layout_height=”fill_parent” /*設(shè)置屏幕顯示的高度*/ android:orientation=”horizontal”> /*設(shè)置屏幕顯示的方向*/ 6.1 測(cè)試環(huán)境 正如需求分析中所述,為了能夠適用于絕大多數(shù)的智能手機(jī),筆者選用較早推出的智能手機(jī),其硬件配置較低,如果能夠在這樣的硬件平臺(tái)上面流暢運(yùn)行,說明軟件的適配性非常不錯(cuò)。所以筆者選用了HTC公司于2010年推出的暢銷智能手機(jī)HTC G7(Cortex-A8處理器,ARMv7構(gòu)架,578 Mbyte內(nèi)存)作為硬件平臺(tái);選用Android2.2作為客戶端的軟件操作系統(tǒng)。HTC G7支持WLAN功能和藍(lán)牙功能,網(wǎng)絡(luò)模式支持GSM、WCDMA等。筆者選用中國移動(dòng)的WCDMA網(wǎng)絡(luò)作為測(cè)試網(wǎng)絡(luò)。 6.2 性能測(cè)試 在客戶端APP運(yùn)行過程中,能夠流暢地觀看視頻,筆者測(cè)試了暫停和停止功能,功能實(shí)現(xiàn)基本沒有問題,手機(jī)在播放過程中如圖2所示。 圖2 客戶端APP運(yùn)行(照片) 在功能測(cè)試的基礎(chǔ)上,筆者測(cè)試了CPU的使用情況,手機(jī)的內(nèi)存占用情況用以標(biāo)定客戶端對(duì)于處理器硬件配置的要求;同時(shí)測(cè)試客戶端運(yùn)行過程中的網(wǎng)絡(luò)傳輸情況,用以標(biāo)定客戶端對(duì)網(wǎng)絡(luò)的要求。 Cortex-A8處理器的CPU使用率如圖3所示,當(dāng)客戶端開始運(yùn)行時(shí),CPU的使用率呈線性增加的勢(shì)頭,最后穩(wěn)定在50%左右,CPU使用率并不是很高。此外,ARM公司在繼Cortex-A8系列處理器之后又推出了功能更加強(qiáng)勁的Cortex-A9以及Cortex-A15等處理器,這些處理器的性能都優(yōu)于Cortex-A8,本客戶端能夠在Cortex-A8處理器上流暢地運(yùn)行,由此可見客戶端對(duì)CPU性能的要求還是比較令人滿意的。 圖3 客戶端播放時(shí)的CPU使用情況(截圖) 內(nèi)存使用情況如圖4所示,由圖可見,內(nèi)存使用率高達(dá)66%,內(nèi)存剩余空間太少,基本沒有運(yùn)行其他大型程序的空間。故客戶端對(duì)內(nèi)存的需求比較大,內(nèi)存成為此電視客戶端發(fā)展的一個(gè)瓶頸。所幸現(xiàn)在的手機(jī)市場(chǎng)發(fā)展迅速,新推出的Android或者其他操作系統(tǒng)(IOS,WP8)的手機(jī)都具備較大內(nèi)存(1 Gbyte或者2 Gbyte)的硬件配置,內(nèi)存短缺的情況基本得到緩解。但如何減小內(nèi)存占用,也是本客戶端必須解決的當(dāng)務(wù)之急。 圖4 客戶端播放時(shí)的內(nèi)存使用情況(截圖) 如圖5所示為客戶端運(yùn)行過程中的WCDMA網(wǎng)絡(luò)傳輸速度情況,可以看到,在視頻播放過程中,接收服務(wù)器數(shù)據(jù)包的速率持續(xù)高達(dá)1 000 kbit/s左右,而發(fā)送給服務(wù)器的數(shù)據(jù)包的傳輸速率則很低,只有不到6 kbit/s。這是由于在播放視頻時(shí)客戶端主要的數(shù)據(jù)流是接收服務(wù)器端發(fā)過來的數(shù)據(jù)包,發(fā)送出去的數(shù)據(jù)只是少量的,起反饋信息的作用。如今的3G發(fā)展迅猛,4G時(shí)代也已經(jīng)到來,本客戶端對(duì)于網(wǎng)絡(luò)條件的需求完全可以得到滿足。 從測(cè)試的結(jié)果來看,客戶端能夠在現(xiàn)在廣泛被市場(chǎng)認(rèn)可的Cortex-A8處理器上面流暢地運(yùn)行,CPU使用情況和內(nèi)存占用情況都比較令人滿意,顯示了本客戶端的適用性還是很不錯(cuò)的,能夠適配大多數(shù)的智能手機(jī),同時(shí)視頻播放過程中的網(wǎng)絡(luò)數(shù)據(jù)傳輸速率也能夠得到現(xiàn)今網(wǎng)絡(luò)的支持。 圖5 客戶端播放時(shí)的網(wǎng)絡(luò)傳輸情況(截圖) 本文以Cortex-A系列微處理器為硬件平臺(tái),設(shè)計(jì)了一個(gè)基于Android2.2版本操作系統(tǒng)的網(wǎng)絡(luò)電視客戶端APP。文中針對(duì)客戶端設(shè)計(jì)過程中的具體要求,選擇了合適的網(wǎng)絡(luò)傳輸協(xié)議和編碼壓縮標(biāo)準(zhǔn),然后移植了FFmpeg,利用其強(qiáng)大的編碼解壓功能,將網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)包進(jìn)行解碼。對(duì)于解碼后的數(shù)據(jù),筆者運(yùn)用了Android的多媒體核心OpenCore中的MediaPlayer類對(duì)視頻進(jìn)行播放和暫停等功能,并設(shè)計(jì)了相應(yīng)的UI界面,方便用戶操作。隨著當(dāng)代網(wǎng)絡(luò)技術(shù)的飛速發(fā)展和Android智能手機(jī)的迅速普及,基于Cortex-A系列微處理器的移動(dòng)電視客戶端APP必將迎來廣闊的發(fā)展前景。 [1]SINGH I,SINGH G.Android-based open source virtual instrumentation[J].Journal of the Instrument Society of India,2013,43(1):22-25. [2]KIYOSHI K,HIROSHI Y,CHIKARA S,et al.Contents distribution to android clients using wireless LAN multicast for a large fireworks festival[C]//Proc.the 15th International Conference on Advanced Communication Technology : Smart Services with Internet of Things.[S.l.]:IEEE Press,2013:900-905. [3]CHANDNANI P.Evolution of Android and its impact on mobile application development[J].International Journal of Scientific Engineering and Technology,2013,1(3):1-3. [4]李永吉.基于Android系統(tǒng)平臺(tái)實(shí)現(xiàn)智能電視模塊化設(shè)計(jì)與研究[D].濟(jì)南:山東大學(xué),2013. [5]劉誠,段紅光,巴義,等.基于Android移動(dòng)視頻監(jiān)控系統(tǒng)客戶端的研究與設(shè)計(jì)[J].電視技術(shù),2013,37(4):85-88. Development of Internet TV APP Based on Cortex-A Series Processor TANG Yuwei (SichuanFinanceandEconomicsVocationalCollege,Chengdu610101,China) A network TV APP is developed takes Cortex-A series processor as the hardware platform and Android as the software system.This APP is composed of network transmission module, decoding module, playing module and UI module.Firstly, the software requirement analysis is proposed.It procedes to put forward the overall structure of the software and design the corresponding module based on the requirement.The synergistic effect of the modules achieves the function of the software.Functional testing and performance testing base on the mobile phone hardware platform of Cortex-A8 also have been conducted after the design has been finished. network TV; development of Android; Cortex-A series processor; FFmpeg TN949.2;TN711 A 10.16280/j.videoe.2015.07.013 2014-11-14 【本文獻(xiàn)信息】唐雨薇.基于Cortex-A系列處理器的網(wǎng)絡(luò)電視APP的開發(fā)[J].電視技術(shù),2015,39(7). 唐雨薇(1980— ),女,講師,碩士,主研計(jì)算機(jī)科學(xué)與技術(shù)。 責(zé)任編輯:閆雯雯6 測(cè)試分析
7 結(jié)論