利用声网进行屏幕共享及关闭共享&&网络状态检测

本文介绍了如何使用Agora RTC SDK实现在本地和远程端进行屏幕共享的功能。详细步骤包括本地端创建房间、获取token、发布屏幕流,以及远程端加入房间、订阅屏幕流并在页面上播放。同时,文章提到了权限处理和网络质量检测,确保屏幕共享的顺畅进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本地端与远程端创建并加入房间后,若需要进行屏幕共享,则可按以下步骤:

1⃣️用获取视频流的参数(channelName,videoRecordId)继续获取token结果一次次来加入同一个房间;

2⃣️用获取到的结果来实现 xxx.join();

3⃣️在本地端重新获取屏幕流;

4⃣️获取成功后发布屏幕流;

5⃣️远程端通过('user-published')方法检测到屏幕流后;

6⃣️通过订阅 xxx.subscribe();

7⃣️在页面绘制区域,播放 xxx.play()。

⚠️有时浏览器或者电脑会有屏幕共享的权限,打开权限即可~

部分代码:

1、本地端发起屏幕共享:

/**
 *屏幕共享
 * **/
let scre={
  screenClient:null,
screenTrack:null
}
async function shareScreen() {
   scre.screenClient = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' });
  const optionsScreen = reactive({});
  await getToken(shareData.videoRecordId, shareData.channelName).then((res) => {
    optionsScreen.appId = res.result.appId;
    optionsScreen.token = res.result.token;
    optionsScreen.uid = Number(res.result.uid);
  });
  await scre.screenClient.join(
    optionsScreen.appId,
    shareData.channelName,
    optionsScreen.token,
    optionsScreen.uid
  );
  await AgoraRTC.createScreenVideoTrack({
    screenSourceType: 'screen',
    // 配置屏幕共享编码参数,详情请查看 API 文档。
    encoderConfig: '1080p_1',
    // 设置视频传输优化策略为清晰优先或流畅优先。
    optimizationMode: 'detail',
  }).then((localScreenTrack)=>{
    scre.screenTrack=localScreenTrack
    scre.screenClient.publish(localScreenTrack)
  })

  scre.screenTrack.getMediaStreamTrack().addEventListener('ended',()=>{
    console.log('======1111')
   scre.screenClient.unpublish(scre.screenTrack)
     scre.screenClient.leave()
    console.log('======222')

})
return screenClient
}

2、远程端接收屏幕共享流(接听):

const agoraAnswer = async function () {
  rtc.client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
  await rtc.client.join(
    agoraData.appId,
    agoraData.channelName,
    agoraData.token,
    agoraData.uid
  );
  rtc.localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
  rtc.localVideoTrack = await AgoraRTC.createCameraVideoTrack({
    facingMode: "user",
  });

  const localPlayerContainer = document.querySelector(".worktable-video-local");
  rtc.localVideoTrack.play(localPlayerContainer);

  await rtc.client.publish([rtc.localAudioTrack, rtc.localVideoTrack]);

  rtc.client.on("user-published", async (user, mediaType) => {
    showOff.value = true;
    await rtc.client.subscribe(user, mediaType);
    console.log(
      "======================================================接听web-published",
      user,
      mediaType
    );

    options.remoteUid = user.uid;

    // 表示本次订阅的是视频。
    if (mediaType === "video") {
      if (!user._audio_added_) {
        Toast("进行屏幕共享");
        user.videoTrack.play(
          document.querySelector(".worktable-screen-remote"),
          {
            fit: "contain",
          }
        );
      } else {
        user.videoTrack.play(document.querySelector(".worktable-video-remote"));
        sendMessage(9);
        //发送表情识别处理消息
        setInterval(() => {
          sendMessage(30);
        }, 5000);
      }
    }

    // 表示本次订阅的是音频。
    if (mediaType === "audio") {
      console.log("agoraAnswer user-published audio");
      user.audioTrack.play();
    }
  });

  rtc.client.on("user-unpublished", (user, mediaType) => {
    console.log(
      "======================================================接听web-unpublished",
      user,
      mediaType
    );

    if (mediaType === "audio") {
      if (!user._audio_added_) {
        onLeave();
        router.push("/Sceneselection");
        Toast("坐席端挂断或离线!");
      }
    } // H5关闭摄像头==video_added--true>>>>>avideo_muted_--false
    if (mediaType === "video") {
      if (user._video_added_ && user._video_muted_) {
        Toast("坐席端关闭摄像头!");
        console.log("========关闭摄像头web端");
      }
    }
  });
  // 上下行网速
  rtc.client.on("network-quality", (stats) => {
    networkQuality.value = stats.downlinkNetworkQuality;
  });
};

核心代码:

 3、本地端停止屏幕共享(获取浏览器原生对象,停止发布流,屏幕流离开):

 4、远程端接收关闭:

 

 5、网络状态检测

 6、网络结果展示

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值