webrtc音视频通话(三)整合websocket

4 篇文章 0 订阅

webrtc音视频通话(三)整合websocket

全球定位:
webrtc音视频通话(一)搭建turn服务器
webrtc音视频通话(二)简单音视频通话
webrtc音视频通话(三)整合websocket


git地址

https://gitee.com/chr_demo/web-rtc.git


这里只写script部分,html和webrtc-util.js在上一篇有

一、引入js

<script src="./js/webrtc-util.js" type="text/javascript"></script>

二、整合websocket

需要注意的是,我这里用的是手机热点,所以wss地址是我本地的IP地址。之所以这样,是因为要两台设备访问,来测试音视频通话是否成功。

特别提醒

1、创建SDP对象之前,必须先打开本地音视频流
2、打开音视频流之前,必须先绑定事件(bindOnIceCandidate、bindOnTrack)
3、创建用于 answer 的 SDP 对象 之前,必须先保存用于 offer 的 SDP 对象

<script>
    let webSocket;
    let url = 'wss://192.168.43.94:8080/webrtc';
    // let url = 'wss://192.168.12.113:8080/webrtc';
    
    $(function () {
      webSocket = new WebSocket(url);
      webSocket.onopen = function () {
        console.log('webSocket连接创建。。。');
      }
      webSocket.onclose = function () {
      }
      webSocket.onmessage = function (event) {
        let data = {
          operation: '',
          msg: ''
        };
        
        data = JSON.parse(event.data);
        // console.log(data);
        switch (data.operation) {
          case "into":
            //加入成功
            if (data.msg == 'offer' ||
                data.msg == 'answer') {
              // 1、创建端点
              createPeerConnection();
              // 2、绑定 收集 candidate 的回调
              bindOnIceCandidate(candidate => sendMsg('send-candidate', candidate));
              // 3、绑定 获得 远程视频流 的回调
              bindOnTrack(stream => {
                console.log('获得远程视频流');
                //显示 远程视频流
                let remoteVideo = document.getElementById("remoteVideo");
                remoteVideo.srcObject = stream;
                remoteVideo.play();
              });
              console.log(data.msg + '进入成功');
              
              // 如果是 answer, 说明 offer 和 answer 都已就绪, 触发开始消息
              if (data.msg == 'answer') {
                sendMsg('start', '')
              }
            } else if (data.msg == 'none') {
              alert('房间已满');
            }
            break;
          case "start":
            // 先打开视频流, 在创建用于 offer 的 SDP 对象
            openLocalMedia(stream => {
              // 显示本地视频流
              let localVideo = document.getElementById("localVideo");
              localVideo.srcObject = stream;
              localVideo.play();
              
              createOffer(sdp => {
                console.log('创建并发送 offer')
                sendMsg('send-offer', sdp);
              });
            });
            
            break;
          case "send-offer":
            //先保存收到的 offer
            saveSdp(data.msg, () => {
              console.log('offer 保存成功');
  
  			  //再打开音视频流
              openLocalMedia(stream => {
                let localVideo = document.getElementById("localVideo");
                localVideo.srcObject = stream;
                localVideo.play();
  
            	//最后创建用于 answer 的 SDP 对象
                createAnswer(sdp => {
                  console.log('创建并发送 answer')
                  sendMsg('send-answer', sdp);
                });
              });
            });
            break;
          case "send-answer":   
            // 保存收到的 answer
            saveSdp(data.msg, () => console.log('answer 保存成功'));
            break;
          case "send-candidate":
            //用于交换 candidate
            saveIceCandidate(data.msg);
            break;
        }
      }
      webSocket.onerror = function (event) {
        console.log(event)
        console.log('webSocket连接异常。。。');
      }
    });
    
    //发送消息
    function sendMsg(operation, msg) {
      let data = {
        operation: operation,
        msg: msg
      };
      webSocket.send(JSON.stringify(data));
    }
    
    //加入房间
    $('#addRoom').click(function () {
      sendMsg('into', '');
    });
  </script>

三、填坑

运行后可能会遇到如下报错:
在这里插入图片描述

这一点是因为这个导致的,只要将下图中框起来的部分,将true改为false即可,不过这会导致没有声音。总的来说,这不是bug。
在这里插入图片描述

最后看下效果。(隔了很久才截的图,页面布局有点不一样哈,不过核心还是一样滴)
在这里插入图片描述

End


全球定位:
webrtc音视频通话(一)搭建turn服务器
webrtc音视频通话(二)简单音视频通话
webrtc音视频通话(三)整合websocket

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
在iOS上使用WebRTC进行音视频通话时,调整编码参数有助于优化网络传输质量和设备性能。WebRTCWeb Real-Time Communication)库提供了丰富的设置选项来控制编解码器的行为。以下是一些关键的编码参数调整: 1. **VideoEncoder**: - `videoEncoderConfiguration`: 可以设置特定的视频编码器配置,例如H264Profile、Bitrate、MaxFramerate等。例如: ```swift let videoEncoderConfig = RTCVideoEncoderConfiguration( codecType: .h264, profile: .high, bitrate: 1000000, // 1 Mbps maxBitrate: 2000000, // 2 Mbps ) ``` 2. **AudioEncoder/Decoder**: - `audioEncoder` 和 `audioDecoder` 可能支持自适应比特率或者设置特定的参数,如码率、采样率等。例如: ```swift let audioEncoderConfig = RTCRtpAudioEncoderConfiguration( payloadType: ..., bitrate: 64000, // 64 kbps ) ``` 3. **VideoCodecConstraints**: 当选择编解码器时,可以提供偏好或限制,比如对分辨率、帧率的约束: ```swift let constraints = RTCVideoConstraints( mandatory: [ .width: 640, .height: 480, .frameRate: 30.0, ], optional: [ .maxWidth: 1280, .maxHeight: 720, ] ) ``` 4. **Network Monitoring**: 通过RTCPeerConnection的`stats`接口监控网络状况,根据丢包率和延迟动态调整码率。 相关问题-- 1. 如何在iOS WebRTC中检测并调整视频编码的丢包率? 2. 如何设置iOS WebRTC以优先使用设备音频的高质量模式? 3. 怎么在iOS上启用或禁用视频编码的自适应比特率功能?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值