分解并解释代码的作用。

  1. HTML 结构
  2. JavaScript代码

唷!希望您能理解。接下来我们将创建将接收流的文件。 ?


创建接收器

此文件通过 WebSocket 接收编码的视频块,对其进行解码,并将其显示在画布元素上。

在公共目录下创建一个名为“receiver.html”的新文件,并用以下内容填充它:

              Receiver                  

分解上述文件:

  1. HTML
  2. JavaScript

唷!现在我们已经拥有了所需的所有部分,让我们实际运行它吧! ?


运行代码

要运行代码,只需运行以下命令:

node index.js

然后将浏览器指向http://localhost:3000/sender.html
允许访问您的相机,然后打开另一个选项卡以
http://localhost:3000/receiver.html

如下所示,您应该看到从发送者发送的流。

\\\"WebCodec


结论

在本教程中,我展示了如何访问摄像头、对其进行编码、通过 WebSocket 发送数据块以及如何解码并在接收器端显示它们。我希望本教程对您有用。 ?

一如既往,您可以通过我的 github 获取代码:
https://github.com/ehand91/webcodec-stream

快乐编码! ?


喜欢我的工作吗?我发布的内容涉及各种主题,如果您想了解更多,请喜欢并关注我。
我也喜欢咖啡。

\\\"WebCodec

