WebRTC实现简单音视频通话功能

1 WebRTC音视频通话功能简介

本文介绍如何基于WebRTC快速实现一个简单的实时音视频通话。

在开始之前,您可以先了解一些实时音视频推拉流相关的基础概念:

  • 流:一组按指定编码格式封装的音视频数据内容。一个流可以包含几个轨道,比如视频和音频轨道。

  • 推流:把采集阶段封包好的音视频数据流推送到 ZEGO 实时音视频云的过程。

  • 拉流:从 ZEGO 实时音视频云将已有音视频数据流拉取播放的过程。

  • 房间:是 ZEGO 提供的音视频空间服务,用于组织用户群,同一房间内的用户可以互相收发实时音视频及消息。

  1. 用户需要先登录某个房间,才能进行音视频推流、拉流操作。

  2. 用户只能收到自己所在房间内的相关消息(用户进出、音视频流变化等)。

更多相关概念可参考即构官网关于音视频SDK的介绍 术语说明

2 实现WebRTC视频通话的前提条件

在实现基本的WebRTC实时音视频功能之前,请确保: - 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成。 - 已在 ZEGO 控制台 创建项目,申请有效的 AppID 和 ServerSecret,详情请参考 控制台 - 项目管理 中的“项目信息”。

3 WebRTC音视频通话示例代码

我们提供了一个实现了WebRTC音视频通话基本流程的完整示例 HTML 文件,可作为WebRTC开发过程中的参考。

<!DOCTYPE html>
<html>
​
<head>
    <meta charset="UTF-8">
    <title>Zego Express Video Call</title>
    <!-- 此处需要改成正确的 SDK 版本号 -->
    <script src="ZegoExpressWebRTC-x.x.x.js"></script>
​
    <style type="text/css">
        h1,
        h4 {
            text-align: center;
        }
​
        .video-wrapper {
            width: 610px;
            margin: 0 auto;
        }
​
        .video-wrapper h4 {
            width: 300px;
            display: inline-block;
            position: relative;
        }
        #remote-video, #local-video {
            width: 300px;
            height: 270px;
            display: inline-block;
            position: relative;
        }
​
        .video-wrapper video {
            height: auto;
        }
    </style>
</head>
​
<body>
    <h1>
        Zego RTC Video Call
    </h1>
    <div class="video-wrapper">
        <h4>Local video</h4>
        <h4>Remote video</h4>
        <div id="local-video"></div>
        <div id="remote-video"></div>
    </div>
    <script>
        // 文档中的 js 示例代码可粘贴至此处
        // 项目唯一标识 AppID,Number 类型,请从 ZEGO 控制台获取
        let appID = 0
        // 接入服务器地址 Server,String 类型,请从 ZEGO 控制台获取(获取方式请参考上文“前提条件”)
        let server = ""
​
        // 初始化实例
        const zg = new ZegoExpressEngine(appID, server);
        zg.setDebugVerbose(false)
        // 房间状态更新回调
        // 此处在登录房间成功后,立即进行推流。在实现具体业务时,您可选择其他时机进行推流,只要保证当前房间连接状态是连接成功的即可。
        // 房间状态更新回调
        zg.on('roomStateChanged', async (roomID, reason, errorCode, extendedData) => {
            if (reason == 'LOGINED') {
                console.log("与房间连接成功,只有当房间状态是连接成功时,才能进行推流、拉流等操作。")
            }
        })
​
        zg.on('roomUserUpdate', (roomID, updateType, userList) => {
            // 其他用户进出房间的通知
        });
​
        zg.on('roomStreamUpdate', async (roomID, updateType, streamList, extendedData) => {
            // 房间内其他用户音视频流变化的通知
            if (updateType == 'ADD') {
                // 流新增,开始拉流
                // 此处演示拉取流新增的列表中第一条流的音视频
                const streamID = streamList[0].streamID;
                // streamList 中有对应流的 streamID
                const remoteStream = await zg.startPlayingStream(streamID);
                // 创建媒体流播放组件
                const remoteView = zg.createRemoteStreamView(remoteStream);
                remoteView.play("remote-video", {enableAutoplayDialog:true});
​
            } else if (updateType == 'DELETE') {
                // 流删除,通过流删除列表 streamList 中每个流的 streamID 进行停止拉流。
                const streamID = streamList[0].streamID;
                zg.stopPlayingStream(streamID)
            }
        });
​
        // 登录房间,成功则返回 true
        // userUpdate 设置为 true 才能收到 roomUserUpdate 回调。
        let userID = "user1"; // userID 用户自己设置,必须保证全局唯一
        let userName = "user1";// userName 用户自己设置,没有唯一性要求
        let roomID = "123"; // roomID 用户自己设置,必须保证全局唯一
        // token 由用户自己的服务端生成,为了更快跑通流程,可以通过即构控制台 https://console.zego.im/ 获取临时的音视频 token,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值