最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js視頻流應用創(chuàng)建之后端的全過程

 更新時間:2022年03月17日 15:52:04   作者:天行無忌  
這篇文章主要給大家介紹了關于創(chuàng)建Node.js視頻流應用之后端的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

在本文中,將展示一個非常簡單的 Node.js 應用程序,用于在線流媒體視頻傳輸。本文僅涵蓋后端,在下一部分中,將使用 Vue.js 創(chuàng)建前端。話不多說,下面開始進入主題。

源碼地址:github.com/QuintionTan…

初始化

創(chuàng)建項目文件夾 vue-video-stream ,進入文件夾,再創(chuàng)建文件夾 express-service ,用戶存放后端服務相關代碼,進入express-service ,運行 npm init 初始化配置并安裝相關依賴項,如下:

npm install express cors --save
npm install -D nodemon

安裝完成后修改 package.json 中的調試及啟動腳本,如下:

"scripts": {
    "start": "node ./index.js",
    "debug": "nodemon --trace-warnings --inspect=0.0.0.0:9229 ./index.js"
}

至此完成了后端服務的初始化,接下來完成主體部分。

主體邏輯

主體邏輯的代碼主要在文件 index.js 文件中,如下:

const express = require("express");
const cors = require("cors");

const app = express();
app.use(cors());

app.get("/", (req, res) => {
    // 根目錄路由
});

const PORT = process.env.PORT || 8100;

app.listen(PORT, () => {
    console.log(`服務運行端口:${PORT}`);
});

在流媒體傳輸視頻的目錄中 express-service 添加一個新的 index.html 文件。文件的 src 必須指向要繼續(xù)進行流媒體傳輸的服務器端點。

注意:這里的 index.html 文件主要用于演示后臺服務,后續(xù)將會使用 VUE 來替換。

<!DOCTYPE html>
<html lang="zh">

    <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" />
        <title>流媒體傳輸 Express 服務</title>
        <style type="text/css">
            body {
                margin: 0px;
                padding: 0px;
                background-color: #000;
            }

            video {
                position: absolute;
                width: 800px;
                left: 50%;
                top: 50%;
                -webkit-transform: translate(-50%, -50%);
                -moz-transform: translate(-50%, -50%);
                transform: translate(-50%, -50%);
            }
        </style>
    </head>

    <body>
        <video src="/video/20220315" width="800px" height="auto" controls autoplay id="videoPlayer"></video>
    </body>
</html>

現在需要設置 /video 路由和控制器邏輯,作為索引路由,還需要發(fā)送這個 HTML 文件進行渲染。接下來更新 index.js 文件代碼,如下:

const express = require("express");
const cors = require("cors");

const app = express();
app.use(cors());

app.get("/", (req, res) => {
    // 根目錄路由
    res.sendFile(__dirname + "/index.html");
});
// 視頻路由
app.use("/video", require("./routes/index"));

const PORT = process.env.PORT || 8100;

app.listen(PORT, () => {
    console.log(`服務運行端口:${PORT}`);
});

接下來在目錄 express-service 創(chuàng)建文件夾 routes ,在文件夾中創(chuàng)建腳本文件 index.js ,代碼如下:

const router = require("express").Router();
const videoController = require("../controller/videoController");
router.get("/:videoId", videoController.streamVideo);
module.exports = router;

在目錄 express-service 創(chuàng)建文件夾 controller ,在文件夾中創(chuàng)建腳本文件 videoController.js ,代碼如下:

const fs = require("fs");
module.exports.streamVideo = (req, res) => {
    const range = req.headers.range;
    const videoId = req.params.videoId; // ID或者視頻文件名稱
    if (!range) {
        res.status(400).send("無效Range");
    }
    const processPath = process.cwd(); // 獲取服務運行路徑
    const videoPath = `${processPath}/resources/${videoId}.mp4`;
    const videoSize = fs.statSync(videoPath).size;
    const chunkSize = 10 ** 6; // 1 mb
    const start = Number(range.replace(/\D/g, ""));
    const end = Math.min(start + chunkSize, videoSize - 1);
    const contentLength = end - start + 1;
    const headers = {
        "Content-Range": `bytes ${start}-${end}/${videoSize}`,
        "Accept-Ranges": "bytes",
        "Content-Length": contentLength,
        "Content-Type": "video/mp4",
    };
    res.writeHead(206, headers);
    const videoStream = fs.createReadStream(videoPath, { start, end });
    videoStream.pipe(res);
};

下面就來介紹 videoController 的主要邏輯,在請求 headers 中,提取了 range( range 是當前在視頻緩沖區(qū)中的部分)。如果range不存在,拋出一個錯誤。否則,在文件系統中找到該文件。

