Node.js视频流应用创建之后端的全过程

 更新时间:2022年03月17日 15:52:04   作者:天行无忌  
这篇文章主要给大家介绍了关于创建Node.js视频流应用之后端的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

在本文中,将展示一个非常简单的 Node.js 应用程序,用于在线流媒体视频传输。本文仅涵盖后端,在下一部分中,将使用 Vue.js 创建前端。话不多说,下面开始进入主题。

源码地址:github.com/QuintionTan…

初始化

创建项目文件夹 vue-video-stream ,进入文件夹,再创建文件夹 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 必须指向要继续进行流媒体传输的服务器端点。

注意:这里的 index.html 文件主要用于演示后台服务,后续将会使用 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 路由和控制器逻辑,作为索引路由,还需要发送这个 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 创建文件夹 routes ,在文件夹中创建脚本文件 index.js ,代码如下:

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

在目录 express-service 创建文件夹 controller ,在文件夹中创建脚本文件 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 是当前在视频缓冲区中的部分)。如果range不存在,抛出一个错误。否则,在文件系统中找到该文件。

然后,设置要随每个并发请求发送的块大小(代码中设置为 1 MB , Math.pow(10,6) 或简单的 10 ** 6)。然后定义开始和结束变量,start 变量决定了发送的视频的起点,对于 end 变量,需要确定 (start +chunk) 或视频大小长度之间的最小值,避免超出。

最后,确定实际发送的内容长度,内容长度是开始值和结束值之间的差异。然后使用刚刚在它上面计算的值生成的 headers 对象。在代码的最后一部分,发送一个内容响应 (206),它是 express 框架的一部分,并使用 fs(Node.js 核心)模块将该响应与读取流进行管道传输。

现在来启动服务,执行如下:

npm run start

如果是要调试代码,避免手动重启,可以执行一下命令:

npm run debug

这样在修改 js 代码后服务将会自动重启。

启动后在浏览器中输入 http://127.0.0.1:8100/,就可以看到如下效果:

在下一部分中,将使用 Vue.js 设计前端《VUE创建视频流应用》。

总结

到此这篇关于创建Node.js视频流应用之后端的文章就介绍到这了,更多相关Node.js视频流应用后端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 从零开始在webstorm配置nodejs

    从零开始在webstorm配置nodejs

    WebStorm是作为JS开发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博客项目开发手记

    node.js博客项目开发手记

    本篇文章给大家总结了node.js博客项目开发的相关步骤以及知识点分享,有兴趣的朋友参考下。
    2018-03-03
  • 详解node.js 下载图片的 2 种方式

    详解node.js 下载图片的 2 种方式

    本文通过实例代码给大家介绍了node.js 下载图片的 2 种方式及下载远程图片的实现代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • 深入解析nodejs HTTP服务

    深入解析nodejs HTTP服务

    本篇文章主要介绍了深入解析nodejs HTTP服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论