如何使用 MongoDB 编写视频流服务器
你想创建一个视频流应用,并将视频存储在 MongoDB 中吗?如果你只是想了解流式传输部分,我之前用纯 NodeJS 写了另一篇(还算成功)的文章。
但!
如果您还想知道如何将视频存储在 MongoDB 中并通过 NodeJS 从那里进行流式传输,那么这篇文章适合您!
最终结果
就像纯 NodeJS 解决方案一样,我们的最终结果将是一个从服务器流式传输的 HTML5 视频。看看时间轴上的灰色条!那是缓冲!😃
如果您想 git clone 该项目,这里是 repo 的链接https://github.com/Abdisalan/blog-code-examples/tree/master/mongo-http-video
简易模式
如果您已安装 Docker,则可以使用我的 Docker Compose 文件来运行项目,而无需安装任何软件包。您只需运行这些 Docker Compose 命令并将文件bigbuck.mp4
从http-video-stream
文件夹复制到mongo-http-video
文件夹即可。
docker-compose up -d
# When you're done with it, you can tear it down using
docker-compose down -v
该项目将在localhost:8000
本文剩余部分将指导您如何从头开始构建它。尽情享受吧!
第一部分:MongoDB
MongoDB 不支持 Windows 的 Linux 子系统 (WSL),因此如果您想使用 WSL,最好使用 docker。否则,这在 Windows 上应该可以正常工作。
安装 MongoDB,如果你使用的是 Windows,则以下命令(exe 文件)应该位于C:\Program Files\MongoDB\Server\4.4\bin
在该文件夹中打开一个终端或将其添加到您的 PATH 并启动该mongod
进程。
mongod
第 2 部分:设置 Node 项目
在另一个终端中,这些命令将创建一个项目文件夹并启动您的节点项目。
mkdir mongo-video-stream
cd mongo-video-stream
npm init
npm install --save express nodemon mongodb
第 3 部分:index.html
我们需要创建一个带有 HTML5 视频元素的页面,并将源设置为"/mongo-video"
我们的服务器从 mongoDB 流式传输视频的位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HTTP Video Stream From MongoDB</title>
</head>
<body>
<video id="videoPlayer" width="650" controls muted="muted" autoplay>
<source src="/mongo-video" type="video/mp4" />
</video>
</body>
</html>
第四部分:Index.js
让我们设置我们的节点服务器,以便根"/"
端点为我们的 index.html 页面提供服务。
const express = require("express");
const app = express();
app.get("/", function (req, res) {
res.sendFile(__dirname + "/index.html");
});
app.listen(8000, function () {
console.log("Listening on port 8000!");
});
第五部分:package.json——运行我们的服务器
添加一个start
脚本,以便我们可以使用命令package.json
运行我们的服务器。npm start
{
"scripts": {
"start": "nodemon index.js"
}
}
现在你应该可以运行了npm start
。打开浏览器,然后访问http://localhost:8000
看看是否成功!
中途办理登机手续
你还好吗?喝点水,调整一下姿势,放松一下肩膀😁
您即将进入精彩部分!
第六部分:index.js(上传)
我们添加了一个端点,用于将本地视频上传到 MongoDB。我使用的视频文件bigbuck.mp4
可以在我的 GitHub 上找到:https://github.com/Abdisalan/blog-code-examples/tree/master/http-video-stream
但是您可以使用自己的视频文件!
const express = require("express");
const app = express();
const fs = require("fs");
const mongodb = require('mongodb');
const url = 'mongodb://localhost:27017';
app.get("/", function (req, res) {
res.sendFile(__dirname + "/index.html");
});
// Sorry about this monstrosity -- just for demo purposes
app.get('/init-video', function (req, res) {
mongodb.MongoClient.connect(url, function (error, client) {
if (error) {
res.json(error);
return;
}
// connect to the videos database
const db = client.db('videos');
// Create GridFS bucket to upload a large file
const bucket = new mongodb.GridFSBucket(db);
// create upload stream using GridFS bucket
const videoUploadStream = bucket.openUploadStream('bigbuck');
// You can put your file instead of bigbuck.mp4
const videoReadStream = fs.createReadStream('./bigbuck.mp4');
// Finally Upload!
videoReadStream.pipe(videoUploadStream);
// All done!
res.status(200).send("Done...");
});
});
app.listen(8000, function () {
console.log("Listening on port 8000!");
});
保存 index.js 文件后,服务器应该会重启(因为我们使用的是 nodemon)。视频准备好后,你可以localhost:8000/init-video
在浏览器中访问,它应该已经将本地文件上传到 mongodb 了!
快到了!
如果您想再次检查文件是否已上传,请打开另一个终端并连接到 mongodb。
mongo
然后转到视频数据库并通过 GridFS 统计集合中的文档数量fs.files
。
use videos
db.fs.files.count()
计数应该是您访问过的次数,localhost:8000/init-video
因为每次加载时它都会上传我们的视频文件/init-video
。
第七部分:index.js(流式传输)
最后,我们将添加/mongo-video
端点来传输我们的视频!
app.get("/mongo-video", function (req, res) {
mongodb.MongoClient.connect(url, function (error, client) {
if (error) {
res.status(500).json(error);
return;
}
// Check for range headers to find our start time
const range = req.headers.range;
if (!range) {
res.status(400).send("Requires Range header");
}
const db = client.db('videos');
// GridFS Collection
db.collection('fs.files').findOne({}, (err, video) => {
if (!video) {
res.status(404).send("No video uploaded!");
return;
}
// Create response headers
const videoSize = video.length;
const start = Number(range.replace(/\D/g, ""));
const end = 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",
};
// HTTP Status 206 for Partial Content
res.writeHead(206, headers);
// Get the bucket and download stream from GridFS
const bucket = new mongodb.GridFSBucket(db);
const downloadStream = bucket.openDownloadStreamByName('bigbuck', {
start
});
// Finally pipe video to response
downloadStream.pipe(res);
});
});
});
保存文件并localhost:8000
再次播放,视频就可以播放了!
结论
有了它,您可以制作自己的基本 YouTube 或 Netflix 应用程序!
想要了解其工作原理的深入逐行解释,请观看我的 YouTube 视频。
这是关于如何实现这一点的基本概述,如果您想要了解有关这些主题(mongodb、流理论)的深入博客文章,请随时在下面发表评论!
祝您直播愉快!✌
免责声明
你可能不应该在生产中使用它,因为它不是最优化的架构😋
鏂囩珷鏉ユ簮锛�https://dev.to/abdisalan_js/how-to-stream-video-from-mongodb-using-nodejs-4ibi