?一、這是一件悲傷的故事???????
我是一名程式員,我和我的女友是異地戀,so sad!!!
一次視頻時,她突然來了一句:“我們已經很久沒有一起看電影了吧,,,,,,”
“呃,,,好像是”,畢竟離得那么遠,一起看電影有點難啊,
女友“哦”了下,我們便陷入了沉默,
視頻結束,心情有點憂傷,是啊,已經很久沒有好好陪她了吧,
突然想到市面上有不少可以一起看電影的APP,找了下,確實不少,像微光之類的 APP 人氣都很火,下載了一個,發現還是挺有意思的,確實能解決異地一起看電影的需求,
于是“啪”的一下,靈光一現,哄女友開心的方法有了,哦耶!!!我可以自己去實作一個 demo 呀!
作為一名優質的程式員,鑒于職業探索精神以及在 ZEGO 即構科技的從業經驗,想到實作一個類似功能的 demo 還是很可以的,
說干就干,熬夜小 case,通宵搞出了demo,效果如下:

前面鋪設了這么長,相信你們也不是來看我曬狗糧的(狗頭保命),那么現在就和我一起來看看我是怎么實作這個讓女朋友歡心的“一起看電影”的功能吧,文章有點長,但是絕對很干貨,大家可以耐心看完,
二、開始準備
在開始實作一起看電影的demo之前,我們需要做一些開發前的準備作業:
01 開發環境準備
首先第一步就是準備開發環境,需要確保開發環境滿足以下要求:
-
Android Studio 2.1 或以上版本,
-
Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本,
-
Android 4.1 或以上版本,且支持音視頻的 Android 設備,
-
Android 設備已經連接到 Internet,
02 賬戶注冊
開發環境搭建好之后,我們需要去 ZEGO 官網注冊一個賬戶,進入管理控制臺并創建應用、獲取開發需要的 AppId 和 AppSign ,
具體的創建應用程序詳見此文章: 控制臺創建專案流程,
三、實作流程介紹
01 介面規范說明
首先分析 ZEGO 的 API 輸入輸出規范,根據 API使用檔案 來看,呼叫介面格式如下:

