郭忠南
(無錫機電高等職業技術學校 電子信息工程系, 江蘇 無錫 214028)
?
基于Android的視頻在線播放功能的設計與實現
郭忠南
(無錫機電高等職業技術學校 電子信息工程系, 江蘇無錫214028)
隨著移動互聯網的發展與智能終端的普及,移動學習日益成為一種新型學習模式,手機APP也成為一種學習工具。視頻在線播放功能是一個完善的移動學習平臺所必備的模塊。Android系統以其較高的市場占有率和年輕化的用戶群體,使得基于Android的應用程序更容易推廣。文章分析了功能需求,介紹了相關技術,探討了視頻在線播放在Android系統上的實現細節。該功能在實驗室環境下運行良好,對實際應用有著較好的意義。
Android; Web Service; JSON; 視頻在線播放
移動學習,簡單來說就是在任何時間、任何地點借助移動設備來完成的學習,隨著手機等智能終端的發展,移動學習的關注程度與日俱增。移動學習平臺必須要能方便地讓學習者隨時隨地學習并能對師生之間的交流提供支持[1]。查閱2016年1月CNNIC 發布的《第37次中國互聯網絡發展狀況調查統計報告》發現,截至2015年12月底,我國網民數量達到 6.88 億,其中手機網民占 90.1%,數量達 6.2億[2]。隨著智能手機的出現,手機功能的增加,手機從最初的通信逐步發展成為人們獲取知識的一種有效工具。智能手機由于其便攜性、移動性以及強大功能,迅速成為移動學習的合適工具。
本文結合Android智能手機的系統特性和移動學習的需求,以一個移動學習平臺為背景來設計實現一個基于Android的視頻在線播放模塊,使用該模塊,借助智能終端可以實現隨時隨地進行視頻播放。
1.1功能分析
在多年教育教學過程中發現,雖然集中式的課堂教學仍是學習的最有效方式,但是還需要利用其他方式在業余時間不斷對知識進行重復鞏固。移動學習可以使學習者課下隨時進行課程的學習與復習,是傳統學習的一個有效輔助手段。
基于Android的視頻在線播放功能分為Android客戶端和服務器端系統兩大部分。使用客戶端,用戶可以選擇需要觀看的視頻,并可以對每個視頻進行評價,從而達到一種互動的效果;服務器端提供兩大功能:一是實現視頻資源管理,二是提供 Web Service接口,以便Android客戶端能與服務器后臺數據庫進行交互。
1.2技術分析
(1) Web Service技術。Web Service是一個支持網絡條件下不同平臺可以互操作的、自描述的、松耦合的、可編程的Web應用程序,它使用HTTP方式處理外部請求,從而引發遠程調用。Web Service是系統對外的接口[3],假如我們要從別人服務器獲取數據,當然對我們來說最好是希望他們共享數據庫,但這是不現實的,他們只會給你提供一個接口來讓你來獲取數據。借助Web Service技術,能夠使得運行于不同平臺上的不同應用無須借助于第三方軟硬件,就可將數據用于交換或集成。使用Web Service,調用遠程服務器上的方法就像使用本地方法一樣,我們并不需要關心遠程的那個方法是用什么語言編寫,也不需要關心遠程的方法是基于什么平臺。
Android 開發包沒有提供訪問Web Service的庫函數,所以我們借助KSoap2來達到目的[4],它在資源受到限制的Java環境中應用較多,KSoap2 安卓開發包是一個可以在Android平臺上使用的輕量SOAP開發包。
(2) JSON技術。JSON是一種輕量級的、簡單的數據存儲與交換格式。JSON是一種特殊的JS,它的格式是純文本的,完全獨立于編程語言。JSON之所以是一種很棒的數據交換語言跟這些特性不無關系,它不僅更容易閱讀[5],同時更便于機器去解析生成。與XML語言相比較,JSON的擴展性更好。因為JSON在存儲JS復合對象方面有絕對優勢,所以JSON具有XML無法取代的優勢。有效數據率是JSON與XML另外一個不同之處,JSON結構更清晰,冗余更少,不是必須要有嚴格的閉合標簽,所以在網絡傳輸JSON數據包的時候效率更好,減輕了網絡傳輸壓力。
Android客戶端有兩種開發方案:使用瀏覽器和開發客戶端應用程序。第一種方案直接安裝瀏覽器即可[6],但是由于移動終端設備屏幕尺寸局限,直接使用瀏覽器,呈現效果受到影響,界面跳轉也不是很方便。另外,瀏覽器的功能有限,無法提供移動學習平臺中的各種多媒體交互學習能力。第二種方案需要開發應用程序,可以根據需要量身定做,提供各種音頻、視頻及更加復雜的交互,使學習者更容易上手,并且提高學習效果。所以本系統采用C/S模式,即采用開發客戶端應用程序,服務器端使用IIS作為Web服務器運行Web Service接口,后臺數據庫采用SQL Server數據庫的方案。
2.1設計目標
(1) 設計系統所涉及的功能模型及相應的策略等,設計良好的數據庫結構。
(2) 編碼實現功能細節并進行大量的功能與性能測試。客戶端具體實現視頻在線播放、視頻評論等功能;服務器端具體設計實現Web Service接口和視頻資源的管理功能。
(3) 實現各模塊功能后進行項目整合,使得各個模塊成為一個整體,并能良好運行。
2.2功能模塊
根據功能需求分析,將客戶端和服務器端的模塊劃分如圖1所示。

