You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:25:32