日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

云信小课堂|如何实现音视频通话

發(fā)布時間:2025/3/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 云信小课堂|如何实现音视频通话 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

大家好,歡迎大家來到「云信小課堂 」。

本欄目致力于解答有關(guān)IM和音視頻的一切問題,產(chǎn)品特點(diǎn)、使用場景、技術(shù)名詞、接入指南、功能實現(xiàn)......歡迎大家留言提問,我們每節(jié)課會選取大家感興趣的問題進(jìn)行解答。

?

概述

微信的火熱讓網(wǎng)絡(luò)語音/視頻通話逐步替代了傳統(tǒng)手機(jī)通話,那么如果快速實現(xiàn)一款輕量的音視頻通話應(yīng)用呢?其實并不復(fù)雜,幾十行代碼就能實現(xiàn)。

開學(xué)第一課,我們一起聊一聊如何快速實現(xiàn)音視頻通話。

?

功能解析

我們先來定義一下一款輕量的音視頻通話應(yīng)用需要哪些功能,首先基礎(chǔ)類功能可能包含

  • 加入/離開通話
  • 語音/視頻通話
  • 音頻/視頻開啟與關(guān)閉

具體可參見下圖,當(dāng)然在基礎(chǔ)類功能之上我們也可以引入美顏、變聲等更多高級的玩法,本期暫不做展開,后面會陸續(xù)為大家介紹哦!

?

功能實現(xiàn)

本章以 ?iOS 為例介紹如何使用 NERTC SDK 實現(xiàn)音視頻通話,更多終端參見網(wǎng)易云信官方 Github