以創建 ZegoExpressEngine 單列物件為列,每個引數都詳細的決議其作用,每個介面都描述了作用與用法,
02 一起看電影的專案開發
接下來就萬事俱備了,跟著我來著手實操一下,看具體怎么實作一起看電影的專案,
專案分為兩部分:播放本地電影的服務端、拉流播放電影的客戶端,下面會進行每個部分的詳細介紹,
專案設定了最大用戶數為3人,服務端占了一位,所以客戶端只能同時兩人在線觀看電影(悄咪咪,確保你們兩個人之間不會出現第三者),
1、服務端 —— 播放電影服務端的實作流程
-
步驟一: 創建 ZegoExpressEngine 引擎:
/** 定義 SDK 引擎物件 */
ZegoExpressEngine engine;
/** 填寫 appID 和 appSign */
long appID = ; /** 請通過官網注冊獲取,格式為 123456789L */
String appSign = ; /** 64個字符,請通過官網注冊獲取,格式為"0123456789012345678901234567890123456789012345678901234567890123" */
/** 創建引擎,使用測驗環境,通用場景接入 */
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null);
-
步驟二:開啟自定義視頻采集功能:
ZegoCustomVideoCaptureConfig videoCaptureConfig = new ZegoCustomVideoCaptureConfig();
// 選擇 RAW_DATA 型別視頻幀資料
videoCaptureConfig.bufferType = ZegoVideoBufferType.RAW_DATA; engine.enableCustomVideoCapture(true, videoCaptureConfig, ZegoPublishChannel.MAIN);
-
步驟三:設定自定義視頻采集回呼物件并實作對應方法:
// 將自身作為自定義視頻采集回呼物件 sdk.setCustomVideoCaptureHandler(new IZegoCustomVideoCaptureHandler() {
@Override
public void onStart(ZegoPublishChannel channel) {
// 收到回呼后,開發者需要執行啟動視頻采集相關的業務邏輯,例如開啟攝像頭等 ...
}
@Override
public void onStop(ZegoPublishChannel channel) {
// 收到回呼后,開發者需要執行停止視頻采集相關的業務邏輯,例如關閉攝像頭等 ...
}
});
-
步驟四:選擇要播放的電影,設定房間ID,然后登錄房間,將收到自定義視頻采集回呼通知開始采集:
/** 創建用戶 */ ZegoUser user = new ZegoUser("user1");
/** 開始登錄房間 */ engine.loginRoom("room1", user);
mZegoMediaPlayer.setVideoHandler(new IZegoMediaPlayerVideoHandler() {
@Override
public void onVideoFrame(ZegoMediaPlayer zegoMediaPlayer, ByteBuffer[] byteBuffers, int[] ints, ZegoVideoFrameParam zegoVideoFrameParam) {
}
}, ZegoVideoFrameFormat.RGBA32);
-
步驟五:當客戶端發送通知開始播放電影,就開始推流(電影流),預加載load 電影,開始播放start()
/** 開始推流 */ engine.startPublishingStream("stream1");
mZegoMediaPlayer.loadResource(path, new IZegoMediaPlayerLoadResourceCallback() {
@Override
public void onl oadResourceCallback(int code) {
if (code == 0) {
mZegoMediaPlayer.start();
if (callback != null) {
callback.onLoadResourceCallback(code);
}
}
}
});
-
步驟六:呼叫發送視頻幀方法 sendCustomVideoCaptureRawData 向 SDK 提供視頻幀資料,
// 將采集的資料傳給ZEGO SDK
int totalDataLength = byteBuffers[0].capacity();
if (tempByteBuffer == null || tempByteBuffer.capacity() != totalDataLength) {
tempByteBuffer = ByteBuffer.allocateDirect(byteBuffers[0].capacity()).put(byteBuffers[0]);
} else {
tempByteBuffer.clear();
tempByteBuffer.put(byteBuffers[0]);
}
ZegoSDKManager.getInstance().getStreamService().sendCustomVideoCaptureRawData(tempByteBuffer, tempByteBuffer.capacity(), zegoVideoFrameParam);
-
步驟七:當客戶端沒有觀眾在房間或者服務器退出播放房間,結束推流將收到自定義視頻采集回呼通知停止采集,
2、客戶端——拉流播放電影客戶端的實作流程
首先,播放電影的客戶端分別有以下幾項功能:
-
A、B 端觀眾的電影拉流渲染、電影播放\暫停,
-
A、B 端觀眾音視頻的推拉流、攝像頭的翻轉開關、麥克風的開關,
-
A、B 端觀眾的房間實時訊息的發送接收,
接下來,我們將根據上述提到的具體功能展開為大家介紹:
(1)針對于電影播放功能的流程介紹
-
A 端觀眾通過后臺設定的 RoomID 成功登錄房間,如果輸入的 RoomID 不存在,就會通過判斷當前 A 端是房間內第一人,退出房間提示房間不存在;或者房間內已經滿員就會登錄失敗并提示 房間已滿員,
* 點擊電影播放按鈕 setRoomExtraInfo() 進行訊息的通知
* 后臺手機端 收到 onRoomExtraInfoUpdate() 的回呼 進行電影的播放
* 觀眾端會收到電影播放的推流 ,獲取電影推流 StreamID 進行拉流播放
-
B 端 通過輸入 RoomID 進入播放房間 ,進行電影的拉流顯示:
/**
* 開始拉流,設定遠端拉流渲染視圖,視圖模式采用 SDK 默認的模式,等比縮放填充整個 View
* 如下 play_view 為 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 物件
*/
engine.startPlayingStream("stream1", new ZegoCanvas(play_view));
-
AB端觀眾都可以通過 setRoomExtraInfo(String roomID,String key,String value,null) 來對視頻媒體進行 播放/暫停,
-
AB端觀眾都可以通過 setRoomExtraInfo(String roomID,String key,String value,null) 來對視頻媒體進行 播放/暫停,
一起看電影 setRoomExtraInfo 的引數意義如下:
-
key: roomInfo
-
value: 0 、1、2、3
-
0: 代表load start 電影
-
1:電影是播放狀態
-
2:電影是暫停狀態
-
3:房間已經被關閉
(2)針對于音視頻推拉流的程序
-
通過 ZEGO 音視頻服務進行推拉流
-
A端觀眾進入房間后,向 ZEGO 音視頻云服務推流,需要自己生成唯一的 StreamID ,然后開始預覽并推流,等到B端觀眾進入房間后,會收到SDK 的流更新通知,從中篩選出 B端觀眾流 StreamID 進行拉流
-
B端觀眾進入房間后,向 ZEGO 音視頻云服務推流,需要自己生成唯一的 StreamID ,然后開始預覽并推流,同時篩選出 A端觀眾流 StreamID 進行拉流
-
AB端觀眾可以各自控制自己的 翻轉攝像頭、開/關攝像頭、開/關麥克風 的功能:
//切換前后攝像頭 front 是否采用前置攝像頭;true 表示使用前置攝像頭;false 表示使用后置攝像頭
expressEngine.useFrontCamera(front);
// 開/關攝像頭 enable 是否打開攝像頭;true 表示打開攝像頭;false 表示關閉攝像頭
expressEngine.enableCamera(enable);
// 是否開啟麥克風 enable 是否開啟麥克風;true 表示開啟麥克風;false 表示靜音(關閉)麥克風
expressEngine.muteMicrophone(!enable);
都是跟推拉流有關,則以用戶 A 拉取用戶 B 的流為例,流程如下圖:

想要了解更加具體的實作流程,可參考官方檔案 音視頻實作流程,
(3)針對于房間實時聊天訊息的發送顯示
-
AB 端觀眾都可以在房間內發送訊息;
-
呼叫 sendBroadcastMessage 介面向同一房間內的B端觀眾發送廣播訊息,長度不能超過 1024 位元組,通過 onIMSendBroadcastMessageResult 回呼獲取訊息發送結果;
// 發送廣播訊息,每個登錄房間的用戶都會通過 onIMRecvBroadcastMessage 回呼收到此訊息【發送方不會收到該回呼】
engine.sendBroadcastMessage(roomID, msg, new IZegoIMSendBroadcastMessageCallback() {
/** 發送廣播訊息結果回呼處理 */
@Override
public void onIMSendBroadcastMessageResult(int errorCode, long messageID) {
//發送訊息結果成功或失敗的處理
}
});
-
實作 IZegoEventHandler 中的 onIMRecvBroadcastMessage 回呼,當發送方成功發送廣播訊息后,同一房間內的其他用戶通過此回呼接收相關資訊,包括訊息內容、訊息 ID、發送時間及發送方資訊,
/**
* 接收房間彈幕訊息通知
*
* @param roomID 房間 ID
* @param messageList 收到的訊息串列
*/
public void onIMRecvBarrageMessage(String roomID, ArrayList<ZegoBarrageMessageInfo> messageList){
// 收到其他用戶發送訊息的處理
}
-
發送接收到的訊息顯示到UI界面,
四、效果呈現(附 demo 原始碼下載)
01 播放電影端的效果圖

(電影播放端)
02 觀眾端的效果圖

(電影觀眾端)

(電影播放時示意圖)
附上demo給大家進行體驗,一起看電影一共分為兩部分,安裝密碼為 1:
1)服務端demo : 看電影服務端
2)客戶端demo : 一起看電影
安裝方式如下:
1)先啟動 服務端demo ,選擇電影設定房間ID;
2)客戶端 demo 通過輸入設定的房間ID 進入播放電影房,
原始碼下載:百度網盤 請輸入提取碼(密碼:qrep)五、結語
牛頓曾說:我看得遠,是因為我站在巨人的肩膀上!
基于 ZEGO 即構科技的音視頻功能,一番操作下來,很簡單就開發出來一款《一起看電影》的 demo,總體來說還是很簡單就可以實作的,
讓異地戀女友開心的方法近在咫尺,趕快行動起來體驗音視頻開發的樂趣吧!

???????
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/301069.html
標籤:其他
上一篇:安卓開發之Fragment(二)------Fragment動態添加與管理
下一篇:Kotlin~自定義DSL
