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


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

        创建package.json

      4. 新建server.js,复制一下代码
        1. const app = require('express')();
        2. const wsInstance = require('express-ws')(app);
        3. const cors = require('cors');
        4. app.use(cors({ origin: 'http://localhost:3000' }));
        5. app.ws('/', ws => {
        6. ws.on('message', data => {
        7. // 未做业务处理,收到消息后直接广播
        8. wsInstance.getWss().clients.forEach(server => {
        9. if (server !== ws) {
        10. server.send(data);
        11. console.log(data,)
        12. }
        13. });
        14. });
        15. });
        16. console.log("服务启动: http://localhost:8080");
        17. app.listen(8080, '0.0.0.0');
      5. 下载信令服务器的依赖。
        1. npm install express;
        2. npm install express-ws;
        3. npm install cors;
      6. 使用node server.js启动node的服务。
      7. 准备接收方的代码(receive.html)。
        1. html>
        2. <html lang="zh-CN">
        3. <head>
        4. <meta charset="UTF-8">
        5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
        6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
        7. <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
        8. <title>Receivertitle>
        9. head>
        10. <body>
        11. <video autoplay id="remote">video>
        12. body>
        13. <script>
        14. const remoteVideo = document.querySelector('#remote')
        15. const socket = new WebSocket('ws://localhost:8080');
        16. socket.onopen = function () {
        17. console.log("Socket Success")
        18. }
        19. let buddy = new RTCPeerConnection()
        20. // 如果接收到对方的视频
        21. socket.onmessage = function (e) {
        22. const { type, sdp, iceCandidate } = JSON.parse(e.data)
        23. console.log(type)
        24. switch (type) {
        25. case "offer":
        26. buddy.setRemoteDescription(
        27. new RTCSessionDescription({ type, sdp })
        28. )
        29. buddy.createAnswer().then(answer => {
        30. buddy.setLocalDescription(answer)
        31. socket.send(JSON.stringify(answer))
        32. })
        33. break;
        34. case "offer_ice":
        35. buddy.addIceCandidate(iceCandidate)
        36. break;
        37. default:
        38. break;
        39. }
        40. }
        41. buddy.ontrack = function (e) {
        42. remote.srcObject = e.streams[0]
        43. }
        44. buddy.onicecandidate = function (e) {
        45. if (e.candidate) {
        46. socket.send(JSON.stringify({
        47. type: "answer_ice",
        48. iceCandidate: e.candidate
        49. }))
        50. }
        51. }
        52. script>
        53. html>
      8. 准备发送方的代码(send.html)。
        1. html>
        2. <html lang="zh-CN">
        3. <head>
        4. <meta charset="UTF-8">
        5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
        6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
        7. <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
        8. <title>Sendtitle>
        9. head>
        10. <body>
        11. <script>
        12. const socket = new WebSocket('ws://localhost:8080');
        13. socket.onopen = function () {
        14. console.log("Socket Success")
        15. }
        16. let peer = new RTCPeerConnection()
        17. navigator.mediaDevices.getUserMedia({
        18. video: true,
        19. audio: true
        20. }).then(stream => {
        21. stream.getTracks().forEach(track => {
        22. peer.addTrack(track, stream);
        23. })
        24. peer.createOffer().then(offer => {
        25. peer.setLocalDescription(offer);
        26. socket.send(JSON.stringify(offer));
        27. })
        28. })
        29. peer.onicecandidate = function (e) {
        30. if (e.candidate) {
        31. socket.send(JSON.stringify({
        32. type: "offer_ice",
        33. iceCandidate: e.candidate
        34. }))
        35. }
        36. }
        37. // 如果接收到对方的视频
        38. socket.onmessage = function (e) {
        39. const { type, sdp, iceCandidate } = JSON.parse(e.data)
        40. console.log(type)
        41. switch (type) {
        42. case "answer":
        43. peer.setRemoteDescription(
        44. new RTCSessionDescription({ type, sdp })
        45. )
        46. break;
        47. case "answer_ice":
        48. peer.addIceCandidate(iceCandidate)
        49. break;
        50. default:
        51. break;
        52. }
        53. }
        54. script>
        55. body>
        56. html>
      9. 使用vscode的插件live server启动两个html文件。
        下载live server插件。

        启动live server。

        启动后两个端口号。


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

  • 相关阅读:
    前进永无止境!Pipeline更新又双叒叕来了!
    基于PB的企业人力资源信息系统设计与实现
    计算机组成原理之浮点四则运算
    ubuntu、linux in window安装docker教程
    Stable Diffusion基础:ControlNet之重新上色(黑白照片换新颜)
    设计模式 — 抽象工厂模式
    04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
    猿创征文| 开发微信小程序入门到入土②(复习笔记)
    Python 文件加密
    ET-G2-D24-4A-A、ET-G2-D24-2A-V两路独立设置比例控制器
  • 原文地址:https://blog.csdn.net/weixin_38441229/article/details/132693113