以下內(nèi)容為大家介紹如果基于 網(wǎng)易云信 音視頻通話2.0 SDK 快速實現(xiàn)音視頻通話功能,基本步驟如下:

  • 集成SDK(網(wǎng)易云信音視頻2.0 SDK)
  • 設(shè)置本地視圖
  • 加入頻道
  • 設(shè)置遠(yuǎn)端視圖
  • 音頻流
  • 離開頻道
  • 銷毀音視頻實例
  • ?

    集成 SDK

    CocoaPods 集成

    集成前,請先前往SDK下載頁面查看當(dāng)前最新版本,并查詢本地倉庫中對應(yīng)的版本是否為最新版本。若不是最新版本,建議先更新本地倉庫,以確保可以集成最新的SDK版本。

    pod search NERtcSDK //本地倉庫中查詢 NERtcSDK 信息 pod repo update //更新本地倉庫 pod install //執(zhí)行安裝

    至此, NERTC SDK 已經(jīng)導(dǎo)入完成。

    ?

    手動導(dǎo)入 SDK 集成

    • 請先前往 SDK 下載頁獲取當(dāng)前最新版本;
    • 將解壓得到的 NERtcSDK.framework 和 NMCBasicModuleFramework.framework 文件拷貝到工程項目文件夾下;
    • 以 Xcode Version 11.5 為例,進(jìn)入TARGETS > Project Name > General > Frameworks, Libraries, and Embedded Content 菜單,點(diǎn)擊 +,再點(diǎn)擊 Add Other…,將上述解壓得到的 SDK 文件添加進(jìn)去。同時,將 Embed 屬性設(shè)置為 Embed & Sign,以使得 SDK 動態(tài)庫和應(yīng)用簽名保持一致;

    至此, NERTC SDK 已經(jīng)導(dǎo)入完成。

    ?

    實現(xiàn)音視頻通話

    本節(jié)以 iOS 為例介紹如何使用 NERTC SDK 實現(xiàn)音視頻通話,主要流程如下圖所示:

    (更多終端參見網(wǎng)易云信官方 Github)

    *此處 Server 指的是云信 SDK Sever。

    初始化

    • 引入頭文件
    #import <NERtcSDK/NERtcSDK.h>
    • 執(zhí)行初始化
    @interface Myapp () ...NERtcEngine coreEngine = [NERtcEngine sharedEngine];NERtcEngineContext context = [[NERtcEngineContext alloc] init]; context.engineDelegate = self; context.appKey = AppKey; [coreEngine setupEngineWithContext:context]; ...

    初始化的參數(shù)類 NERtcEngineContext 屬性說明:

    @interface NERtcEngineContext : NSObject /**已開通音視頻功能的云信應(yīng)用的AppKey。*/@property (nonatomic, copy) NSString *appKey; /**log的相關(guān)設(shè)置,由開發(fā)者提供。可選參數(shù)。*/@property (nonatomic, strong) NERtcLogSetting *logSetting; /**通話相關(guān)信息的回調(diào)接口,由開發(fā)者提供。*/@property (nonatomic, weak) id<NERtcEngineDelegateEx> engineDelegate; @end

    設(shè)置本地視圖

    啟動視頻流

    • API 描述

    ?

    @protocol INERtcEngine <NSObject>/**開啟自己的視頻。可以在加入頻道前和頻道后調(diào)用。@param enabled 是否開啟@return 操作返回值,成功則返回 0 */ - (int)enableLocalVideo:(BOOL)enabled;@end
    • 示例代碼
    [NERtcEngine.sharedEngine enableLocalVideo:YES];

    ?

    設(shè)置本地視頻畫布

    啟動視頻流后,可以設(shè)置本地視頻畫布,用來顯示本地采集的視頻畫面。

    • API 描述
    @protocol INERtcEngine <NSObject>/**設(shè)置本地視頻畫布@param canvas 視頻窗口,如果需要刪除則傳 nil@return 操作返回值,成功則返回 0*/ - (int)setupLocalVideoCanvas:(NERtcVideoCanvas *)canvas;@end
    • 示例代碼

    ?

    NERtcVideoCanvas *canvas = [[NERtcVideoCanvas alloc] init]; canvas.container = self.localUserView;[NERtcEngine.sharedEngine setupLocalVideoCanvas:canvas];

    設(shè)置成功后,即可顯示本地視頻畫面。

    ?

    加入頻道

    加入頻道前,請確保已完成初始化相關(guān)事項。若您的業(yè)務(wù)中涉及呼叫邀請等機(jī)制,可以使用信令。

    • API 描述

    ?

    @protocol INERtcEngine <NSObject>/** 加入頻道@param token 頻道token@param channelName 頻道名@param uId 當(dāng)前用戶的Id@param completion 操作完成的 block 回調(diào)@return 操作返回值,被執(zhí)行了則返回 0*/ - (int)joinChannelWithToken:(NSString *)token channelName:(nullable NSString *)channelName myUid:(uint64_t)uId completion:(NERtcJoinChannelCompletion)completion;@end

    ?

    • 參數(shù)說明
      • token:頻道 token。支持傳入以下內(nèi)容:
        • 空字符串。該種方式需要先開通非安全模式。安全性不高,建議在產(chǎn)品正式上線前轉(zhuǎn)為安全模式;
        • 安全認(rèn)證簽名密鑰。安全模式下必需。若未傳入正確的 token 將無法進(jìn)入頻道。建議使用安全模式;
      • channelName:頻道名稱,傳入相同頻道名稱的用戶會進(jìn)入同一個通話頻道;
      • UID:用戶的唯一標(biāo)識 Id,頻道內(nèi)每個用戶的 UID 必須是唯一的;
    • 示例代碼
    //加入房間 - (void)joinChannelWithRoomId:(NSString *)roomIduserId:(uint64_t)userId {__weak typeof(self) weakSelf = self;[NERtcEngine.sharedEngine joinChannelWithToken:@""channelName:roomIdmyUid:userIdcompletion:^(NSError * _Nullable error, uint64_tchannelId, uint64_t elapesd) {if (error) {//加入失敗了,彈框之后退出當(dāng)前頁面} else {//加入成功}}]; }

    設(shè)置遠(yuǎn)端視圖

    視頻通話過程中,除了要顯示本地的視頻畫面,通常也要顯示參與通話的其他用戶的遠(yuǎn)端視頻畫面。

    監(jiān)聽遠(yuǎn)端用戶進(jìn)出頻道

    • API 描述

    ?

    @protocol NERtcEngineDelegate <NSObject>/**其他用戶加入頻道的回調(diào)@param userID 用戶的id@param userName 用戶名稱*/ - (void)onNERtcEngineUserDidJoinWithUserID:(uint64_t)userID userName:(NSString *)userName; /**其他用戶離開頻道的回調(diào)@param userID 用戶的id@param reason 離開的原因*/ - (void)onNERtcEngineUserDidLeaveWithUserID:(uint64_t)userID reason:(NERtcSessionLeaveReason)reason;@end


    設(shè)置遠(yuǎn)端視頻畫布

    監(jiān)聽到遠(yuǎn)端用戶加入頻道后,可以設(shè)置遠(yuǎn)端視頻畫布,用來顯示遠(yuǎn)端用戶的視頻畫面。

    • API 描述

    ?

    @protocol INERtcEngine <NSObject> /**設(shè)置遠(yuǎn)端的視頻播放窗口只能在加入頻道后調(diào)用@param userID 用戶的id@param canvas 視頻窗口,如果需要刪除則傳nil@return 操作返回值,成功則返回 0*/ - (int)setupRemoteVideoCanvas:(NERtcVideoCanvas *)canvas forUserID:(uint64_t)userID;@end

    ?

    • 示例代碼

    ?

    - (void)onNERtcEngineUserDidJoinWithUserID:(uint64_t)userID userName:(NSString *)userName {//如果已經(jīng)setup了一個遠(yuǎn)端的canvas,則不需要再建立了...if (_remoteCanvas != nil) {return;}//建立遠(yuǎn)端canvas,用來渲染遠(yuǎn)端畫面NERtcVideoCanvas *canvas = [self setupRemoteCanvasWithUid:userID];[NERtcEngine.sharedEngine setupRemoteVideoCanvas:canvas forUserID:userID];... }···- (void)onNERtcEngineUserDidLeaveWithUserID:(uint64_t)userID reason:(NERtcSessionLeaveReason)reason {//如果遠(yuǎn)端的人離開了,重置遠(yuǎn)端模型和UI...[NERtcEngine.sharedEngine setupRemoteVideoCanvas:nil forUserID:userID];... }


    監(jiān)聽遠(yuǎn)端視頻流發(fā)布

    當(dāng)前道中的其他用戶有視頻流發(fā)出/關(guān)閉時,分別會走入以下回調(diào):

    • API 描述
    ??????@protocol NERtcEngineDelegate <NSObject> /**其他用戶打開視頻的回調(diào)@param userID 用戶id@param profile 用戶發(fā)送視頻的最大分辨率類型*/ - (void)onNERtcEngineUserVideoDidStartWithUserID:(uint64_t)userID videoProfile:(NERtcVideoProfileType)profile; /**其他用戶關(guān)閉視頻的回調(diào)@param userID 用戶id*/ - (void)onNERtcEngineUserVideoDidStop:(uint64_t)userID;@end

    ?

    訂閱遠(yuǎn)端視頻流

    在設(shè)置完遠(yuǎn)端視頻畫布后,且監(jiān)聽到遠(yuǎn)端用戶有視頻發(fā)布時,可以訂閱遠(yuǎn)端用戶的視頻流。

    • API 描述
    ????@protocol INERtcEngineEx /** 訂閱或取消訂閱別人的視頻,訂閱了才會接收別人的視頻數(shù)據(jù)。 @param subscribe 是否訂閱 @param userID 用戶的id @param streamType 訂閱的遠(yuǎn)端視頻流類型 @return 操作返回值,成功則返回 0 */ - (int)subscribeRemoteVideo:(BOOL)subscribe forUserID:(uint64_t)userID streamType:(NERtcRemoteVideoStreamType)streamType;@end
    • 示例代碼

    ?

    // 監(jiān)聽到遠(yuǎn)端用戶有視頻流發(fā)布 - (void)onNERtcEngineUserVideoDidStartWithUserID:(uint64_t)userIDvideoProfile:(NERtcVideoProfileType)profile {//如果已經(jīng)訂閱過遠(yuǎn)端視頻流,則不需要再訂閱了...if (_remoteCanvas.subscribedVideo) {return;}//訂閱遠(yuǎn)端視頻流。_remoteCanvas.subscribedVideo = YES;[NERtcEngine.sharedEngine subscribeRemoteVideo:YESforUserID:userIDstreamType:kNERtcRemoteVideoStreamTypeHigh];...} // 監(jiān)聽到遠(yuǎn)端用戶停止視頻流發(fā)布 - (void)onNERtcEngineUserVideoDidStop:(uint64_t)userID {if (userID == _remoteCanvas.uid) {// 收到此回調(diào)后,SDK 內(nèi)部會取消對應(yīng)的視頻流訂閱,無需開發(fā)者主動取消訂閱。..._remoteStatLab.hidden = YES;...} }

    ?

    訂閱成功后,即可顯示遠(yuǎn)端的視頻畫面。

    ?

    音頻流

    在 NERtcSDK 中,本地音頻的采集發(fā)布和遠(yuǎn)端音頻訂閱播放是默認(rèn)啟動的,正常情況下無需開發(fā)者主動干預(yù)。

    ?

    離開頻道

    當(dāng)通話結(jié)束,需要離開頻道,可以調(diào)用以下接口:

    • API 描述

    ?

    @protocol INERtcEngine <NSObject> /**離開頻道@return 操作返回值,成功則返回 0*/ - (int)leaveChannel;@end
    • 示例代碼

    ?

    //UI 掛斷按鈕事件- (IBAction)onHungupAction:(UIButton *)sender {[NERtcEngine.sharedEngine leaveChannel];[self dismiss]; }


    執(zhí)行完 leaveChannel 方法后,SDK 會觸發(fā) 離開頻道回調(diào)通知開發(fā)者:

    ?

    • API 描述

    ?

    @protocol NERtcEngineDelegate <NSObject>/**離開頻道回調(diào)@param result 離開的結(jié)果*/ - (void)onNERtcEngineDidLeaveChannelWithResult:(NERtcError)result;@end

    ?

    • 示例代碼

    ?

    - (void)onNERtcEngineDidLeaveChannelWithResult:(NERtcError)result{// 進(jìn)行業(yè)務(wù)數(shù)據(jù)清理 }

    ?

    銷毀音視頻實例

    釋放當(dāng)前的 NERtcEngine 實例,建議在 App 確定不再需要使用 NERtcEngine 實例時,通過該接口釋放 NERtcEngine 實例的對象資源。

    • API 描述

    ?

    @interface NERtcEngine : NSObject <INERtcEngineEx> /**釋放當(dāng)前的 NERtcEngine 實例建議在 App 確定不再需要使用 NERtcEngine 實例時,通過該接口釋放 NERtcEngine 實例的對象資源;1. 該接口的工作方式為同步調(diào)用方式,必須在子線程中才能調(diào)用,否則會調(diào)用失敗;如:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NERtcEngine destroyEngine];}); 2. 該接口不得在 SDK 的回調(diào)中調(diào)用,在接口返回前也不允許調(diào)用 SDK 的其他任何接口;3. 接口調(diào)用返回之后,如果需要再次使用 SDK,可以重新調(diào)用 sharedEngine 來獲取一個新的 NERtcEngine 實例。*/+ (int)destroyEngine;@end

    ?

    • 示例代碼

    ?

    - (void)dealloc {[NERtcEngine destroyEngine]; //銷毀實例 }

    ?

    示例項目

    為了便于大家學(xué)習(xí)理解,我們將上文內(nèi)容作為開源項目發(fā)布在了 Github 上,各位有興趣可以前往查看示例項目。

    總結(jié)

    以上是生活随笔為你收集整理的云信小课堂|如何实现音视频通话的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。