由于MP4 是兼容性最好的视频格式,尤其是在跨浏览器支持方面。为了确保最大程度的兼容性,将客服端上传的视频文件都转换为MP4,下面就分享在nodejs中使用ffmpeg将视频文件转换为MP4格式的方法。
1.电脑安装ffmpeg
ffmpeg是什么呢,
- 一个免费开源的视频转换工具
- 一款音视频编解码工具
- 一组音视频编解码开发套件
可去ffmpeg官方网站前往下载,按照自己的操作系统选择下载,另一个下载点
下载的是一个压缩包ffmpeg7.0-essentials_build.zip
文件,解压后,打开bin文件夹,如下图
主要是ffmpeg.exe
文件
在对应的文件夹下,鼠标右键选择打开CMD终端,然后执行以下命令
.\ffmpeg -version
2.Nodejs安装ffmpeg
nodejs需要安装的依赖:
- multer:处理文件上传
fluent-ffmpeg
:FFmpeg 的 Node.js 封装库
npm install express multer fluent-ffmpeg
后端代码示例:
const express = require('express');
const multer = require('multer');
const ffmpeg = require('fluent-ffmpeg');
//本机电脑ffmpeg.exe的所在处
const ffmpegPath = path.join('e:','program','ffmpeg-7.0.2-essentials_build','bin','ffmpeg.exe');
const path = require('path');
const fs = require('fs');
// 设置 FFmpeg 的路径
ffmpeg.setFfmpegPath(ffmpegPath );
//服务器地址
const baseURL = 'http://127.0.0.1:3000/'
const app = express();
// 配置 multer 来处理文件上传
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname));
}
});
const upload = multer({ storage: storage });
// 上传视频的接口
app.post('/upload', upload.single('video'), (req, res) => {
const file = req.file;
const filePath = path.join(__dirname, 'uploads', file.filename);
const outputFilePath = path.join(__dirname, 'uploads', `${Date.now()}.mp4`);
//文件为视频文件
if(file.mimetype.startsWith('video')){
if(path.extname(file.filename).toLowerCase() === '.mp4'){
//视频文件是MP4格式的
res.send({ code:1,msg:'上传成功',data:`${baseURL}${file.filename}`});
}else{
//视频文件是其他格式的
// 如果不是 MP4,使用 FFmpeg 转换为 MP4
ffmpeg(filePath)
.output(outputFilePath)
.on('end', () => {
// 删除原始文件
fs.unlinkSync(filePath);
// 返回转换后的 MP4 文件的 URL
res.send({ code:1,msg:'上传成功',data:`${baseURL}${path.basename(outputFilePath)}`});
})
.on('error', (err) => {
console.error('Error:', err);
res.cc(0,'上传');
})
.run();
}
}else{
//其他文件(照片等)
res.send({ code:1,msg:'上传成功',data:`${baseURL}${req.file.filename}`});
}
});
// 提供上传后的文件访问
app.use('/uploads', express.static('uploads'));
app.listen(3000, () => {
console.log('Server started on port 3000');
});
说明:
- 文件上传与存储:
- 使用
multer
来处理上传的文件并存储在uploads
目录中。
- 使用
- 格式判断与转换:
- 使用
path.extname(file.filename)
获取文件扩展名。 - 如果扩展名为
.mp4
,则直接返回上传的 MP4 文件 URL。 - 如果不是 MP4,使用 FFmpeg 将文件转换为 MP4 格式,转换完成后删除原始文件,并返回转换后的视频 URL。
- 使用
- 静态文件访问:
- 使用
express.static
提供上传文件的静态访问。
- 使用
- ffmpegPath路径:
- 要填本机电脑ffmpeg.exe的路径地址
3.注意事项
- 视频格式兼容性:FFmpeg 支持多种视频格式,几乎可以转换大多数常见的格式(如 AVI、MOV、WMV、FLV 等)。
- 服务器性能:视频格式转换会占用服务器资源,特别是处理大型视频时。因此,确保服务器有足够的性能来处理这些任务,或者将视频处理任务交给专门的视频处理服务。
- 文件清理:在转换完成后,要确保删除原始文件,避免服务器存储空间被占满。