国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Web網(wǎng)頁音視頻通話之基于Sipjs

這篇具有很好參考價(jià)值的文章主要介紹了Web網(wǎng)頁音視頻通話之基于Sipjs。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

簡(jiǎn)述
本文是以FreeSwitch作為信令服務(wù)器,通過sipjs(基于webRtc) 進(jìn)行媒體協(xié)商,網(wǎng)絡(luò)協(xié)商后,進(jìn)行P2P媒體傳輸。

參考知識(shí):

  • sip.js https://sipjs.com/
  • webRtc開發(fā)手冊(cè) https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API

效果圖

Web網(wǎng)頁音視頻通話之基于Sipjs

HTML

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <title>視頻通話demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="shortcut icon" th:href="@{/ico/logo.ico}" type="image/x-icon" />
    <link rel="stylesheet" th:href="@{/layui/css/layui.css}">
    <link rel="stylesheet" th:href="@{/css/baiban.css}">
    <script th:inline="javascript">
        const pub = [[${pub}]];
    </script>
</head>
<body>
<div id="app">
    <!--頭部導(dǎo)航-->
    <ul class="layui-nav layui-bg-blue" lay-bar="disabled">
        <li class="layui-nav-item"><a target="_blank">視頻通話</a></li>
    </ul>
    <!--音視頻通話-->
    <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
        <legend>音視頻通話</legend>
    </fieldset>
    <div class="layui-row" style="border: 1px solid  #f0f0f0;margin-left: 10px;margin-right: 10px;padding-top: 10px">
        <div class="layui-col-xs12 layui-col-md4" >
            <form class="layui-form">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <label class="layui-form-label">我的號(hào)碼:</label>
                        <div class="layui-input-inline">
                            <input id="myNumber" value="1000" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                </div>

                <div class="layui-form-item">
                    <div class="layui-inline">
                        <label class="layui-form-label">信令地址:</label>
                        <div class="layui-input-inline">
                            <input id="sipAddr" th:value="${fs}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">Websocket端口:</label>
                    <div class="layui-input-block">
                        <input type="radio" name="wsUrl" value="5066" title="http" checked>
                        <input type="radio" name="wsUrl" value="7443" title="https">
                    </div>
                </div>
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <label class="layui-form-label">撥打號(hào)碼</label>
                        <div class="layui-input-inline">
                            <input id="sip_phone_number" value="1001" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                </div>
                <div class="layui-form-item" style="text-align: center">
                    <div class="layui-inline">
                        <button type="button" class="layui-btn layui-btn-primary" onclick="softPhone.start()"
                                id="register">注冊(cè)
                        </button>
                        <button type="button" class="layui-btn layui-btn-normal operate layui-btn-disabled" disabled
                                onclick="PHONE.call()" id="call">撥打
                        </button>
                        <button type="button" class="layui-btn layui-btn-normal operate layui-btn-disabled" disabled
                                onclick="PHONE.hangUp()" id="hangup">掛斷
                        </button>   
                </div>
            </form>
        </div>
        <!--視頻展示區(qū)-->
        <div class="layui-col-xs12 layui-col-md4" style="border:5px solid #3385FF;width: 615px;height: 600px">
            <div id="playVideo">
                <video id="youVideo" style="padding-right:10px" width="600px" height="600px" muted autoplay
                       onmousedown="move(this)" th:poster="@{/img/webrtc.png}"
                       playsinline></video>
            </div>
            <div style="position:relative;top:-168px;left:1px">
                <video id="meVideo" width="100px" height="100px" th:poster="@{/img/webrtc.png}" autoplay playsinline></video>
            </div>
        </div>
    </div>
</div>
<canvas id="capture" style="display: none"></canvas>
<script th:src="@{/javascript/jquery-2.1.4.js}" type="application/javascript"></script>
<script th:src="@{/javascript/sip-0.15.10.js}" type="application/javascript"></script>
<script th:src="@{/layui/layui.js}" type="application/javascript"></script>
<!--操作-->
<script th:src="@{/javascript/sip-pc/operation.js}" type="application/javascript"></script>

