主頁 > 移動端開發 > 花了3個小時解決了和異地女朋友一起看電影的需求(內附原始碼)

花了3個小時解決了和異地女朋友一起看電影的需求(內附原始碼)

2021-09-18 14:41:13 移動端開發

?一、這是一件悲傷的故事???????

我是一名程式員,我和我的女友是異地戀,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 的引數意義如下:

  1. key: roomInfo

  2. value: 0 、1、2、3

  3. 0: 代表load start 電影

  4. 1:電影是播放狀態

  5. 2:電影是暫停狀態

  6. 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

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more