【WebRtc】Web网页音视频通话之Webrtc相关操作(一)

目录

  • 打开摄像头/关闭摄像头
  • 静音/解除静音
  • 打开视频/关闭视频
  • 截图且下载

打开摄像头/关闭摄像头

效果图

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打开摄像头</title>
    <link rel="stylesheet" href="../../../static/layui/css/layui.css">
</head>
<body>
<div id="container">
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <video id="video-local" autoplay playsinline width="400px" height="400px"></video>
        </div>
    </div>
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <button type="button" class="layui-btn layui-btn-normal" onclick="openCamera()">打开摄像头</button>
            <button type="button" class="layui-btn layui-btn-danger" onclick="stopVideo()">关闭摄像头</button>
        </div>
    </div>
    <blockquote class="layui-elem-quote layui-text" style="margin-top: 15px;">
        <p>显示摄像头预览的内容,网页上由元素video来呈现。</p>
        <p>点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
    </blockquote>
</div>
</body>
</html>

javaScript

   let videoElem = document.querySelector('video');

    /**
     * MediaDevices.getUserMedia()方法在用户允许后,按照请求,拿到stream。 stream可以包含视频或音频。前面的设定里,我们只使用视频。
     * 如果用户拒绝了使用摄像头申请,或者申请的媒体不可用,即表现为被拒绝。 用户拒绝会报NotAllowedError,找不到符合要求的设备会报NotFoundError DOMException。
     * @param e
     * @returns {Promise<void>}
     */
    function openCamera() {
        if (window.stream != null) {
            alert('摄像头已打开,请勿重新打开摄像头');
            return false;
        }
        const constraints = {
            audio: true,
            video: true
        };
        navigator.mediaDevices.getUserMedia(constraints).then(gotStream).catch(error => {
            console.error(error)
        });
    }

    /**
     * 成功获取到流
     * @param stream
     */
    function gotStream(stream) {
        window.stream = stream;
        videoEle.srcObject = stream;
    }

    /**
     *  关闭摄像头
     *  获取到video中的流,并将流中的轨道关闭
     */
    function stopVideo() {
        // 获取video中的流
        const stream = videoElem.srcObject;
        // 判断stream 是否为空
        if (stream == null) {
            return;
        }
        // 获取流中的所有轨道
        const tracks = stream.getTracks();
        tracks.forEach(function (track) {
            track.stop();
        });
        videoElem.srcObject = null;
        window.stream = null;
    }

静音/解除静音

效果图


静音开启.png
解除静音.png

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>静音-解除静音</title>
    <link rel="stylesheet" href="../../../static/layui/css/layui.css">
</head>
<body>
<div id="container">
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <video id="video-local" autoplay playsinline width="400px" height="400px"></video>
        </div>
    </div>
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <button type="button" class="layui-btn layui-btn-normal" onclick="openCamera()">打开摄像头</button>
            <button id="mute" type="button" class="layui-btn layui-btn-normal" onclick="muted()">静音</button>
            <button id="unmute" type="button" class="layui-btn layui-btn-normal" onclick="unmuted()">解除静音</button>
        </div>
    </div>
    <blockquote class="layui-elem-quote layui-text" style="margin-top: 15px;">
        <p>1.显示摄像头预览的内容,网页上由元素video来呈现。</p>
        <p>2.点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
        <p>3.打开摄像头获取到浏览器摄像头数据后,可以对获取到的流数据进行静音以及解除静音相关操作</p>
    </blockquote>
</div>
</body>
</html>

javaScript

    const constraints = {
        audio: true,
        video: true
    };

    let localStream = null;
    let videoEle = document.querySelector('video');
    /**
     * MediaDevices.getUserMedia()方法在用户允许后,按照请求,拿到stream。 stream可以包含视频或音频。前面的设定里,我们只使用视频。
     * 如果用户拒绝了使用摄像头申请,或者申请的媒体不可用,即表现为被拒绝。 用户拒绝会报NotAllowedError,找不到符合要求的设备会报NotFoundError DOMException。
     * @param e
     * @returns {Promise<void>}
     */
     function openCamera() {
        if(localStream!=null){
            alert('摄像头已打开,请勿重新打开摄像头');
            return false;
        }
         navigator.mediaDevices.getUserMedia(constraints).then(stream=>{
            localStream = stream;
            videoEle.srcObject = stream;
        }).catch(error=>{
            alert('打开摄像头失败');
            console.error('打开摄像头失败',error)
        });
    }

    function muted() {
        if(localStream==null){
            alert('请打开音视频');
            return false;
        }
        const tracks = localStream.getTracks();
        tracks.forEach(track => {
            if(track.kind === 'audio'){
                track.enabled = false
            }
            console.log(track)
        });
        alert('静音开启,u can`t speak ')
    }

    function unmuted() {
        if(localStream==null){
            alert('请打开音视频');
            return false;
        }
        const tracks = localStream.getTracks();
        tracks.forEach(track => {
            if(track.kind === 'audio'){
                track.enabled = true
            }
            console.log(track)
        });
        alert('解除静音,u can speak ')
    }
}

