• 使用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() 就行
         

  • 相关阅读:
    C++学习笔记(十六)
    C语言变量的作用域
    Linux常用命令(二)——文件查找命令 find、软链接创建命令 ln、查看磁盘剩余/使用空间命令 df / du
    LeetCode题解—260.只出现一次的数字Ⅲ
    探究Socks5代理和代理IP在技术领域的多重应用
    kubernetes部署和运行维护中的错误汇总(不定时更新)
    LeetCode 0503. 下一个更大元素 II
    ChatGPT Plus暂停注册,用户激增压力太大!
    torch.nn用法
    第2章 Linux的文件管理(四)
  • 原文地址:https://blog.csdn.net/weixin_38441229/article/details/132693113