圖1 功能模塊劃分
3.1Web Service接口實現
微軟.NET平臺能較好地支持Web Service技術,包括Web Service的構建與使用。與其他開發環境不一樣,使用微軟.NET平臺,開發Web Service項目并不困難,基本不需要再借助其他工具。另外,NET環境操作簡單,執行穩定,深受開發人員青睞。 微軟.NET框架自身就對Web Service支持的很好。新建Web Service,添加系統所需要的方法,以getVideoPath方法的實現為例,其他方法類似。在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字符串(比如獲取某知識點的相關評論信息),有些可以得到其他非JSON字符串形式的信息(比如修改密碼的方法,若成功返回“true”,否則返回“false”)。對于得到的JSON字符串接下來只需要按照一定的規則去解析該字符串,就可以獲取相關的數據。
3.2客戶端功能實現
下面以“視頻在線播放”模塊的實現來說明整個功能開發的相關細節。用如圖2所示,當該視圖被創建后,首先從服務器上獲取某課程所有知識點列表,并用ListView控件加以呈現。當點擊某個ListViewItem后,程序首先判斷有無對應的視頻資源,若有則緩沖播放,若無給出友好提示。
“獲取知識點”功能是通過在Android中調用我們已經開發好的Web Service接口。在實現該功能時,需要注意一個問題,那就是在安卓4.0版以后,不允許在主線程上進行網絡連接,必須另外開辟一個線程。另外Activity里控件相關操作強制放在主線程里。所以,新啟動的線程是無法操作它們,也就是說,子線程無法直接訪問主線程的界面控件。