打开视频/关闭视频

效果图

打开视频.png

关闭视频.png

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打开视频/关闭视频</title>
    <link rel="stylesheet" href="../../../static/layui/css/layui.css">
</head>
<body>
<div id="container">
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <video id="video-local" autoplay playsinline width="400px" height="400px"></video>
        </div>
    </div>
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <button type="button" class="layui-btn layui-btn-normal" onclick="openCamera()">打开摄像头</button>
            <button id="openVideo"  type="button" class="layui-btn layui-btn-normal" onclick="openVideo()">打开视频</button>
            <button id="closeVideo"  type="button" class="layui-btn layui-btn-normal" onclick="closeVideo()">关闭视频</button>
        </div>
    </div>
    <blockquote class="layui-elem-quote layui-text" style="margin-top: 15px;">
        <p>1.显示摄像头预览的内容,网页上由元素video来呈现。</p>
        <p>2.点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
        <p>3.打开摄像头获取到浏览器摄像头数据后,可以对获取到的流数据进行打开视频/关闭视频相关操作</p>
    </blockquote>
</div>

</body>
</html>

javaScript

 const constraints = {
        audio: true,
        video: true
    };

    let localStream = null;
    let videoEle = document.querySelector('video');
    /**
     * MediaDevices.getUserMedia()方法在用户允许后,按照请求,拿到stream。 stream可以包含视频或音频。前面的设定里,我们只使用视频。
     * 如果用户拒绝了使用摄像头申请,或者申请的媒体不可用,即表现为被拒绝。 用户拒绝会报NotAllowedError,找不到符合要求的设备会报NotFoundError DOMException。
     * @param e
     * @returns {Promise<void>}
     */
     function openCamera() {
        if(localStream!=null){
            alert('摄像头已打开,请勿重新打开摄像头');
            return false;
        }
         navigator.mediaDevices.getUserMedia(constraints).then(stream=>{
            localStream = stream;
            videoEle.srcObject = stream;
        }).catch(error=>{
            alert('打开摄像头失败');
            console.error('打开摄像头失败',error)
        });
    }

    function openVideo() {
        if(localStream==null){
            alert('请打开音视频');
            return false;
        }
        const tracks = localStream.getTracks();
        tracks.forEach(track => {
            if(track.kind === 'video'){
                track.enabled = true
            }
            console.log(track)
        });
        alert('打开视频,u can see u ')
    }

    function closeVideo() {
        if(localStream==null){
            alert('请打开音视频');
            return false;
        }
        const tracks = localStream.getTracks();
        tracks.forEach(track => {
            if(track.kind === 'video'){
                track.enabled = false
            }
            console.log(track)
        });
        alert('关闭视频,u can`t see u ')
    }

视频截图

效果图

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>截屏</title>
    <link rel="stylesheet" href="../../../static/layui/css/layui.css">

</head>
<body>
<div id="container">
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <video id="video-local" autoplay playsinline width="400px" height="400px"></video>
        </div>
    </div>
    <div class="layui-row">
        <div class="layui-col-xs6 layui-col-md12" style="text-align: center">
            <button type="button" class="layui-btn layui-btn-normal" onclick="openCamera()">打开摄像头</button>
            <button type="button" class="layui-btn layui-btn-normal" onclick="getCapure()">截图</button>
        </div>
    </div>
    <canvas id="mainCanvas"></canvas>
    <div id="list" style="display: grid; grid-template-columns: repeat(auto-fill, 100px);
    column-gap: 20px; row-gap: 20px;"></div>
    <blockquote class="layui-elem-quote layui-text" style="margin-top: 15px;">
        <p>1.获取摄像头数据,点击截图,展示截图数据</p>
    </blockquote>
</div>
</body>
</html>