javaScript

  let table = null;
    let form = null;
    let layer = null;
    let laydate = null;
    let upload = null;
    // 撥打電話確認(rèn)框
    let confirmIndex = null;
    layui.use(['table', 'form', 'layer', 'laydate', 'upload'], function () {
        $(function () {
            table = layui.table;
            form = layui.form;
            layer = layui.layer;
            upload = layui.upload;
            if (window.location.protocol === 'http:') {
                $('input[name="wsUrl"][value="5066"]').attr("checked", true);
            } else {
                $('input[name="wsUrl"][value="7443"]').attr("checked", true);
            }
        });
    });

    // 本地視頻
    var localVideo = document.getElementById('meVideo');
    // 遠(yuǎn)端視頻
    var remoteVideo = document.getElementById('youVideo');

    var softPhoneUA = null;
    var currentSession = null;

    /**
     * 注冊(cè)模塊
     * @type {{logout(): void, start(): void, unregister(): void, UAEvent(*): void, register(): void, sessionEvent(*): void}}
     */
    const softPhone = {
        /**
         * 登陸軟電話
         */
        start() {
            // 獲取我的號(hào)碼
            var myNumber = $.trim($('#myNumber').val());
            // 獲取sip地址
            var sipAddr = $.trim($('#sipAddr').val());
            // sip url 拼接
            var sip_uri = myNumber + '@' + sipAddr
            // 信令密碼
            var sip_password = $.trim($('#sipPassword').val());
            // 獲取WS連接端口
            var wsPort = $.trim($('input[name="wsUrl"]:checked').val());
            // var wsPort = "5060";
            var ws_uri = wsPort == '5066' ? 'ws://' + sipAddr + ':' + wsPort : 'wss://' + sipAddr + ':' + wsPort

            var config = {
                uri: sip_uri,
                transportOptions: {
                    wsServers: [ws_uri]
                },
                // 授權(quán)號(hào)
                authorizationUser: myNumber,
                // 登陸密碼
                password: '1234',
                displayName: myNumber,
                register: true
            };
            //v 就緒軟電話、監(jiān)聽軟電話連接狀態(tài)、監(jiān)聽電話呼入、撥打電話、登出軟電話系統(tǒng)
            softPhoneUA = new SIP.UA(config);
            softPhone.UAEvent(softPhoneUA);
            // 有電話呼入
            softPhoneUA.on('invite', function (session) {
                currentSession = session;
                softPhone.sessionEvent(session);
                layer.confirm('有電話呼入 ... 請(qǐng)注意是否接聽)', {
                    btn: ['取消', '接聽', '拒絕'],
                    btn1: function () {
                        layer.close(index);
                    },
                    btn2: function () {
                        PHONE.answer();
                    },
                    btn3: function () {
                        softPhone.hangUp();
                    }
                });
            })
        },

        /** 就緒 */
        register() {
            softPhoneUA.register({  // 注冊(cè)
                register: true
            });
        },

        /**
         * 綁定ua事件
         * @param {*} ua
         */
        UAEvent(ua) {
            // 開始嘗試連接
            ua.on('connecting', function (args) {
                console.log('%c connecting - 開始嘗試連接', 'color: #f00');
            });
            // 連接完畢
            ua.on('connected', function () {
                console.log('%c connected - 連接完畢', 'color: #f00');
            });
            // 主動(dòng)取消注冊(cè)或注冊(cè)后定期重新注冊(cè)失敗
            ua.on('unregistered', function (response, cause) {
                $('#register').removeClass("layui-btn-disabled").removeAttr('disabled');
                console.log('%c unregistered - 主動(dòng)取消注冊(cè)或注冊(cè)后定期重新注冊(cè)失敗', 'color: #f00');
            });
            // 注冊(cè)成功
            ua.on('registered', function () {
                layer.msg("注冊(cè)成功", {icon: 1, time: 1500});
                console.log('%c registered -- 注冊(cè)成功', 'color: #f00');
                btnHide(['register','shard'])
                btnShow(['call'])
            })
            // websocket 連接失敗
            ua.on('disconnected', function () {
                console.log('%c disconnected - 連接失敗', 'color: #f00');
            })
        },

        /**
         * 綁定session事件
         * @param {} session
         */
        sessionEvent(session) {
            session.on("rejected", function (response, cause) {
                layer.close(confirmIndex);
            });
            session.on("bye", function (response, cause) {
                // 不可用
                btnHide(['hangup','mute','unmute','openVideo','closeVideo','shard'])
                localVideo.srcObject = null;
                remoteVideo.srcObject = null;
            });
            // 會(huì)話被接入
            session.on("accepted", function (response, cause) {
                layer.close(confirmIndex);
                btnShow(['hangup','mute','unmute','openVideo','closeVideo','shard','capturePic'])
                var pc = session.sessionDescriptionHandler.peerConnection;
                var remoteStream = new MediaStream();
                pc.getReceivers().forEach(function (receiver) {
                    remoteStream.addTrack(receiver.track);
                });
                remoteVideo.srcObject = remoteStream;
                if (pc.getSenders()) {
                    var localStream = new MediaStream();
                    pc.getSenders().forEach(function (sender) {
                        localStream.addTrack(sender.track);
                    });
                    localVideo.srcObject = localStream;
                }
            });
            session.on("cancel", function (response, cause) {
                layer.close(confirmIndex);
            });
        }
    }

