分解并解释代码的作用。

  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
瀏覽:864

介绍

你好! ?

在本教程中,我将向您展示如何使用 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]刪除
最新教學 更多>
  • 使用 CSS 將漸層應用於文字。
    使用 CSS 將漸層應用於文字。
    文字漸變 現在你可以在很多地方看到像文字漸變這樣的好技巧......但是呢?你有沒有想過它們是如何製作的?今天就讓我來教你。 .text-gradient { background: linear-gradient(-25deg, #5662f6 0%, #7fffd4 10...
    程式設計 發佈於2024-11-08
  • 如何在Python中執行自訂區間舍入?
    如何在Python中執行自訂區間舍入?
    Python 中捨入為自訂間隔在 Python 中,內建 round() 函數通常用於對數值進行舍入。然而,它採用以 10 為基數的捨入方案,這可能並不總是適合特定要求。例如,如果您想將數字四捨五入到最接近的 5 倍數,則標準 round() 函數不合適。 要解決此問題,可以建立自訂函數,將數值四捨...
    程式設計 發佈於2024-11-08
  • 項目 注意字串連接效能
    項目 注意字串連接效能
    1。使用運算子 ( ) 連接字串: 使用運算子連接字串對於少量連接來說很方便,但由於字串的不變性,在大規模操作時會出現效能問題。 每次建立新字串時,都會複製所有先前字串的內容,從而導致大型連接的時間成二次方。 不正確的例子(與 重複連接): public String criaFatura(Li...
    程式設計 發佈於2024-11-08
  • 如何解決 Wamp 伺服器中的橘色圖示問題:識別服務故障並對其進行故障排除
    如何解決 Wamp 伺服器中的橘色圖示問題:識別服務故障並對其進行故障排除
    解決Wamp Server 中頑固的橙色圖標解決Wamp Server 中頑固的橙色圖標在Web 開發領域,WampServer 圖標旁邊出現橙色圖標可以成為令人沮喪的橙色路障。此持久性圖示通常表示啟動 Apache 或 MySQL 服務失敗,使您陷入開發困境。 識別罪魁禍首:Apache 或 My...
    程式設計 發佈於2024-11-08
  • 網路基礎知識
    網路基礎知識
    In the world of system design, networks are the glue that binds different components together. Whether you're building a web application, a distribute...
    程式設計 發佈於2024-11-08
  • Python 初學者教學:學習基礎知識
    Python 初學者教學:學習基礎知識
    欢迎来到Python编程的奇妙世界!如果您是编码新手,请系好安全带,因为 Python 是最简单但最强大的语言之一。无论您是想自动执行繁琐的任务、构建 Web 应用程序还是深入研究数据科学,Python 都是您成功编码的门户。 在本初学者指南中,我们将引导您完成 Python 的基本构建块,确保您准...
    程式設計 發佈於2024-11-08
  • 如何提取MySQL字串中第三個空格之後的子字串?
    如何提取MySQL字串中第三個空格之後的子字串?
    MySQL:提取字串中的第三個索引要使用MySQL 定位字串中第三個空格的索引,一種方法是利用SUBSTRING_INDEX 函數。此函數可以提取直到指定分隔符號(在本例中為空格字元)的子字串。 要隔離第三個空格,您可以使用兩個巢狀的 SUBSTRING_INDEX 呼叫。內部函數呼叫檢索從字串開頭...
    程式設計 發佈於2024-11-08
  • 如果無法存取已指派的空間,為什麼要為 ArrayList 設定初始大小?
    如果無法存取已指派的空間,為什麼要為 ArrayList 設定初始大小?
    了解 ArrayList 中的初始大小在 Java 中,ArrayList 是動態數組,可以根據需要增長和縮小。可以使用建構子 new ArrayList(10) 指定 ArrayList 的初始大小,其中 10 表示所需的容量。 但是,設定初始大小並未授予立即存取已指派空間的權限。與傳統陣列不同,...
    程式設計 發佈於2024-11-08
  • 如何在不改變系統設定的情況下使Python 2.7成為Linux中的預設版本?
    如何在不改變系統設定的情況下使Python 2.7成為Linux中的預設版本?
    Linux 中的預設 Python 版本:選擇 Python 2.7在 Linux 系統上運行多個 Python 版本是常見的情況。然而,瀏覽預設版本有時可能會很困難。本文討論如何在終端機上鍵入「python」命令時將 Python 2.7 設為預設版本。 預設 Python 更改的評估更改預設 P...
    程式設計 發佈於2024-11-08
  • 如何根據多個條件對 Go 中具有嵌套切片的結構切片進行排序?
    如何根據多個條件對 Go 中具有嵌套切片的結構切片進行排序?
    使用嵌套切片對結構體切片進行排序在Go 中,您可以使用內建的排序包對自訂結構體切片進行排序。考慮以下程式碼,它定義了兩個結構體 Parent 和 Child,表示父子關係:type Parent struct { id string children []Child } ...
    程式設計 發佈於2024-11-08
  • C# | Web Api 的提示和技巧
    C# | Web Api 的提示和技巧
    筆記 您可以查看我個人網站上的其他帖子:https://hbolajraf.net Web Api 的提示和技巧 用 C# 建立 Web API 是創建可擴展且高效的後端服務的強大方法。以下是一些提示和技巧,可協助您充分利用 C# Web API 開發。 1.使...
    程式設計 發佈於2024-11-08
  • JavaScript 模組
    JavaScript 模組
    現在我們不再將所有 JS 寫在一個文件中並發送給客戶端。 今天,我們將程式碼編寫到模組中,這些模組之間共享資料並且更易於維護。 約定是使用駝峰命名法命名模組。 我們甚至可以透過 npm 儲存庫將第 3 方模組包含到我們自己的程式碼中,例如 jquery、react、webpack、babel...
    程式設計 發佈於2024-11-08
  • 適合前端開發人員的最佳 JavaScript 框架
    適合前端開發人員的最佳 JavaScript 框架
    要開始您作為前端開發人員的旅程,選擇正確的 JavaScript 框架可以顯著影響您的學習曲線和專案成功。以下是每個前端開發人員都應該選擇的一些最佳 JavaScript 框架。 1. 反應 React 是一個廣泛使用的 JavaScript 函式庫,用於建立使用者介面,主要關注單...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中停用 .pyc 檔案生成?
    如何在 Python 中停用 .pyc 檔案生成?
    如何阻止Python產生.pyc檔如何阻止Python產生.pyc檔Python通常將原始碼(.py檔)編譯為字節碼(.pyc檔)以提高執行速度。但是,您可能會遇到希望執行解釋器而不建立 .pyc 檔案的情況。 根據“What's New in Python 2.6 - Interprete...
    程式設計 發佈於2024-11-08
  • Go vs. Java vs. .NET:企業綜合效能與開發時間評估
    Go vs. Java vs. .NET:企業綜合效能與開發時間評估
    In today’s fast-paced software development landscape, choosing the right programming language is crucial for enterprise success. With languages like ...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3