郭忠南
(無錫機電高等職業(yè)技術(shù)學校 電子信息工程系, 江蘇 無錫 214028)
?
基于Android的視頻在線播放功能的設(shè)計與實現(xiàn)
郭忠南
(無錫機電高等職業(yè)技術(shù)學校 電子信息工程系, 江蘇無錫214028)
隨著移動互聯(lián)網(wǎng)的發(fā)展與智能終端的普及,移動學習日益成為一種新型學習模式,手機APP也成為一種學習工具。視頻在線播放功能是一個完善的移動學習平臺所必備的模塊。Android系統(tǒng)以其較高的市場占有率和年輕化的用戶群體,使得基于Android的應(yīng)用程序更容易推廣。文章分析了功能需求,介紹了相關(guān)技術(shù),探討了視頻在線播放在Android系統(tǒng)上的實現(xiàn)細節(jié)。該功能在實驗室環(huán)境下運行良好,對實際應(yīng)用有著較好的意義。
Android; Web Service; JSON; 視頻在線播放
移動學習,簡單來說就是在任何時間、任何地點借助移動設(shè)備來完成的學習,隨著手機等智能終端的發(fā)展,移動學習的關(guān)注程度與日俱增。移動學習平臺必須要能方便地讓學習者隨時隨地學習并能對師生之間的交流提供支持[1]。查閱2016年1月CNNIC 發(fā)布的《第37次中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況調(diào)查統(tǒng)計報告》發(fā)現(xiàn),截至2015年12月底,我國網(wǎng)民數(shù)量達到 6.88 億,其中手機網(wǎng)民占 90.1%,數(shù)量達 6.2億[2]。隨著智能手機的出現(xiàn),手機功能的增加,手機從最初的通信逐步發(fā)展成為人們獲取知識的一種有效工具。智能手機由于其便攜性、移動性以及強大功能,迅速成為移動學習的合適工具。
本文結(jié)合Android智能手機的系統(tǒng)特性和移動學習的需求,以一個移動學習平臺為背景來設(shè)計實現(xiàn)一個基于Android的視頻在線播放模塊,使用該模塊,借助智能終端可以實現(xiàn)隨時隨地進行視頻播放。
1.1功能分析
在多年教育教學過程中發(fā)現(xiàn),雖然集中式的課堂教學仍是學習的最有效方式,但是還需要利用其他方式在業(yè)余時間不斷對知識進行重復鞏固。移動學習可以使學習者課下隨時進行課程的學習與復習,是傳統(tǒng)學習的一個有效輔助手段。
基于Android的視頻在線播放功能分為Android客戶端和服務(wù)器端系統(tǒng)兩大部分。使用客戶端,用戶可以選擇需要觀看的視頻,并可以對每個視頻進行評價,從而達到一種互動的效果;服務(wù)器端提供兩大功能:一是實現(xiàn)視頻資源管理,二是提供 Web Service接口,以便Android客戶端能與服務(wù)器后臺數(shù)據(jù)庫進行交互。
1.2技術(shù)分析
(1) Web Service技術(shù)。Web Service是一個支持網(wǎng)絡(luò)條件下不同平臺可以互操作的、自描述的、松耦合的、可編程的Web應(yīng)用程序,它使用HTTP方式處理外部請求,從而引發(fā)遠程調(diào)用。Web Service是系統(tǒng)對外的接口[3],假如我們要從別人服務(wù)器獲取數(shù)據(jù),當然對我們來說最好是希望他們共享數(shù)據(jù)庫,但這是不現(xiàn)實的,他們只會給你提供一個接口來讓你來獲取數(shù)據(jù)。借助Web Service技術(shù),能夠使得運行于不同平臺上的不同應(yīng)用無須借助于第三方軟硬件,就可將數(shù)據(jù)用于交換或集成。使用Web Service,調(diào)用遠程服務(wù)器上的方法就像使用本地方法一樣,我們并不需要關(guān)心遠程的那個方法是用什么語言編寫,也不需要關(guān)心遠程的方法是基于什么平臺。
Android 開發(fā)包沒有提供訪問Web Service的庫函數(shù),所以我們借助KSoap2來達到目的[4],它在資源受到限制的Java環(huán)境中應(yīng)用較多,KSoap2 安卓開發(fā)包是一個可以在Android平臺上使用的輕量SOAP開發(fā)包。
(2) JSON技術(shù)。JSON是一種輕量級的、簡單的數(shù)據(jù)存儲與交換格式。JSON是一種特殊的JS,它的格式是純文本的,完全獨立于編程語言。JSON之所以是一種很棒的數(shù)據(jù)交換語言跟這些特性不無關(guān)系,它不僅更容易閱讀[5],同時更便于機器去解析生成。與XML語言相比較,JSON的擴展性更好。因為JSON在存儲JS復合對象方面有絕對優(yōu)勢,所以JSON具有XML無法取代的優(yōu)勢。有效數(shù)據(jù)率是JSON與XML另外一個不同之處,JSON結(jié)構(gòu)更清晰,冗余更少,不是必須要有嚴格的閉合標簽,所以在網(wǎng)絡(luò)傳輸JSON數(shù)據(jù)包的時候效率更好,減輕了網(wǎng)絡(luò)傳輸壓力。
Android客戶端有兩種開發(fā)方案:使用瀏覽器和開發(fā)客戶端應(yīng)用程序。第一種方案直接安裝瀏覽器即可[6],但是由于移動終端設(shè)備屏幕尺寸局限,直接使用瀏覽器,呈現(xiàn)效果受到影響,界面跳轉(zhuǎn)也不是很方便。另外,瀏覽器的功能有限,無法提供移動學習平臺中的各種多媒體交互學習能力。第二種方案需要開發(fā)應(yīng)用程序,可以根據(jù)需要量身定做,提供各種音頻、視頻及更加復雜的交互,使學習者更容易上手,并且提高學習效果。所以本系統(tǒng)采用C/S模式,即采用開發(fā)客戶端應(yīng)用程序,服務(wù)器端使用IIS作為Web服務(wù)器運行Web Service接口,后臺數(shù)據(jù)庫采用SQL Server數(shù)據(jù)庫的方案。
2.1設(shè)計目標
(1) 設(shè)計系統(tǒng)所涉及的功能模型及相應(yīng)的策略等,設(shè)計良好的數(shù)據(jù)庫結(jié)構(gòu)。
(2) 編碼實現(xiàn)功能細節(jié)并進行大量的功能與性能測試??蛻舳司唧w實現(xiàn)視頻在線播放、視頻評論等功能;服務(wù)器端具體設(shè)計實現(xiàn)Web Service接口和視頻資源的管理功能。
(3) 實現(xiàn)各模塊功能后進行項目整合,使得各個模塊成為一個整體,并能良好運行。
2.2功能模塊
根據(jù)功能需求分析,將客戶端和服務(wù)器端的模塊劃分如圖1所示。
圖1 功能模塊劃分
3.1Web Service接口實現(xiàn)
微軟.NET平臺能較好地支持Web Service技術(shù),包括Web Service的構(gòu)建與使用。與其他開發(fā)環(huán)境不一樣,使用微軟.NET平臺,開發(fā)Web Service項目并不困難,基本不需要再借助其他工具。另外,NET環(huán)境操作簡單,執(zhí)行穩(wěn)定,深受開發(fā)人員青睞。 微軟.NET框架自身就對Web Service支持的很好。新建Web Service,添加系統(tǒng)所需要的方法,以getVideoPath方法的實現(xiàn)為例,其他方法類似。在WebService.asmx.cs中添加如下代碼:
public string getVideoPath (string cId)
{ DataTable dt = new DataTable();
try{
String sql = "select vPath from courseRes where courseId=" + cId;
SqlCommand command = new SqlCommand(sql, sqlCon);
SqlDataAdapter sda = new SqlDataAdapter(command);
sda.Fill(dt);}
catch (Exception e) { }
return JsonConvert.SerializeObject(dt, newDataTableConverter()); } }
在Web Service開放的接口中,有些可以得到一個JSON字符串(比如獲取某知識點的相關(guān)評論信息),有些可以得到其他非JSON字符串形式的信息(比如修改密碼的方法,若成功返回“true”,否則返回“false”)。對于得到的JSON字符串接下來只需要按照一定的規(guī)則去解析該字符串,就可以獲取相關(guān)的數(shù)據(jù)。
3.2客戶端功能實現(xiàn)
下面以“視頻在線播放”模塊的實現(xiàn)來說明整個功能開發(fā)的相關(guān)細節(jié)。用如圖2所示,當該視圖被創(chuàng)建后,首先從服務(wù)器上獲取某課程所有知識點列表,并用ListView控件加以呈現(xiàn)。當點擊某個ListViewItem后,程序首先判斷有無對應(yīng)的視頻資源,若有則緩沖播放,若無給出友好提示。
“獲取知識點”功能是通過在Android中調(diào)用我們已經(jīng)開發(fā)好的Web Service接口。在實現(xiàn)該功能時,需要注意一個問題,那就是在安卓4.0版以后,不允許在主線程上進行網(wǎng)絡(luò)連接,必須另外開辟一個線程。另外Activity里控件相關(guān)操作強制放在主線程里。所以,新啟動的線程是無法操作它們,也就是說,子線程無法直接訪問主線程的界面控件。
圖2 視頻播放
Handler消息機制可以處理這樣的問題。簡單來說,Handler就是用來各進程交互數(shù)據(jù)的處理對象,Handler就像一個紐帶。多線程問題解決方案中,我們可以新建一個擁有主線程中的一個Handler的線程,當該線程可以利用Handler向主線程發(fā)送數(shù)據(jù),主線程收到消息后會進行諸如界面更新之類的相應(yīng)處理。
Android原生的視頻播放方式有三種,分別為:利用Intent調(diào)用系統(tǒng)安裝的播放器、利用VideoView組件以及利用MediaPlayer類搭配SufferView類。
1) 調(diào)用系統(tǒng)安裝的播放器。這種方式需要借助于Intent,只要設(shè)置好視頻路徑,系統(tǒng)就會自動檢索手機上已安裝的視頻播放器來播放,參考代碼如下:
Uri uri=Uri.parse("視頻完整路徑");
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"video/*");
startActivity(intent);
2) 利用VideoView組件。VideoView是系統(tǒng)封裝的用于視頻播放的一種組件,其內(nèi)部使用MediaPlayer類實現(xiàn),MediaPlayer既能播放視頻,又能播放音頻。使用時,把VideoView組件布局到文件中,然后再搭配一個為視頻播放提供控制條的MediaController對象,設(shè)置好VideoView的播放路徑,start方法用來播放視頻。VideoView的大多數(shù)控制功能都已實現(xiàn),開發(fā)效率較高,不足之處是,諸如“視頻全屏”等就必須自己實現(xiàn),該功能可參考如下代碼:
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
//設(shè)置相對于父布局四邊對齊
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP); lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
//為VideoView添加屬性
videoView.setLayoutParams(lp);
在播放視頻時,需要一個加載的過程,這個過程我們要進行處理,比如用一個進度條來直觀呈現(xiàn)其加載過程,這樣利于用戶體驗,具體實現(xiàn)可以通過為videoView添加OnPrepared監(jiān)聽的方式來實現(xiàn)。
public void onPrepared(MediaPlayer mp) {
//如果文件加載成功,隱藏進度條
progressBar.setVisibility(View.GONE);
}
3) 利用MediaPlayer類搭配SufferView類播放視頻。相對于第二種實現(xiàn)方式,這種方式更加靈活,但是實現(xiàn)起來相對也要復雜很多。SurfaceView是View的子類,內(nèi)嵌了一個surface用于繪制,我們可以設(shè)置該surface的樣子、大小以及出現(xiàn)的位置。SurfaceView的作用是呈現(xiàn)畫面,MediaPlayer來控制視頻的播放。
在這種視頻播放方式中,“暫停”“播放”“最大化”“進度控制”以及“播放時間顯示”等等功能都需要我們自己編寫代碼實現(xiàn)。篇幅所限,只介紹“視頻播放”的核心代碼,其他功能的實現(xiàn)不再贅述。
利用MediaPlayer播放視頻的核心代碼如下:
public void playVideo() {
mediaPlayer = new MediaPlayer();
// 重置mediaPaly,建議在初始滑mediaplay立即調(diào)用。
mediaPlayer.reset();
// 設(shè)置聲音效果
mediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC);
// 設(shè)置播放完成監(jiān)聽
mediaPlayer.setOnCompletionListener(this);
// 設(shè)置媒體加載完成以后回調(diào)函數(shù)。
mediaPlayer.setOnPreparedListener(this);
// 錯誤監(jiān)聽回調(diào)函數(shù)
mediaPlayer.setOnErrorListener(this);
// 設(shè)置緩存變化監(jiān)聽
mediaPlayer.setOnBufferingUpdateListener(this);
Uri uri = Uri.parse("視頻完整路徑");
try {
mediaPlayer.setDataSource(SurfaceViewActivity.this, uri);
//異步加載視頻
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace(); }
}
功能實現(xiàn)完畢,需要對其進行詳細測試,需要逐項檢查是否達到需求程度。除此之外,我們還需要考慮其性能、安全以及用戶體驗等諸多方面是否都能滿足用戶要求。測試過程中,需要選用合適的測試方法來發(fā)現(xiàn)隱藏在程序中的漏洞缺陷,根據(jù)測試的結(jié)果數(shù)據(jù)來進一步完善,減少功能付諸使用后發(fā)生錯誤的概率。將客戶端程序安裝在不同型號的Android手機上并進行反復的大量測試,使用效果能達到預(yù)期。
Android的MediaPlayer類只支持3GP和MP4兩種視頻格式,所以服務(wù)器上的源視頻格式就有所限制,這是本功能的局限之處,一種解決方案就是通過架設(shè)流媒體服務(wù)器解決?;贏ndroid的視頻在線播放功能可以促進學習者提高學習效率,這是學習者鞏固所學知識的一個很好的輔助手段,它對慕課等移動學習平臺的建設(shè)具有較好的實用價值。
[1]朱學偉,朱昱,徐小麗. 微信支持下的移動學習平臺研究與設(shè)計[J]. 中國遠程教育,2014(4):77-83.
[2]第37次中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況調(diào)查統(tǒng)計報告[EB/OL] . (2016-01-22)[2016-04-25]. http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/.
[3]柳峰. Android開發(fā)之WebService介紹[EB/OL].(2011-05-14)[2016-04-11]. http://blog.csdn.net/lyq8479/article/details/6420398.
[4]柳峰. Android平臺調(diào)用WebService詳解[EB/OL]. (2011-05-18)[2016-4-11]. http://blog.csdn.net/lyq8479/article/details/6428288.
[5]陳瑋,賈宗璞. 利用JSON降低XML數(shù)據(jù)冗余的研究[J].計算機應(yīng)用與軟件,2012,29(9):188-190.
[6]申晉祥,鮑美英. 基于Android的移動在線教育平臺的設(shè)計與實現(xiàn)[J]. 軟件,2016,37(3):30-33.
責任編輯陳桂梅
Design and implementation of the function of playing video online based on Android
GUO Zhongnan
(WuxiMachineryandElectronHigherProfessionalandTechnicalSchool,WuXi214028,China)
With the development of mobile internet and the popularization of smart client, mobile learning has become a new learning mode and app has also become a kind of learning tool. The function of playing video online is a necessary modules for the perfect mobile learning platform. Because of the high market share of the Android system and the young users, the application based on Android is much easier to popularize. This paper analyzes the requirement of the function, introduces the related technology, discusses the details of playing video online on Android system. The function works well in the laboratory environment and has great significance for practical application.
Android; Web Service; JSON; Playing Video Online
2016-05-25
項目來源:江蘇省職業(yè)技術(shù)教育學會立項課題(XHXS2015018);江蘇省教育科學研究院現(xiàn)代教育技術(shù)研究所立項課題(2015-R-40283)
郭忠南(1980—),男,山東煙臺人,講師,研究方向:軟件技術(shù)、無線通信技術(shù)。
10.13750/j.cnki.issn.1671-7880.2016.05.012
TP 311.1
A
1671-7880(2016)05-0043-04