圖2 視頻播放
Handler消息機制可以處理這樣的問題。簡單來說,Handler就是用來各進程交互數據的處理對象,Handler就像一個紐帶。多線程問題解決方案中,我們可以新建一個擁有主線程中的一個Handler的線程,當該線程可以利用Handler向主線程發送數據,主線程收到消息后會進行諸如界面更新之類的相應處理。
Android原生的視頻播放方式有三種,分別為:利用Intent調用系統安裝的播放器、利用VideoView組件以及利用MediaPlayer類搭配SufferView類。
1) 調用系統安裝的播放器。這種方式需要借助于Intent,只要設置好視頻路徑,系統就會自動檢索手機上已安裝的視頻播放器來播放,參考代碼如下:
Uri uri=Uri.parse("視頻完整路徑");
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"video/*");
startActivity(intent);
2) 利用VideoView組件。VideoView是系統封裝的用于視頻播放的一種組件,其內部使用MediaPlayer類實現,MediaPlayer既能播放視頻,又能播放音頻。使用時,把VideoView組件布局到文件中,然后再搭配一個為視頻播放提供控制條的MediaController對象,設置好VideoView的播放路徑,start方法用來播放視頻。VideoView的大多數控制功能都已實現,開發效率較高,不足之處是,諸如“視頻全屏”等就必須自己實現,該功能可參考如下代碼:
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
//設置相對于父布局四邊對齊
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);
在播放視頻時,需要一個加載的過程,這個過程我們要進行處理,比如用一個進度條來直觀呈現其加載過程,這樣利于用戶體驗,具體實現可以通過為videoView添加OnPrepared監聽的方式來實現。
public void onPrepared(MediaPlayer mp) {
//如果文件加載成功,隱藏進度條
progressBar.setVisibility(View.GONE);
}
3) 利用MediaPlayer類搭配SufferView類播放視頻。相對于第二種實現方式,這種方式更加靈活,但是實現起來相對也要復雜很多。SurfaceView是View的子類,內嵌了一個surface用于繪制,我們可以設置該surface的樣子、大小以及出現的位置。SurfaceView的作用是呈現畫面,MediaPlayer來控制視頻的播放。
在這種視頻播放方式中,“暫停”“播放”“最大化”“進度控制”以及“播放時間顯示”等等功能都需要我們自己編寫代碼實現。篇幅所限,只介紹“視頻播放”的核心代碼,其他功能的實現不再贅述。
利用MediaPlayer播放視頻的核心代碼如下:
public void playVideo() {
mediaPlayer = new MediaPlayer();
// 重置mediaPaly,建議在初始滑mediaplay立即調用。
mediaPlayer.reset();
// 設置聲音效果
mediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC);
// 設置播放完成監聽
mediaPlayer.setOnCompletionListener(this);
// 設置媒體加載完成以后回調函數。
mediaPlayer.setOnPreparedListener(this);
// 錯誤監聽回調函數
mediaPlayer.setOnErrorListener(this);
// 設置緩存變化監聽
mediaPlayer.setOnBufferingUpdateListener(this);
Uri uri = Uri.parse("視頻完整路徑");
try {
mediaPlayer.setDataSource(SurfaceViewActivity.this, uri);
//異步加載視頻
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace(); }
}
功能實現完畢,需要對其進行詳細測試,需要逐項檢查是否達到需求程度。除此之外,我們還需要考慮其性能、安全以及用戶體驗等諸多方面是否都能滿足用戶要求。測試過程中,需要選用合適的測試方法來發現隱藏在程序中的漏洞缺陷,根據測試的結果數據來進一步完善,減少功能付諸使用后發生錯誤的概率。將客戶端程序安裝在不同型號的Android手機上并進行反復的大量測試,使用效果能達到預期。
Android的MediaPlayer類只支持3GP和MP4兩種視頻格式,所以服務器上的源視頻格式就有所限制,這是本功能的局限之處,一種解決方案就是通過架設流媒體服務器解決。基于Android的視頻在線播放功能可以促進學習者提高學習效率,這是學習者鞏固所學知識的一個很好的輔助手段,它對慕課等移動學習平臺的建設具有較好的實用價值。
[1]朱學偉,朱昱,徐小麗. 微信支持下的移動學習平臺研究與設計[J]. 中國遠程教育,2014(4):77-83.
[2]第37次中國互聯網絡發展狀況調查統計報告[EB/OL] . (2016-01-22)[2016-04-25]. http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/.
[3]柳峰. Android開發之WebService介紹[EB/OL].(2011-05-14)[2016-04-11]. http://blog.csdn.net/lyq8479/article/details/6420398.
[4]柳峰. Android平臺調用WebService詳解[EB/OL]. (2011-05-18)[2016-4-11]. http://blog.csdn.net/lyq8479/article/details/6428288.
[5]陳瑋,賈宗璞. 利用JSON降低XML數據冗余的研究[J].計算機應用與軟件,2012,29(9):188-190.
[6]申晉祥,鮑美英. 基于Android的移動在線教育平臺的設計與實現[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
項目來源:江蘇省職業技術教育學會立項課題(XHXS2015018);江蘇省教育科學研究院現代教育技術研究所立項課題(2015-R-40283)
郭忠南(1980—),男,山東煙臺人,講師,研究方向:軟件技術、無線通信技術。
10.13750/j.cnki.issn.1671-7880.2016.05.012
TP 311.1
A
1671-7880(2016)05-0043-04