当前位置:首页 » 《随便一记》 » 正文

使用js搭建简易的WebRTC实现视频直播

1 人参与  2024年02月15日 13:26  分类 : 《随便一记》  评论

点击全文阅读


首先需要一个信令服务器,我们使用nodejs来搭建。两个端:发送端和接收端。我的目录结构如下图:
流程 创建一个文件夹 WebRTC-Test。进入文件夹中,新建一个node的文件夹。使用终端并进入node的目录下,使用
npm init

创建package.json。

新建server.js,复制一下代码
const app = require('express')();const wsInstance = require('express-ws')(app);const cors = require('cors');app.use(cors({ origin: 'http://localhost:3000' }));app.ws('/', ws => {ws.on('message', data => {// 未做业务处理,收到消息后直接广播wsInstance.getWss().clients.forEach(server => {if (server !== ws) {server.send(data);console.log(data,)}});});});console.log("服务启动: http://localhost:8080");app.listen(8080, '0.0.0.0');
下载信令服务器的依赖。
npm install express;npm install express-ws;npm install cors;
使用node server.js启动node的服务。准备接收方的代码(receive.html)。
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">    <title>Receiver</title></head><body>    <video autoplay id="remote"></video></body><script>    const remoteVideo = document.querySelector('#remote')    const socket = new WebSocket('ws://localhost:8080');    socket.onopen = function () {        console.log("Socket Success")    }    let buddy = new RTCPeerConnection()    // 如果接收到对方的视频    socket.onmessage = function (e) {        const { type, sdp, iceCandidate } = JSON.parse(e.data)        console.log(type)        switch (type) {            case "offer":                buddy.setRemoteDescription(                    new RTCSessionDescription({ type, sdp })                )                buddy.createAnswer().then(answer => {                    buddy.setLocalDescription(answer)                    socket.send(JSON.stringify(answer))                })                break;            case "offer_ice":                buddy.addIceCandidate(iceCandidate)                break;            default:                break;        }    }    buddy.ontrack = function (e) {        remote.srcObject = e.streams[0]    }    buddy.onicecandidate = function (e) {        if (e.candidate) {            socket.send(JSON.stringify({                type: "answer_ice",                iceCandidate: e.candidate            }))        }    }</script></html>
准备发送方的代码(send.html)。
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">    <title>Send</title></head><body>    <script>        const socket = new WebSocket('ws://localhost:8080');        socket.onopen = function () {            console.log("Socket Success")        }        let peer = new RTCPeerConnection()        navigator.mediaDevices.getUserMedia({            video: true,            audio: true        }).then(stream => {            stream.getTracks().forEach(track => {                peer.addTrack(track, stream);            })            peer.createOffer().then(offer => {                peer.setLocalDescription(offer);                socket.send(JSON.stringify(offer));            })        })        peer.onicecandidate = function (e) {            if (e.candidate) {                socket.send(JSON.stringify({                    type: "offer_ice",                    iceCandidate: e.candidate                }))            }        }        // 如果接收到对方的视频        socket.onmessage = function (e) {            const { type, sdp, iceCandidate } = JSON.parse(e.data)            console.log(type)            switch (type) {                case "answer":                    peer.setRemoteDescription(                        new RTCSessionDescription({ type, sdp })                    )                    break;                case "answer_ice":                    peer.addIceCandidate(iceCandidate)                    break;                default:                    break;            }        }    </script></body></html>
使用vscode的插件live server启动两个html文件。
下载live server插件。

启动live server。

启动后两个端口号。


等全部启动后,查看接收端的页面,要等一段时间,可以看到摄像头拍到的画面。
接受端播放不了,在浏览器控制台中输入 remoteVideo.play() 就行
 


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/68570.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 绿茶室友害我身败名裂,我设计她们反目成仇章节试读_悠悠刘钰梁欣节选高光片段速递‌
  • 「冲喜新娘神神叨叨,沈总好喜欢」小说节选推荐_[苏枝沈牧舟]后续已完结
  • 未婚夫将我推到蛊虫堆里给青梅养蛊,我以身喂蛊后杀疯了关键剧情节选解锁_许方晋秦落瑶殷红完结版免费在线阅读
  • [老公嫌我是助浴师,破产后却求我救命]小说节选免费试读_「赵严程菲妹妹」***剧情片段直通车
  • 「极品女总裁,是个疯批」反转剧情试读片段_[李长风陈洛]情感冲突精选段落
  • 亲女儿被养女炼成蛊后,我杀疯了全章节免费阅读_诺诺宋清清苗疆关键剧情节选解锁
  • 「用了男友两块钱亲密付被说图他的钱」完结版免费阅读_贺然翠翠孟凡全角色番外合集包
  • (番外)+(全书)如果月亮说爱你全书+后续+结局(沈聿付梨)列表_如果月亮说爱你全书+后续+结局(沈聿付梨)如果月亮说爱你全书+后续+结局
  • 「当爱被海水淹没」节选名场面直通车‌_[贺维钧贺若琳沫沫]最新章节免费阅读
  • 繁花盛意难平全书+后续+结局(陆依霜轩辕翊)全书列表_繁花盛意难平(陆依霜轩辕翊)繁花盛意难平全书+后续+结局在线
  • 全球灾变:我有一座恐怖屋全文免费在线阅读_[钟无咎林澜]全文免费无弹窗阅读_笔趣阁
  • 「乖巧面具撕碎那天,全网求我别黑化」章节多结局预体验‌_宋且微萧淮无弹窗阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1