李 昂
(九江職業(yè)大學(xué)信息工程學(xué)院,江西九江332000)
音視頻直播技術(shù)是指利用流媒體與互聯(lián)網(wǎng)技術(shù)將音頻、視頻以及文本等信息進(jìn)行融合,通過實時直播的方式展現(xiàn)出來,實現(xiàn)圖聲并茂的效果[1]。隨著移動互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,互聯(lián)網(wǎng)帶寬不斷擴大,移動音視頻直播技術(shù)發(fā)展迅速,已被廣泛應(yīng)用于諸多場景,如在線教育、娛樂直播、網(wǎng)上購物等[2-3]。直播技術(shù)有較強的實時性,播放形式較為豐富,用戶只需要通過智能手機或平板電腦接入網(wǎng)絡(luò),就可以不受地域限制地收看直播節(jié)目。這樣一來,直播技術(shù)擴展了互聯(lián)網(wǎng)資源的受眾面,使信息實現(xiàn)最大程度共享。在知識付費的時代,這一技術(shù)給眾多企業(yè)與組織帶來了豐厚的利潤空間。本文設(shè)計實現(xiàn)了一套完整的音視頻直播系統(tǒng),系統(tǒng)技術(shù)方案可被應(yīng)用于各種需要融合直播功能的應(yīng)用系統(tǒng)中。
本項目設(shè)計的音視頻直播系統(tǒng)分為兩個部分,第一部分為基于Android 移動開發(fā)技術(shù)的移動客戶端,第二部分為基于Java 企業(yè)級應(yīng)用框架Spring+Spring MVC+MyBatis 的直播后臺管理系統(tǒng)。系統(tǒng)架構(gòu)如圖1所示。整個系統(tǒng)使用HTTP 與RTMP 兩種通信協(xié)議,HTTP 用于傳輸移動端與服務(wù)端之間的文本、圖片信息,RTMP 用于音視頻直播流傳輸。系統(tǒng)移動端采用Android 系統(tǒng)平臺,服務(wù)端采用Ubuntu 系統(tǒng)搭建Nginx 反向代理服務(wù)器。
圖1 系統(tǒng)架構(gòu)圖
RTMP(Real Time Messaging Protocol)中文譯為實時消息傳送協(xié)議,是一種為音視頻數(shù)據(jù)在播放器和服務(wù)器之間傳輸開發(fā)的私有協(xié)議[4]。RTMP 是一種TCP協(xié)議,它通過可靠的流傳輸提供了一個雙向的多路傳輸服務(wù)。協(xié)議中以消息(Message)作為基本數(shù)據(jù)單元,在傳輸時這種消息(Message)會拆分成更小的消息塊(Chunk),消息塊包含自己的頻帶內(nèi)協(xié)議控制消息,同時也為嵌入用戶控制消息提供了一種高級協(xié)議機制。被拆分后的Chunk 單元經(jīng)過TCP 協(xié)議傳輸至接收端,經(jīng)過反解碼恢復(fù)成流媒體信息數(shù)據(jù)。
RTMP 的運行機制分為握手、連接建立、建立網(wǎng)絡(luò)流以及播放四個步驟。使用時,客戶端首先向服務(wù)器發(fā)出握手請求,服務(wù)端響應(yīng)后建立網(wǎng)絡(luò)連接,之后再建立網(wǎng)絡(luò)流,最后只有在網(wǎng)絡(luò)流建立成功的基礎(chǔ)上才能進(jìn)行音視頻播放。RTMP 消息分為消息頭與有效載荷兩部分。其中消息頭由Message Type(1 字節(jié))、Length(3 字節(jié))、Timestamp(4 字節(jié))以及Message Stream ID(3 字節(jié))四個部分組成。有效載荷中包含這個消息的實際內(nèi)容,如壓縮后的音視頻數(shù)據(jù)。
本系統(tǒng)移動客戶端軟件基于Android 系統(tǒng)進(jìn)行開發(fā),使用Java 與XML 語言進(jìn)行編碼,可運行于搭載Android 系統(tǒng)的手機、平板電腦等移動設(shè)備。具體功能分為以下幾個模塊。
用戶信息模塊分為登錄注冊與個人中心兩個子模塊。新用戶可通過注冊功能注冊用戶名和密碼,已完成注冊的用戶可以在登錄界面中輸入用戶名、密碼進(jìn)行登錄。用戶名、密碼使用MD5 算法進(jìn)行加密,存儲于服務(wù)端中的MySQL 數(shù)據(jù)庫中。個人中心可顯示用戶個人信息,包括用戶頭像、用戶名、觀看記錄、系統(tǒng)設(shè)置等,用戶可以通過個人中心修改密碼。
直播模塊分為兩種模式,一種為開啟直播模式,當(dāng)用戶為主播權(quán)限時,可以通過此模式在移動終端中開啟直播。另一種為觀看直播模式,當(dāng)用戶為觀眾權(quán)限時,可以通過此模式在移動終端中觀看直播。本系統(tǒng)直播功能使用RTMP 協(xié)議,主要流程如圖2 所示。
圖2 音視頻直播流程圖
開啟直播模式屬于推流操作,這里使用Android中的SurfaceView組件顯示移動終端攝像頭采集的圖像信號,聲音通過麥克風(fēng)進(jìn)行采集。觀看直播模式屬于拉流操作,既從服務(wù)器拉取直播流,同樣使用SurfaceView 組件顯示拉取的圖像信號。直播功能使用ijkplayer 框架進(jìn)行開發(fā)。首先在Android Studio 中引入ijkplayer 依賴,之后對播放器進(jìn)行配置初始化,在活動類中獲取IjkVideoView 控件,使用setVideoPath方法獲取視頻服務(wù)器地址。最后調(diào)用mVideoView.start()進(jìn)行視頻播放。
直播互動模塊主要用于主播與觀眾之間的互動交流。在本系統(tǒng)中,用戶可使用客戶端輸入消息形成彈幕顯示于屏幕上。這里使用騰訊云即時通信服務(wù)進(jìn)行功能實現(xiàn)。即時通信服務(wù)類似一個郵件系統(tǒng),發(fā)出的每一條信息都相當(dāng)于一封郵件。利用騰訊云即時通信服務(wù)可以十分方便地實現(xiàn)文本即時交流的功能,無需額外開發(fā)一套即時通信服務(wù)端應(yīng)用。首先在Android 工程中引入騰訊云imsdk,之后調(diào)用imsdk 中的SendMessage()方法實現(xiàn)與服務(wù)器的通信即可。文字彈幕通過ListView控件以列表的形式顯示于屏幕上。
本系統(tǒng)使用Nginx 搭建基于RTMP 協(xié)議的音視頻直播服務(wù)器。Nginx 是一種輕量級高性能的HTTP和反向代理Web 服務(wù)器,其優(yōu)點是穩(wěn)定性高、功能集豐富、系統(tǒng)資源消耗低且并發(fā)能力強[5]。首先安裝Nginx,本系統(tǒng)使用Nginx-1.8.1 版本,在ubuntu 系統(tǒng)中使用源代碼進(jìn)行編譯安裝。之后安裝nginx-rtmpmodule,此模塊是基于Nginx 開發(fā)的一個RTMP 擴展模塊。安裝完成后在nginx.conf 中對rtmp 進(jìn)行配置。最后重啟Nginx 服務(wù),使用OBS 進(jìn)行推流測試。
直播后臺管理系統(tǒng)可以實現(xiàn)對正在直播的內(nèi)容進(jìn)行監(jiān)控,并且支持直播視頻的回放功能。管理員如發(fā)現(xiàn)違規(guī)的視頻內(nèi)容,可以對直播間或發(fā)起直播的用戶進(jìn)行封禁。本后臺管理系統(tǒng)采用Bootstrap 框架開發(fā)前端,使用Java Web 技術(shù)中的SSM框架開發(fā)后端,系統(tǒng)結(jié)構(gòu)框圖如圖3 所示。
圖3 直播后臺管理系統(tǒng)結(jié)構(gòu)框圖
1)Bootstrap 框架
Bootstrap 是一個由Twitter 公司的Mark Otto 和Jacob Thornton 開發(fā)的用于快速開發(fā)Web 應(yīng)用程序和網(wǎng)站的前端框架。2011 年在GitHub 上開源,其優(yōu)點在于簡單易用,有大量美觀規(guī)范的前端組件??梢苑奖阋粋€不太精通美工的后端開發(fā)人員開發(fā)出標(biāo)準(zhǔn)的前端頁面。
2)SSM框架
SSM 框架是由Spring、Spring MVC、MyBatis 三者整合而成,是繼SSH 之后一種十分流行的JAVAEE框架,目前被各種大型的企業(yè)級應(yīng)用系統(tǒng)所使用[6]。
Spring 是一個為了解決復(fù)雜企業(yè)應(yīng)用開發(fā)而創(chuàng)建的開源框架??刂品崔D(zhuǎn)與面向切面是Spring 的重要特點,其面向接口編程的特性使得不用針對Java 類進(jìn)行編程,大大降低了使用接口的復(fù)雜度。使用Spring 框架編寫的代碼減少了不必要的異常檢測,程序代碼干凈、易于管理且十分利于測試。
Spring MVC 是用于構(gòu)建Web 應(yīng)用程序的Java框架。它遵循模型——視圖——控制器的設(shè)計模式,實現(xiàn)了核心Spring 框架的所有基本特性,如控制反轉(zhuǎn)、依賴注入。Spring MVC 在DispatcherServlet 的幫助下,為在Spring 框架中使用MVC 提供了一個簡潔的解決方案。
MyBatis 是一個開源、輕量級、持久性框架。它是JDBC 和Hibernate 的替代品。MyBatis 通過將SQL 語句打包到XML 配置文件中,自動控制了Java 中SQL數(shù)據(jù)庫和對象之間的映射,與JDBC 相比,減少了50%以上的代碼量。
本文設(shè)計了一種基于Android 移動終端的音視頻直播系統(tǒng),使用Android 技術(shù)開發(fā)移動平臺客戶端,服務(wù)端采用Spring+Spring MVC+MyBatis+Bootstrap 框架開發(fā)。直播模塊采用RTMP 協(xié)議實現(xiàn)音視頻信號傳輸,使用Nginx 搭建基于RTMP 協(xié)議的音視頻直播服務(wù)器。經(jīng)過測試,本系統(tǒng)運行穩(wěn)定,能夠滿足設(shè)計需求,系統(tǒng)技術(shù)方案可應(yīng)用于各種需要使用直播功能的應(yīng)用系統(tǒng),具有一定的實用價值。