能否为NodeMediaServer的HTTP服务器添加自定义端点获取全部VOD文件?
问题
我使用NodeMediaServer实现直播推流并存储VOD(视频点播)文件,希望为其内置HTTP服务器添加自定义端点,以获取所有VOD文件。请问这是否可行?还是必须单独运行一个Express服务器?我已知可访问单个文件,但尚未找到获取全部文件的方法。
附上我的代码:
const NodeMediaServer = require('node-media-server'); const { spawn } = require('child_process'); const path = require('path'); const fs = require('fs'); const express = require('express'); const app = express(); app.get('/vods', (req, res) => { res.send('Hello, this is a custom endpoint!'); }); const config = { logType: 3, http_api: 1, rtmp: { port: 1935, chunk_size: 60000, gop_cache: true, ping: 30, ping_timeout: 60 }, http: { port: 8000, allow_origin: '*', mediaroot: 'vods' } }; var nms = new NodeMediaServer(config, app) nms.run();
回答
完全可行,不用单独运行Express服务器。NodeMediaServer本身支持传入自定义Express实例作为第二个参数,你代码里已经这么做了,只需要完善/vods端点的逻辑,读取配置里指定的mediaroot目录下的所有VOD文件即可。
修改后的代码如下:
const NodeMediaServer = require('node-media-server'); const { spawn } = require('child_process'); const path = require('path'); const fs = require('fs').promises; const express = require('express'); const app = express(); // 定义要识别的视频文件扩展名 const VIDEO_EXTENSIONS = ['.mp4', '.flv', '.mov', '.avi']; app.get('/vods', async (req, res) => { try { const mediaRoot = config.http.mediaroot; const files = await fs.readdir(mediaRoot); // 过滤出视频文件,生成包含文件名和访问URL的列表 const vodFiles = files.filter(file => { const ext = path.extname(file).toLowerCase(); return VIDEO_EXTENSIONS.includes(ext); }).map(file => ({ filename: file, url: `http://${req.hostname}:${config.http.port}/${file}` })); res.json({ success: true, vods: vodFiles }); } catch (err) { console.error('读取VOD目录出错:', err); res.status(500).json({ success: false, message: '获取VOD文件列表失败' }); } }); const config = { logType: 3, http_api: 1, rtmp: { port: 1935, chunk_size: 60000, gop_cache: true, ping: 30, ping_timeout: 60 }, http: { port: 8000, allow_origin: '*', mediaroot: 'vods' } }; var nms = new NodeMediaServer(config, app) nms.run();
要点说明
- 使用
fs.promises.readdir异步读取目录,避免阻塞服务 - 通过扩展名过滤文件,确保只返回有效视频文件
- 自动生成每个文件的可访问URL,直接用于播放
- 增加错误捕获和处理,返回清晰的错误信息
启动服务后,访问http://localhost:8000/vods就能拿到所有VOD文件的列表了。
内容的提问来源于stack exchange,提问作者kevin van gils
相关产品推荐
相关产品推荐