如果您想学习算法模式以在编码面试中取得好成绩,我推荐[以下课程](https://algolab.so/p/algorithms-and-data-struct-video-course?affcode=1413380_bzrepgch

","image":"http://www.luping.net/uploads/20241028/1730092693671f1e95d2b70.png","datePublished":"2024-11-08T11:01:10+08:00","dateModified":"2024-11-08T11:01:10+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > WebCodec - 发送和接收

WebCodec - 发送和接收

发布于2024-11-08
浏览:334

介绍

你好! ?

在本教程中,我将向您展示如何使用 WebCodec API 发送和接收视频。

首先让我们对服务器进行编码。


设置服务器

为了在对等点之间发送和接收数据包,我们需要一个 websocket 服务器。

为此,我们将使用 Nodejs 创建一个非常基本的服务器。首先初始化项目:

npm init -y

然后安装所需的模块:

npm i ws express

接下来创建一个名为“index.js”的新文件并使用以下代码填充它:

// server.js
const WebSocket = require('ws');
const express = require('express');

const app = express();
const port = 3000;
const connectedClients = new Set();

app.use(express.static(__dirname   '/public'));

const wss = new WebSocket.Server({ noServer: true });

wss.on('connection', ws => {
  console.log('new connection');
  connectedClients.add(ws);

  ws.on('message', message => {
    connectedClients.forEach(client => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  ws.once('close', () => {
    connectedClients.delete(ws);
    console.log('connection closed');
  });
});

const server = app.listen(port, () => {
  console.log(`server running on port ${port}`);
});

server.on('upgrade', (request, socket, head) => {
  wss.handleUpgrade(request, socket, head, (ws) => {
    wss.emit('connection', ws, request);
  });
});

上面的代码没有太复杂,它服务于公共目录并处理 websocket 连接,将数据包发送到所有连接的对等点。 ?

接下来我们将处理发件人部分,但首先创建一个名为“public”的新目录

mkdir public

创建发件人

我们将创建的第一个前端文件是广播文件,在 public 下创建一个名为“sender.html”的新文件,并用以下 HTML 填充它:


  
    Sender

分解并解释代码的作用。

  1. HTML 结构
    • 视频元素显示来自用户相机的实时视频
    • canvas 元素用于显示视频源的各个帧。这提供了每个编码帧的视觉预览
  2. JavaScript代码
    • initWebSocket 函数连接到 WebSocket 服务器。此连接对于将编码帧流式传输到接收器至关重要
    • initEncoder 函数创建一个 VideoEncoder 对象。它定义了一个输出回调,每次编码器生成新块时都会运行
    • videoEncoder.configure() 将编解码器设置为 VP8,码率 1Mbps,FPS 30,确保流畅且高质量的编码
    • getUserMedia 调用用于请求访问摄像头。视频源被分配给视频元素,VideoTrackProcessor 允许实时处理每一帧
    • processFrames 函数从视频中读取帧,将它们显示在 canvas 元素上,并使用 videoEncoder.encode() 对每个帧进行编码。然后将每个帧作为编码块发送到服务器。

唷!希望您能理解。接下来我们将创建将接收流的文件。 ?


创建接收器

此文件通过 WebSocket 接收编码的视频块,对其进行解码,并将其显示在画布元素上。

在公共目录下创建一个名为“receiver.html”的新文件,并用以下内容填充它:


  
    Receiver

分解上述文件:

  1. HTML
    • canvas 元素是解码视频帧的主要显示区域。它有固定的宽度、高度和边框,与发件人页面相同。
  2. JavaScript
    • initWebSocket 函数创建一个新的 WebSocket 连接,从发送方接收编码帧并将其传递给decodeFrame() 进行解码。
    • initDecoder 初始化为 VP8 编解码器配置的 VideoDecoder 对象。解码器将每一帧输出到画布。
    • decodeFrame 获取编码数据,将其包装在 EncodedVideoChunk 中(作为具有当前时间戳的关键帧),并通过 videoDecoder.decode() 对其进行解码。每一帧都实时显示在画布上

唷!现在我们已经拥有了所需的所有部分,让我们实际运行它吧! ?


运行代码

要运行代码,只需运行以下命令:

node index.js

然后将浏览器指向http://localhost:3000/sender.html
允许访问您的相机,然后打开另一个选项卡以
http://localhost:3000/receiver.html

如下所示,您应该看到从发送者发送的流。

WebCodec - Sending and Receiving


结论

在本教程中,我展示了如何访问摄像头、对其进行编码、通过 WebSocket 发送数据块以及如何解码并在接收器端显示它们。我希望本教程对您有用。 ?

一如既往,您可以通过我的 github 获取代码:
https://github.com/ehand91/webcodec-stream

快乐编码! ?


喜欢我的工作吗?我发布的内容涉及各种主题,如果您想了解更多,请喜欢并关注我。
我也喜欢咖啡。

WebCodec - Sending and Receiving

如果您想学习算法模式以在编码面试中取得好成绩,我推荐[以下课程](https://algolab.so/p/algorithms-and-data-struct-video-course?affcode=1413380_bzrepgch

版本声明 本文转载于:https://dev.to/ethand91/webcodec-sending-and-receiving-47m0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 下载网页到ESP或简单可编程控制器
    下载网页到ESP或简单可编程控制器
    为了将网页保存到ESP8266的FLASH中,我特地用delphi编写了一个软件工具。 该软件工具从一个文件夹中读取所有网页文件(包括html、css、js、图片等),并将其打包为二进制文件。 将ESP8266的GPIO0接地即可启动,ESP8266进入串口下载模式。 然后使用下载软件选择打包好的网...
    编程 发布于2024-11-08
  • 保护您的数据:如何创建不可破解的 SQL 和 MySQL 数据库副本
    保护您的数据:如何创建不可破解的 SQL 和 MySQL 数据库副本
    锁定前规划的审慎措施可确保 SQL 或 MySQL 数据库一旦转换为只读状态,即可按预期运行,并且仍可供指定用户组访问。这种远见还保证了数据库在将来需要更新或更改时可以安全地解锁。 将数据库设置为只读有一定的吸引力,这会引起 DBA 的共鸣。就好像数据库已经成熟并准备好走向世界,不受不断更新需求的阻...
    编程 发布于2024-11-08
  • 使用拦截器自定义获取并在 nuxt 3 中登录
    使用拦截器自定义获取并在 nuxt 3 中登录
    如果您使用过 Nuxt,您可能遇到过方便的 useFetch 可组合项: <script setup lang="ts"> const { data, status, error, refresh, clear } = await useFetch('/api/modules') <...
    编程 发布于2024-11-08
  • React源码中MessageChannel的使用
    React源码中MessageChannel的使用
    这篇文章我们分析React源码中MessageChannel的用法。 我们先来了解一下什么是MessageChannel。 消息频道 Channel Messaging API 的 MessageChannel 接口允许我们创建一个新的消息通道并通过它的两个 MessagePort ...
    编程 发布于2024-11-08
  • 如何在CSS中模糊背景图像而不模糊内容?
    如何在CSS中模糊背景图像而不模糊内容?
    CSS 在保持内容清晰度的同时对背景图像进行模糊处理尝试在 CSS 设置中模糊背景图像时,通常会遇到内容(文本或其他元素)也变得模糊的问题。这就是 z-index 和伪元素的概念发挥作用的地方。要模糊背景图像而不影响内容,可以采用以下方法:创建背景容器:将背景图像包含在div或其他容器中,并为其分配...
    编程 发布于2024-11-08
  • 哑的
    哑的
    大家好,我是Misti-sage,DOOF的唯一创造者: 动态的 输出 针对进行了优化 灵活性。 (我是编码新手,所以我的大部分(如果不是全部)DOOF 工作都是由 ChatGPT 协助的。) 我欢迎任何可以帮助改进 DOOF(也称为 Darfensmirg)的人。 <!DOCTYPE htm...
    编程 发布于2024-11-08
  • 为什么 Go 正则表达式 \\b 边界对于拉丁字符会失败?
    为什么 Go 正则表达式 \\b 边界对于拉丁字符会失败?
    \b Go 正则表达式中拉丁字符的边界在 Go 正则表达式的世界中, \b 边界选项有一个轻微的怪癖处理拉丁字符时。当尝试定义包含拉丁字符(例如重音元音和特殊字符)的单词时,就会出现此问题。考虑以下示例,我们希望使用 \b 边界选项来匹配单词“vis”:import ( "fmt&...
    编程 发布于2024-11-08
  • H2 与 HSQLDB:哪种嵌入式数据库最适合我的财务管理应用程序?
    H2 与 HSQLDB:哪种嵌入式数据库最适合我的财务管理应用程序?
    Java 嵌入式数据库比较鉴于有大量可用选项,为您的财务管理应用程序选择嵌入式数据库可能具有挑战性。为了帮助您,让我们根据您的需求比较 H2、HSQLDB、Derby 和 Berkeley DB。H2 与 HSQLDBH2 和 HSQLDB 都提供出色的性能和稳定。 H2以速度着称,而HSQLDB则...
    编程 发布于2024-11-08
  • C 中允许多少级指针间接寻址?
    C 中允许多少级指针间接寻址?
    C 语言中的指针深度:了解级别限制在 C 编程中,变量可以使用指针具有多层间接寻址。这种灵活性允许复杂的数据结构和高效的内存管理。然而,问题出现了:单个变量允许的最大指针级别(称为“*”)是多少?了解指针深度的限制对于有效和安全的编程至关重要。 C 标准定义了允许的指针级别数的下限,但上限是特定于实...
    编程 发布于2024-11-08
  • 光泽和微光让我的心率下降 - 案例研究
    光泽和微光让我的心率下降 - 案例研究
    最近,一位客户联系我,询问其 WordPress 网站上的“财务评估”javascript 应用程序不再工作。它有很多问题,最后,最简单的方法就是重建它。 在此应用程序中,用户可以输入基本的财务和个人信息,应用程序会告诉他们在财务规划方面是否走在正确的道路上。这不是超级复杂的逻辑,但有相当多的逻辑。...
    编程 发布于2024-11-08
  • 案例研究:加权九尾问题
    案例研究:加权九尾问题
    加权九尾问题可以简化为加权最短路径问题。 部分提出了九尾问题并使用 BFS 算法解决了它。本节介绍问题的变体并使用最短路径算法解决它。 九尾问题是找到导致所有硬币面朝下的最少移动次数。每一步都会翻转一枚正面硬币及其相邻硬币。加权九尾问题将翻转次数指定为每次移动的权重。例如,您可以通过翻转第一行中的第...
    编程 发布于2024-11-08
  • 如何在不依赖扩展名的情况下确定文件类型?
    如何在不依赖扩展名的情况下确定文件类型?
    如何在不依赖扩展名的情况下检测文件类型除了检查文件的扩展名之外,确定文件是 mp3 还是图像格式是很有价值的编程中的任务。这是一个不依赖扩展的全面解决方案:PHP >= 5.3:$mimetype = finfo_fopen(fopen($filename, 'r'), FILEINFO_MIME_...
    编程 发布于2024-11-08
  • 变量和文件夹的命名规则是什么?
    变量和文件夹的命名规则是什么?
    การตั้งชื่อสำหรับตัวแปรและโฟลเดอร์ในโปรเจกต์มีความสำคัญมากในการรักษาความอ่านง่ายและความเป็นระเบียบของโค้ด ต่อไปนี้คือลักษณะและกฎทั่วไปในการตั้งชื่อ: ...
    编程 发布于2024-11-08
  • 使用 Python 构建测验应用程序:分步指南
    使用 Python 构建测验应用程序:分步指南
    您是否曾想创建自己的测验应用程序?这是一个有趣的项目,可以帮助您学习编程,同时也可以创造一些有用的东西。在此项目中,我们将逐步介绍如何构建一个包含多项选择题、评分、时间限制和不同主题的简单测验应用程序。 我们的测验应用程序会做什么 我们的测验应用程序将: 提出多项选择题 记录分数 ...
    编程 发布于2024-11-08
  • 如何跨多个浏览器执行WebUI功能文件
    如何跨多个浏览器执行WebUI功能文件
    跨多个浏览器执行 WebUI 功能文件并行测试和分布式测试技术提供了跨各种浏览器执行 WebUI 功能文件的能力。在本文中,我们将探讨如何在 Karate 和 Zalenium 中使用这些方法。使用 Parallel RunnerKarate 中的并行运行器允许您执行并行的示例表。要利用此功能针对多...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3