IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> WebRTC-本地简单端到端视频通话demo -> 正文阅读

[移动开发]WebRTC-本地简单端到端视频通话demo

内容概述

前文说了 端到端的概念

简单代码写一个demo

效果如图

在这里插入图片描述

基础界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>本机端到端连接测试</title>
    <link href="./css/main.css" rel="stylesheet" />
</head>
<body>
<div>


    <div>
        <button id="start">Start</button>
        <button id="call" disabled>Call</button>
        <button id="hangup" disabled>HangUp</button>
    </div>

    <div id="preview">
        <div >
            <h2>Local:</h2>
            <video id="localvideo" autoplay playsinline></video>
            <h2>Local SDP:</h2>
            <textarea id="offer"></textarea>
        </div>
        <div>
            <h2>Remote:</h2>
            <video id="remotevideo" autoplay playsinline></video>
            <h2>Remote SDP:</h2>
            <textarea id="answer"></textarea>
        </div>
    </div>
</div>

<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script src="js/main.js"></script>
</body>
</html>

业务逻辑

和前文流程一致

'use strict'

var localVideo = document.querySelector('video#localvideo');
var remoteVideo = document.querySelector('video#remotevideo');

var btnStart = document.querySelector('button#start');
var btnCall = document.querySelector('button#call');
var btnHangup = document.querySelector('button#hangup');

var offerSdpTextarea = document.querySelector('textarea#offer');
var answerSdpTextarea = document.querySelector('textarea#answer');

var localStream;
var pc1;
var pc2;

function getMediaStream(stream){
    localVideo.srcObject = stream;
    localStream = stream;
}

function handleError(err){
    console.error('Failed to get Media Stream!', err);
}

function start(){

    if(!navigator.mediaDevices ||
        !navigator.mediaDevices.getUserMedia){
        console.error('the getUserMedia is not supported!');
        return;
    }else {
        var constraints = {
            video : {
                width: 640,
                height: 480,
                frameRate:15,
            },
            audio: false
        }
        navigator.mediaDevices.getDisplayMedia(constraints)
            .then(getMediaStream)
            .catch(handleError);

        btnStart.disabled = true;
        btnCall.disabled = false;
        btnHangup.disabled = true;
    }
}

function getRemoteStream(e){
    remoteVideo.srcObject = e.streams[0];
}

function handleOfferError(err){
    console.error('Failed to create offer:', err);
}

function handleAnswerError(err){
    console.error('Failed to create answer:', err);
}

function getAnswer(desc){
    pc2.setLocalDescription(desc);
    answerSdpTextarea.value = desc.sdp

    //send desc to signal
    //receive desc from signal

    pc1.setRemoteDescription(desc);
}

function getOffer(desc){
    pc1.setLocalDescription(desc);
    offerSdpTextarea.value = desc.sdp

    //send desc to signal
    //receive desc from signal

    pc2.setRemoteDescription(desc);

    pc2.createAnswer()
        .then(getAnswer)
        .catch(handleAnswerError);

}

function call(){

    pc1 = new RTCPeerConnection();
    pc2 = new RTCPeerConnection();

    pc1.onicecandidate = (e)=>{
        pc2.addIceCandidate(e.candidate);
    }

    pc2.onicecandidate = (e)=>{
        pc1.addIceCandidate(e.candidate);
    }

    pc2.ontrack = getRemoteStream;

    localStream.getTracks().forEach((track)=>{
        pc1.addTrack(track, localStream);
    });

    var offerOptions = {
        offerToRecieveAudio: 0,
        offerToRecieveVideo: 1
    }

    pc1.createOffer(offerOptions)
        .then(getOffer)
        .catch(handleOfferError);

    btnCall.disabled = true;
    btnHangup.disabled = false;
}

function hangup(){
    pc1.close();
    pc2.close();
    pc1 = null;
    pc2 = null;

    btnCall.disabled = false;
    btnHangup.disabled = true;
}

btnStart.onclick = start;
btnCall.onclick = call;
btnHangup.onclick = hangup;

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:02:21  更:2022-03-21 21:03:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:56:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码