operation.js

/**
 *  撥打、接聽、掛斷 模塊
 * @type {{call(): void, answer(): void, hangUp(): void}}
 */
const PHONE = {
    /**
     * 撥打
     */
    call() {
        const telNumber = $.trim($('#sip_phone_number').val());
        var sipAddr = $.trim($('#sipAddr').val());
        const inviteUrl = telNumber + '@' + sipAddr
        currentSession = softPhoneUA.invite(inviteUrl, {
            sessionDescriptionHandlerOptions: {
                constraints: {
                    audio: {
                        autoGainControl: true,
                        // 噪音消除
                        noiseSuppression: true,
                        // 設(shè)置降噪
                        echoCancellation: true
                    },
                    video: true
                },
                alwaysAcquireMediaFirst: true // 此參數(shù)是sip.js官方修復(fù)在firefox遇到的bug所設(shè)置
        })
        confirmIndex = layer.confirm('呼叫中....', {
            btn: ['取消'],
            btn1: function (index) {
                currentSession.cancel();
                layer.close(index);
            }
        });
        // 撥打后 監(jiān)聽
        currentSession.on("rejected", function (response, cause) {
            layer.msg("請(qǐng)求通話被拒絕", {icon: 1, time: 1500});
            console.log(response)
            console.log(cause)
        });
        // 本次通話結(jié)束
        currentSession.on("bye", function (response, cause) {
            layer.msg("本次通話結(jié)束", {icon: 1, time: 1500});
            localVideo.srcObject = null;
            remoteVideo.srcObject = null;
        });
        // 對(duì)方接聽
        currentSession.on("accepted", function (response, cause) {
            layer.msg("對(duì)方接聽", {icon: 1, time: 1500});
            $('#call').addClass('layui-btn-disabled').attr('disabled', 'disabled');
            $('#hangup').removeClass('layui-btn-disabled').removeAttr('disabled');
            $('#mute').removeClass('layui-btn-disabled').removeAttr('disabled');
            $('#unmute').removeClass('layui-btn-disabled').removeAttr('disabled');
            var pc = currentSession.sessionDescriptionHandler.peerConnection;
            var remoteStream = new MediaStream();
            pc.getReceivers().forEach(function (receiver) {
                remoteStream.addTrack(receiver.track);
            });
            remoteVideo.srcObject = remoteStream;
            if (pc.getSenders()) {
                var localStream = new MediaStream();
                pc.getSenders().forEach(function (sender) {
                    localStream.addTrack(sender.track);
                });
                localVideo.srcObject = localStream;
            }
        });
        // 取消通話
        currentSession.on("cancel", function (response, cause) {
            layer.msg("取消通話", {icon: 1, time: 1500});
        });
    },
    /**
     * 掛斷
     */
    hangUp() {
        if (currentSession instanceof Object) {
            if (currentSession.hasAnswer) {
                currentSession.bye();
            } else if (currentSession.isCanceled === false) {
                currentSession.cancel();
            } else {
                currentSession.reject();
            }
        }
    },
    /**
     * 接聽
     */
    answer() {
        var option = {
            sessionDescriptionHandlerOptions: {
                constraints: {
                    audio: {
                        autoGainControl: true,
                        // 噪音消除
                        noiseSuppression: true,
                        // 設(shè)置降噪
                        echoCancellation: true
                    },
                    video: true
                },
                alwaysAcquireMediaFirst: true, // 此參數(shù)是sip.js官方修復(fù)在firefox遇到的bug所設(shè)置
                rtcConfiguration: {
                    iceServers: [
                        {
                            url: "stun:124.222.83.153:3478",
                            username: "test",//可選
                            credential: "test123"//可選
                        },
                        {
                            url: "turn:124.222.83.153:3478",
                            "username": "test",//可選
                            "credential": "test123"//可選
                        }
                    ]
                }
            }
        }
        currentSession.accept(option)
    }
}
撥打

Web網(wǎng)頁音視頻通話之基于Sipjs

接聽

Web網(wǎng)頁音視頻通話之基于Sipjs

通話中

Web網(wǎng)頁音視頻通話之基于Sipjs

數(shù)據(jù)流程圖

Web網(wǎng)頁音視頻通話之基于Sipjs文章來源地址http://www.zghlxwxcb.cn/news/detail-416718.html

到了這里,關(guān)于Web網(wǎng)頁音視頻通話之基于Sipjs的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于webrtc的音視頻通話,實(shí)現(xiàn)相機(jī)流識(shí)別人臉的功能

    這幾天研究了一下webRTC的基礎(chǔ)能力,在此基礎(chǔ)之上能實(shí)現(xiàn)的視頻通話,互動(dòng)等更多實(shí)用功能。項(xiàng)目中使用的是阿里的rtc,我研究的是聲網(wǎng)的是否符合功能,后續(xù)會(huì)總結(jié)和記錄一下應(yīng)用到的幾個(gè)功能實(shí)現(xiàn)方法。 今天要記錄的功能是項(xiàng)目流識(shí)別人臉的功能,其實(shí)類似功能很常見了

    2024年04月28日
    瀏覽(27)
  • 基于javaweb的考研自習(xí)室的音視頻通話功能設(shè)計(jì)(附完整版代碼)

    考研自習(xí)室的音視頻通話功能設(shè)計(jì) 陸健康負(fù)責(zé)云服務(wù)申請(qǐng)和部署,后端 Java servlet 制作,音視頻通話的邏輯設(shè)計(jì),數(shù)據(jù)庫(kù)連接等設(shè)計(jì)。 占鐘鳴負(fù)責(zé)安卓前端 UI 制作,前后端數(shù)據(jù)傳輸方式設(shè)計(jì),接收數(shù)據(jù)后的觸發(fā)響應(yīng)設(shè)計(jì),以及圖片字體和整體顏色的選用。 李森負(fù)責(zé)數(shù)據(jù)庫(kù)設(shè)

    2023年04月09日
    瀏覽(26)
  • Unity Metaverse(八)、RTC Engine 基于Agora聲網(wǎng)SDK實(shí)現(xiàn)音視頻通話

    Unity Metaverse(八)、RTC Engine 基于Agora聲網(wǎng)SDK實(shí)現(xiàn)音視頻通話

    本文介紹如何在Unity中接入聲網(wǎng)SDK,它可以應(yīng)用的場(chǎng)景有許多,例如直播、電商、游戲、社交等,音視頻通話是其實(shí)時(shí)互動(dòng)的基礎(chǔ)能力。 如下圖所示,可以在官網(wǎng)中選擇Unity SDK進(jìn)行下載,也可以到 Unity Asset Store 資源商店中搜索 Agora SDK 進(jìn)行下載導(dǎo)入。 在官網(wǎng)中前往 Console 控制

    2024年02月09日
    瀏覽(27)
  • WebRTC音視頻通話(二)簡(jiǎn)單音視頻通話

    WebRTC音視頻通話(二)簡(jiǎn)單音視頻通話

    本篇不詳細(xì)介紹websocket,只針對(duì)websocket整合rtc。 webrtc是P2P通信,也就是實(shí)際交流的 只有兩個(gè)人 ,而要建立通信,這兩個(gè)人需要 交換一些信息來保證通信安全 。而且, webrtc必須通過ssh加密 ,也就是使用https協(xié)議、wss協(xié)議。 借用一幅圖 1.1 創(chuàng)建端點(diǎn)的解析 以下解析不包括we

    2023年04月09日
    瀏覽(29)
  • Hololens2遠(yuǎn)程音視頻通話與AR遠(yuǎn)程空間標(biāo)注,基于OpenXR+MRTK3+WebRTC實(shí)現(xiàn)
  • WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務(wù)搭建

    WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務(wù)搭建

    iOS開發(fā)-ossrs服務(wù)WebRTC本地視頻通話服務(wù)搭建 之前開發(fā)中使用到了ossrs,這里記錄一下ossrs支持的WebRTC本地服務(wù)搭建。 ossrs是什么呢? SRS(Simple Realtime Server)是一個(gè)簡(jiǎn)單高效的實(shí)時(shí)視頻服務(wù)器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多種實(shí)時(shí)流媒體協(xié)議。 官網(wǎng)地址:https://ossrs.net/lt

    2024年02月12日
    瀏覽(22)
  • WebRTC音視頻通話-實(shí)現(xiàn)iOS端調(diào)用ossrs視頻通話服務(wù)

    WebRTC音視頻通話-實(shí)現(xiàn)iOS端調(diào)用ossrs視頻通話服務(wù)

    WebRTC音視頻通話-實(shí)現(xiàn)iOS端調(diào)用ossrs視頻通話服務(wù) 之前搭建ossrs服務(wù),可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 這里iOS端使用GoogleWebRTC聯(lián)調(diào)ossrs實(shí)現(xiàn)視頻通話功能。 iOS端端效果圖 ossrs效果圖 WebRTC (Web Real-Time Communications) 是一項(xiàng)實(shí)時(shí)通訊技術(shù),它允許網(wǎng)絡(luò)應(yīng)用或者站

    2024年02月13日
    瀏覽(37)
  • Android之 集成音視頻通話

    Android之 集成音視頻通話

    一,背景 1.1 最近接收一個(gè)即時(shí)通訊二開項(xiàng)目,即時(shí)通訊部分用的XMPP協(xié)議,音視頻則是集成的國(guó)外的開源免費(fèi)庫(kù)jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的開源框架。但客戶想要微信那種頁面的排版,后來經(jīng)研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative寫的,這樣難度就大了

    2024年02月12日
    瀏覽(32)
  • 音視頻實(shí)時(shí)通話解決方案

    音視頻實(shí)時(shí)通話解決方案

    想要實(shí)現(xiàn)音視頻通話,對(duì)于大部分人可能會(huì)覺得很難,但是實(shí)際上,有些事情并沒有大家想的那樣困難,只要功夫深,鐵杵磨成針。 機(jī)緣巧合下,在業(yè)務(wù)中,我也遇到了一個(gè)業(yè)務(wù)場(chǎng)景需要實(shí)現(xiàn)音視頻通話,我們不可能自己從零開始干,我本次用到的核心是WebRTC。 WebRTC (Web R

    2024年02月12日
    瀏覽(24)
  • 技術(shù)分享| 小程序?qū)崿F(xiàn)音視頻通話

    技術(shù)分享| 小程序?qū)崿F(xiàn)音視頻通話

    上一期我們把前期準(zhǔn)備工作做完了,這一期就帶大家實(shí)現(xiàn)音視頻通話! 為了更好的區(qū)分功能,我分成了六個(gè) js 文件 config.js 音視頻與呼叫邀請(qǐng)配置 store.js 實(shí)現(xiàn)音視頻通話的變量 rtc.js 音視頻邏輯封裝 live-code.js 微信推拉流狀態(tài)碼 rtm.js 呼叫邀請(qǐng)相關(guān)邏輯封裝 util.js 其他方法

    2024年02月02日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包