如何在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
相关产品推荐
相关产品推荐