javaScript

 const video = document.querySelector('video');
    const constraints = {
        audio: false,
        video: true
    };

    const list = document.querySelector('#list'); // 拿来存放多个元素

    function openCamera() {
        navigator.mediaDevices.getUserMedia(constraints).then(gotStream).catch(onError);
    }

    /**
     * 成功获取流数据
     * @param stream
     */
    function gotStream(stream) {
        window.stream = stream;
        video.srcObject = stream;
    }
    /**
     * 获取流发生错误
     * @param stream
     */
    function onError(error) {
        console.log('navigator.MediaDevices.getUserMedia error: ', error.message, error.name);
    }

    /**
     * 捕获
     */
    function getCapure(){
        const mCanvas = window.canvas = document.querySelector('#mainCanvas');
        mCanvas.width = 480;
        mCanvas.height = 360;

        // 开始截取
        mCanvas.width = video.videoWidth;
        mCanvas.height = video.videoHeight;
        mCanvas.getContext('2d').drawImage(video, 0, 0, mCanvas.width, mCanvas.height);
        // 新增1张
        var divItem = document.createElement("div");
        divItem.style.display = "block";
        divItem.width = 100;
        divItem.height = divItem.width * video.videoHeight / video.videoWidth; // 计算一下比例
        divItem.style.width = divItem.width + "px";
        divItem.style.height = divItem.height + "px";
        var c1 = document.createElement("canvas");
        c1.width = divItem.width;
        c1.height = divItem.height;
        c1.getContext('2d').drawImage(video, 0, 0, mCanvas.width, mCanvas.height, 0, 0, c1.width, c1.height);
        divItem.appendChild(c1);
        list.appendChild(divItem);
    }

    /**
     * 清除记录
     */
    function clear(){
        var child = list.lastElementChild;
        while (child) {
            list.removeChild(child);
            child = list.lastElementChild;
        }
    }

写在最后学习参考视频讲解比较详细:https://space.bilibili.com/394612055/video?tid=0&page=2&keyword=&order=pubdate
image.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于SIP(会话发起协议)和WebRTCWeb实时通信)的音视频通话是一种先进的通信技术。 SIP是一种信令协议,用于建立、修改和终止多媒体通讯会话。它提供了一种灵活的方式,可以实现语音、视频、即时消息等多种通信媒体的传输。SIP基于IP网络,可以在各种网络环境下使用。 WebRTC是一种开放的实时通信技术,可以在网页浏览器中直接使用,无需安装插件或其他软件。它提供了实时音频和视频通信的能力,并支持数据传输和文件共享。WebRTC通过使用JavaScript API和RTCPeerConnection建立点对点连接,实现了浏览器之间的直接通信。 基于SIP和WebRTC音视频通话结合了SIP的信令和WebRTC音视频传输能力。当两个或多个终端需要进行音视频通话时,首先使用SIP建立会话连接,并交换IP地址和端口信息。然后,使用WebRTC建立点对点的音视频传输通道,进行音频和视频数据的传输和实时编解码。 基于SIP和WebRTC音视频通话具有很多优点。首先,它可以在各种终端设备上使用,包括计算机、手机和平板电脑。其次,它可以在不同的网络环境下使用,包括有线网络和无线网络。此外,它提供了高质量的音视频传输,具有低延迟和稳定性。 总的来说,基于SIP和WebRTC音视频通话是一种先进的通信技术,能够实现高质量、实时的音视频通信。它在各种应用场景中都有广泛的应用,包括在线教育、视频会议、远程医疗等。 ### 回答2: 基于SIP(会话初始协议)和WebRTC(网络实时通信)的音视频通话是一种基于互联网的实时通信技术,可以在不同设备和平台之间进行高质量的音频和视频通话。 SIP是一种通信协议,用于建立、修改、终止多媒体会话,如音视频通话。它可以在IP网络上传输标准化的语音、视频和其他媒体数据。SIP使用URI(统一资源标识符)作为用户标识,并通过SIP服务器进行信令交换和媒体协商。 WebRTC是一组技术,允许网页和移动应用在不需要任何插件或额外软件的情况下,通过浏览器直接进行音视频通信。WebRTC使用了一些开放标准,如实时传输协议(RTP)和实时传输控制协议(RTCP)来传输媒体数据。 基于SIP和WebRTC音视频通话有以下优点: 1. 跨平台支持:由于WebRTC是基于Web技术,可以在多种设备和平台上运行,包括PC、Mac、移动设备等。 2. 实时性强:音视频通话可以实时进行,避免了延迟和高延迟对通信的影响。 3. 便捷性:使用SIP和WebRTC进行音视频通话不需要额外的软件和插件,用户只需要拥有一个支持WebRTC的浏览器。 4. 高质量:由于SIP和WebRTC使用了先进的编解码算法和传输协议,音视频通话可以达到高质量的传输效果。 5. 安全性:SIP和WebRTC提供了一些安全机制,如加密传输和身份验证,保护音视频通话的隐私和安全性。 综上所述,基于SIP和WebRTC音视频通话是一种灵活、跨平台、实时性强、高质量和安全的通信方式,为用户提供了更便捷和高效的交流体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值