MongoDB 在 Node/Express 上展示 BASE64 视频
在本文中,我们将介绍如何在 Node.js 和 Express 上使用 MongoDB 存储和展示 BASE64 编码的视频文件。
阅读更多:MongoDB 教程
1. 设置环境
在开始展示视频之前,我们需要确保环境中已经安装了以下组件:
- Node.js:用于运行 JavaScript 代码的运行时环境。
- Express.js:用于搭建 Web 应用程序的框架。
- MongoDB:用于存储和管理数据的非关系型数据库。
2. 准备数据库
首先,我们需要创建一个 MongoDB 数据库,并且在其中创建一个集合来存储视频文件的相关信息。可以使用 MongoDB 客户端进行操作,或者在 Node.js 中使用官方的 MongoDB 驱动程序。
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'videoDB';
MongoClient.connect(url, function(err, client) {
console.log("Connected successfully to server");
const db = client.db(dbName);
db.createCollection('videos', function(err, res) {
console.log("Collection created");
client.close();
});
});
在上述代码中,我们通过 MongoClient
连接到 MongoDB,并创建了一个名为 videoDB
的数据库。然后,我们在该数据库中创建了一个名为 videos
的集合,用于存储视频文件的信息。
3. 上传视频文件
在 Express.js 中,我们可以使用 multer
中间件来处理文件上传。首先,需要通过 npm 下载 multer
:
npm install multer
然后,我们可以编写以下代码来处理视频文件的上传:
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
const extension = path.extname(file.originalname);
cb(null, Date.now() + extension);
}
});
const upload = multer({ storage: storage });
app.post('/upload', upload.single('video'), function(req, res) {
const file = req.file;
console.log(file);
res.send('File uploaded successfully');
});
app.listen(3000, function() {
console.log('Server is running on port 3000');
});
在上述代码中,我们创建了一个 Express 应用程序,并设置了文件上传的路径为 uploads/
。通过 multer.diskStorage
配置了文件保存的方式,使用时间戳作为文件名保存到服务器上。然后,在路由 /upload
中,通过 upload.single('video')
处理上传的视频文件,并将该文件信息存储在 req.file
中。
4. 将视频信息存储到 MongoDB
在上传视频文件后,我们需要将相关信息存储到 MongoDB 中。我们可以使用官方的 MongoDB 驱动程序来完成这个任务。以下是一个示例代码:
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'videoDB';
MongoClient.connect(url, function(err, client) {
const db = client.db(dbName);
const video = {
name: 'video1',
path: 'uploads/1614767206012.mp4'
};
db.collection('videos').insertOne(video, function(err, res) {
if (err) throw err;
console.log("1 document inserted");
client.close();
});
});
在上述代码中,我们通过 MongoClient
连接到 MongoDB,并将视频的名称和保存路径存储在一个 video
对象中。然后,我们通过 db.collection('videos').insertOne(video)
将视频信息插入到 videos
集合中。
5. 展示 BASE64 视频
要在浏览器中展示 BASE64 编码的视频,我们需要将该视频编码转换为可供浏览器直接播放的格式。我们可以使用 ffmpeg
和 createReadStream
来实现这个转换过程。
首先,需要安装 ffmpeg
:
brew install ffmpeg
然后,我们可以编写以下代码来将视频转换为 BASE64 编码:
const { createReadStream } = require('fs');
const { spawn } = require('child_process');
const videoPath = 'uploads/1614767206012.mp4';
// 调用 ffmpeg 进行视频转换
const ffmpeg = spawn('ffmpeg', [
'-i',
videoPath,
'-c:v',
'libx264',
'-preset',
'ultrafast',
'-c:a',
'aac',
'-b:a',
'128k',
'-f',
'mp4',
'pipe:1'
]);
// 将转换后的视频转换为 BASE64 编码
const chunks = [];
ffmpeg.stdout.on('data', (chunk) => {
chunks.push(chunk);
});
ffmpeg.stdout.on('end', () => {
const videoData = Buffer.concat(chunks).toString('base64');
console.log(videoData);
});
在上述代码中,我们使用 createReadStream
创建一个可读流,读取视频文件的内容。然后,通过 spawn('ffmpeg', [...])
调用 ffmpeg
命令进行视频转换,将转换后的视频内容存储在 chunks
数组中。最后,通过 Buffer.concat(chunks).toString('base64')
将视频内容转换为 BASE64 编码。
6. 将 BASE64 视频展示到前端
在 Express.js 中,我们可以使用以下代码将 BASE64 编码的视频发送到前端:
app.get('/video/:videoId', function(req, res) {
const videoId = req.params.videoId;
MongoClient.connect(url, function(err, client) {
const db = client.db(dbName);
db.collection('videos').findOne({ _id: ObjectId(videoId) }, function(err, result) {
if (err || !result) {
res.status(404).send('Video not found');
} else {
const videoPath = result.path;
const readStream = createReadStream(videoPath);
readStream.pipe(res);
}
client.close();
});
});
});
在上述代码中,我们根据 videoId
查询 MongoDB 中的视频信息,并通过 result.path
获取视频文件的保存路径。然后,使用 createReadStream
创建一个可读流并将其传输到响应。
总结
在本文中,我们介绍了如何在 Node.js 和 Express 上展示 BASE64 编码的视频。我们学习了如何在 MongoDB 中存储视频文件的相关信息,如何使用 multer 中间件处理文件上传,以及如何使用 ffmpeg 进行视频转换和展示。通过这些步骤,我们可以实现一个功能完善的视频展示功能,满足基本的需求。