当前位置: 首页 > Web前端 > HTML

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

时间:2023-03-27 22:57:21 HTML

保姆级教程!基于SoundNetWebSDK实现音视频通话和屏幕共享,不妨看看这篇文章,保姆级教程,无需从头实现,直接集成即可轻松上手SoundNetSDK。本文也分享了自己在实践中遇到的一些问题,帮助朋友们避坑。如果文章知识点有错误,欢迎指正,让我们一起学习,共同进步~01背景介绍声网提供各种音视频SDK,本文将使用WebSDK。本文主要分享给小伙伴们如何使用SoundNetSDK实现web端音视频通话和屏幕共享功能。也会涵盖实践中遇到的一些问题,记录下来,防止小伙伴们踩坑,同时也希望通过分享从0到1的实战,能够帮助到更多的小伙伴。02前期准备实战前需要具备以下前提条件:?npm&Node.js?前端开发基础,如html&CSS&JavaScript?注册盛网账号,申请盛网APPID,临时Token,详情平台见开始使用声网。如果您没有声网账号,可以在这里免费注册,每个账号每月有10000分钟的免费使用额度。如果是个人学习/调试,时间完全够用。我个人的开发环境,具体信息如下:?MacBookPro?VisualStudioCode:v1.75.1?Npm:v8.19.3?Node.js:v16.19.0?SoundNetSDK:v4.2.1,sdk的下载可以在这里查看。?GoogleChrome:v110.0.5481.17703已通过实战【前期准备】。我们已经完成了相关配置,并且已经有了AppID、Channel、临时Token、SoundNetSDK。在本次实战中,我们主要讲解两个Demo,分别是音视频通话和屏幕共享。3.1实现音视频通话在开始实战之前,首先声明Demo的结构,创建一个名为Agora_VideoCall的文件夹,该文件夹包含五个文件,分别是:?index.html:用于设计web的用户界面application?index.css:用于设计网页样式?basicVideoCall.js:实现音视频通话逻辑代码,主要通过AgoraRTCClient?AgoraRTC_N-4.2.1.js:VoiceNet音视频SDK?assets:第三方库,主要用于设计用户界面,在index.html文件中导入AcousticsSDK。具体可以查看详细代码。接下来主要详细讲解音视频通话和屏幕共享的实现逻辑。3.1.1实现音视频调用逻辑客户端对象,即创建客户端对象varclient=AgoraRTC.createClient({模式:“rtc”,编解码器:“vp8”});2)定义变量AppID、Token、Channel、UserID,并使用箭头函数用于页面调用时加入音视频通话频道。varoptions={appid:null,channel:null,uid:null,token:null};$(()=>{varurlParams=newURL(location.href).searchParams;options.appid=urlParams.get("appid");options.channel=urlParams.get("channel");options.token=urlParams.get("token");options.uid=urlParams.get("uid");if(options.appid&&options.channel){$("#uid").val(options.uid);$("#appid").val(options.appid);$("#token").val(options.token);$("#channel").val(options.channel);$("#join-form").submit();}})3)添加通道定义join函数主要是将本地音视频轨道添加到一个RTC频道,此时需要在函数中传入AppID、Token、Channel、UserID。加入房间后,需要发布音视频轨道,所以也需要创建音视频轨道,并调用publish方法将本地的这些音视频轨道对象作为参数发布到频道中。注意,创建音视频轨道时,需要先调用createMicrophoneAudioTrack:从麦克风采集的音频创建本地音轨对象;然后调用createCameraVideoTrack:从摄像头捕获的视频创建本地视频轨道对象。(如果先调用createCameraVideoTrack,页面上不会显示本地视频预览画面。)创建后调用play方法显示本地预览,调用publish方法发布到RTC频道。请注意,play和publish方法没有使用顺序,谁先到并不重要。asyncfunctionjoin(){[options.uid,localTracks.audioTrack,localTracks.videoTrack]=awaitPromise.all([//加入频道client.join(options.appid,options.channel,options.token||null,options.uid||null),//创建本地音视频轨//AgoraRTC.createCameraVideoTrack(),AgoraRTC.createMicrophoneAudioTrack(),AgoraRTC.createCameraVideoTrack()]);localTracks.videoTrack.play("本地播放器");$("#local-player-name").text(`localVideo(${options.uid})`);awaitclient.publish(Object.values(localTracks));console.log("publishsuccess");}4)频道中添加或移除远程用户逻辑将同一频道的远程用户添加到本地界面,远程用户取消发布时从本地移除用户.functionhandleUserPublished(user,mediaType){constid=user.uid;remoteUsers[id]=用户;subscribe(user,mediaType);}functionhandleUserUnpublished(user,mediaType){if(mediaType==='video'){constid=user.uid;删除远程用户[id];$(`#player-wrapper-${id}`).remove();}}5)订阅远程音视频逻辑远程用户发布音视频时,本地用户需要订阅才能实现音视频调用。在subscribe函数中,需要传入两个参数,分别是远端用户在同一频道的userid和远端mediaType,调用play方法播放远端用户的音视频。从而实现一对一的麦子连接。asyncfunctionsubscribe(user,mediaType){constuid=user.uid;//订阅远程用户awaitclient.subscribe(user,mediaType);console.log("订阅成功");if(mediaType==='video'){constplayer=$(`remoteUser(${uid})

`);$("#remote-playerlist").append(player);user.videoTrack.play(`player-${uid}`);}if(mediaType==='audio'){user.audioTrack.play();}}6)监听事件当远程用户发布或取消发布音视频轨道时,本地需要监听,在join函数中监听client.on("user-published",handleUserPublished)事件和client.on("user-published",handleUserPublished)事件。on("user-unpublished",handleUserUnpublished)事件,如下client.on("user-published",handleUserPublished);client.on("用户未发布",handleUserUnpublished);7)离开频道当用户点击离开按钮时,本地和远程的音视频轨道将停止。asyncfunctionleave(){for(trackNameinlocalTracks){vartrack=localTracks[trackName];如果(跟踪){track.stop();跟踪.close();localTracks[trackName]=undefined;}}3.1.2Demo展示接下来我们可以运行我们的demo,输入APPID,Token,Channel,Userid,点击加入,就可以看到你的本地画面了,如果你想和其他人连接,可以再次复制url,输入同样的APPID、Token、Channel,就可以实现连麦,赶快试试吧。3.2屏幕共享连麦屏幕共享是将本地用户的屏幕内容以视频屏幕的形式分享给其他远程用户观看。它的工作原理其实就是通过createScreenVideoTrack创建一个屏幕共享视频轨道对象。在截屏过程中,浏览器会询问需要共享哪些屏幕,并根据终端用户的选择获取屏幕信息。基于以上音视频demo实现屏幕共享功能。3.2.1添加屏幕共享UI在index.html页面添加屏幕共享(ScreenShare)按钮3.2.2屏幕共享实现逻辑以下代码全部写在basicVideoCall.js的正文中1)共享功能类似上面的join函数,主要是用来开启屏幕共享,使用createScreenVideoTrack创建一个视频轨道对象进行屏幕共享,同时对视频编码进行一些简单的配置。该函数还需要添加侦听器事件。asyncfunctionshare(){client.on("用户发布",handleUserPublished);client.on("用户未发布",handleUserUnpublished);让屏幕跟踪;[options.uid,localTracks.audioTrack,screenTrack]=等待承诺。all([client.join(options.appid,options.channel,options.token||null,options.uid||null),AgoraRTC.createMicrophoneAudioTrack(),AgoraRTC.createScreenVideoTrack({encoderConfig:{framerate:15,height:720,宽度:1280}},"自动")]);2)添加屏幕共享的音视频轨道,调用play方法播放本地屏幕共享视频。if(screenTrackinstanceofArray){localTracks.screenVideoTrack=screenTrack[0]localTracks.screenAudioTrack=screenTrack[1]}else{localTracks.screenVideoTrack=screenTrack}localTracks.screenVideoTrack.play("local-player");$("#local-player-name").text(`localVideo(${options.uid})`);3)发布屏幕共享将本地音频和屏幕共享图像发布到RTC频道。if(localTracks.screenAudioTrack==null){awaitclient.publish([localTracks.screenVideoTrack,localTracks.audioTrack]);}else{awaitclient.publish([localTracks.screenVideoTrack,localTracks.audioTrack,localTracks.screenAudioTrack]);}4)分享功能的实现逻辑中,需要绑定“track-ended”事件。当屏幕共享停止时,警报将通知最终用户。localTracks.screenVideoTrack.on("track-ended",()=>{alert(`屏幕共享轨道结束,停止共享屏幕`+localTracks.screenVideoTrack.getTrackId());localTracks.screenVideoTrack&&localTracks.screenVideoTrack.close();localTracks.screenAudioTrack&&localTracks.screenAudioTrack.close();localTracks.audioTrack&&localTracks.audioTrack.close();});3.2.3演示展示点击分享时,会提示用户选择要分享的页面,同时还有一个默认的音频选项,点击分享后,就可以发布分享的屏幕了。04小结如果你想实现音视频屏幕共享的Web应用,绝对可以借鉴本文+声网SDK。如果不是很熟悉,可以先看声网给的《快速入门——实现音视频通话》。实践中需要注意的是,创建音视频轨道时,需要先调用createMicrophoneAudioTrack,再调用createCameraVideoTrack。如果先调用createCameraVideoTrack,页面将不会显示本地视频预览画面。一般来说,本文给出的demo比较简单。如果还想增加虚化背景、AI降噪等其他功能,可以在此基础上继续增加功能。(文完)参考资料?注册声网账号?相关SDK下载?快速入门-实现音视频通话