然后,設置要隨每個并發(fā)請求發(fā)送的塊大?。ùa中設置為 1 MB , Math.pow(10,6) 或簡單的 10 ** 6)。然后定義開始和結束變量,start 變量決定了發(fā)送的視頻的起點,對于 end 變量,需要確定 (start +chunk) 或視頻大小長度之間的最小值,避免超出。

最后,確定實際發(fā)送的內容長度,內容長度是開始值和結束值之間的差異。然后使用剛剛在它上面計算的值生成的 headers 對象。在代碼的最后一部分,發(fā)送一個內容響應 (206),它是 express 框架的一部分,并使用 fs(Node.js 核心)模塊將該響應與讀取流進行管道傳輸。

現在來啟動服務,執(zhí)行如下:

npm run start

如果是要調試代碼,避免手動重啟,可以執(zhí)行一下命令:

npm run debug

這樣在修改 js 代碼后服務將會自動重啟。

啟動后在瀏覽器中輸入 http://127.0.0.1:8100/,就可以看到如下效果:

在下一部分中,將使用 Vue.js 設計前端《VUE創(chuàng)建視頻流應用》。

總結

到此這篇關于創(chuàng)建Node.js視頻流應用之后端的文章就介紹到這了,更多相關Node.js視頻流應用后端內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 從零開始在webstorm配置nodejs

    從零開始在webstorm配置nodejs

    WebStorm是作為JS開發(fā)IDE存在的,并且支持流行的Node.js以及JQuery等js框架,下面這篇文章主要給大家介紹了關于如何從零開始在webstorm配置nodejs的相關資料,需要的朋友可以參考下
    2024-08-08
  • node.js的require()及基本用法

    node.js的require()及基本用法

    Node.js使用CommonJS模塊格式,通過require語句加載模塊,源碼分析了require語句的內部運行機制,包括基本用法、Module構造函數、模塊實例的require方法、模塊的絕對路徑、加載模塊等,本文介紹node.js的require()及基本用法,感興趣的朋友一起看看吧
    2025-02-02
  • Nodejs基于LRU算法實現的緩存處理操作示例

    Nodejs基于LRU算法實現的緩存處理操作示例

    這篇文章主要介紹了Nodejs基于LRU算法實現的緩存處理操作,結合具體實例形式分析了LRU算法的原理、功能以及nodejs使用LRU算法實現緩存處理操作的相關實現技巧,需要的朋友可以參考下
    2017-03-03
  • npm報錯"A?complete?log?of?this?run?can?be?found?in:"的解決辦法

    npm報錯"A?complete?log?of?this?run?can?be?found?

    這篇文章主要給大家介紹了關于npm報錯"A?complete?log?of?this?run?can?be?found?in:"的解決辦法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-04-04
  • Koa2 之文件上傳下載的示例代碼

    Koa2 之文件上傳下載的示例代碼

    本篇文章主要介紹了Koa2 之文件上傳下載的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • nodeJS(express4.x)+vue(vue-cli)構建前后端分離實例(帶跨域)

    nodeJS(express4.x)+vue(vue-cli)構建前后端分離實例(帶跨域)

    這篇文章主要介紹了nodeJS(express4.x)+vue(vue-cli)構建前后端分離實例(帶跨域) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 提升node.js中使用redis的性能遇到的問題及解決方法

    提升node.js中使用redis的性能遇到的問題及解決方法

    本文中提到的node redis client采用的基于node-redis封裝的二方包,因此問題排查也基于node-redis這個模塊。接下來通過本文給大家分享提升node.js中使用redis的性能
    2018-10-10
  • node.js博客項目開發(fā)手記

    node.js博客項目開發(fā)手記

    本篇文章給大家總結了node.js博客項目開發(fā)的相關步驟以及知識點分享,有興趣的朋友參考下。
    2018-03-03
  • 詳解node.js 下載圖片的 2 種方式

    詳解node.js 下載圖片的 2 種方式

    本文通過實例代碼給大家介紹了node.js 下載圖片的 2 種方式及下載遠程圖片的實現代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • 深入解析nodejs HTTP服務

    深入解析nodejs HTTP服務

    本篇文章主要介紹了深入解析nodejs HTTP服務,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

平顺县| 米易县| 汉沽区| 乌什县| 锡林郭勒盟| 邹平县| 榆林市| 尚义县| 舟曲县| 宣汉县| 南平市| 苏尼特左旗| 舟山市| 固安县| 万州区| 石阡县| 石首市| 东明县| 新巴尔虎左旗| 石门县| 长宁县| 玉环县| 泽库县| 康乐县| 焦作市| 水富县| 莱阳市| 托克逊县| 凉山| 玉溪市| 综艺| 什邡市| 涞源县| 大余县| 沅陵县| 铜陵市| 瓦房店市| 潢川县| 牟定县| 平利县| 信丰县|