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

如何在rtsp-multi-stream@0.2.1包中获取流运行状态?

获取RTSP流运行状态的解决方案

针对你用VideoStream包处理RTSP流、需要获取状态用于前端错误提示的需求,可从以下几个方向入手:

1. 监听包的内置事件

大多数RTSP转流库会内置状态相关的事件,直接监听这些事件就能实时获取状态变化:

import { VideoStream } from '../src/video-stream';

const streamer = new VideoStream({
    debug: true,
    wsPort: 9999,
    ffmpegPath: 'ffmpeg',
    ffmpegArgs: {
        '-b:v': '2048K',
        '-an': '',
        '-r': '24',
    },
});

// 监听流启动事件
streamer.on('stream-started', () => {
  console.log('RTSP流已正常启动');
  // 这里可通过WebSocket/API同步状态到前端,标记为「运行中」
});

// 监听流错误事件
streamer.on('error', (err) => {
  console.error('RTSP流异常:', err);
  // 同步状态到前端,展示错误提示
});

// 监听流停止事件
streamer.on('stream-stopped', () => {
  console.log('RTSP流已停止');
  // 同步状态到前端,标记为「已停止」
});

streamer.start();

2. 检查FFmpeg子进程状态

VideoStream依赖FFmpeg处理流,liveMuxers里的每个实例通常会关联FFmpeg的子进程对象,可通过检查进程状态判断流是否正常运行:

setInterval(() => {
  const liveStreams = [...streamer.liveMuxers.values()];
  liveStreams.forEach(stream => {
    if (stream.process) {
      // 进程exitCode为null表示正在运行
      const isRunning = stream.process.exitCode === null;
      console.log(`当前流状态: ${isRunning ? '运行中' : '已停止'}`);
      // 将状态同步到前端
    }
  });
}, 3000); // 每3秒检查一次

还可以监听FFmpeg的stderr输出,捕获连接失败、数据异常等具体错误:

// 在启动流后,获取对应muxer的进程
setTimeout(() => {
  const stream = [...streamer.liveMuxers.values()][0];
  if (stream?.process) {
    stream.process.stderr.on('data', (data) => {
      const log = data.toString();
      // 匹配常见的RTSP错误关键词
      if (log.includes('Connection refused') || log.includes('Invalid data found')) {
        console.error('RTSP流连接失败:', log);
        // 同步错误状态到前端
      }
    });
  }
}, 1000);

3. 修改包源码添加状态属性

如果包本身没有暴露状态API,可直接修改src/video-stream.js的VideoStream类,添加状态管理逻辑:

// 在VideoStream类的构造函数中初始化状态
class VideoStream {
  constructor(options) {
    // 原有初始化代码
    this.streamStatus = 'idle'; // 可选值: idle/running/error/stopped
  }

  start() {
    // 原有启动逻辑...
    // 当FFmpeg进程成功启动后更新状态
    const muxer = /* 对应FFmpeg进程的muxer实例 */;
    if (muxer.process) {
      this.streamStatus = 'running';
      this.emit('status-update', this.streamStatus);

      // 监听进程错误
      muxer.process.on('error', () => {
        this.streamStatus = 'error';
        this.emit('status-update', this.streamStatus);
      });

      // 监听进程退出
      muxer.process.on('exit', () => {
        this.streamStatus = 'stopped';
        this.emit('status-update', this.streamStatus);
      });
    }
  }
}

修改后,你就可以直接通过streamer.streamStatus获取当前状态,或监听status-update事件获取实时变化。

内容的提问来源于stack exchange,提问作者Richard David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:36:30