Node.js MJPEG流在Firefox中工作,但在Chrome中不工作

Node.js MJPEG流在Firefox中工作,但在Chrome中不工作,node.js,typescript,ffmpeg,video-streaming,mjpeg,Node.js,Typescript,Ffmpeg,Video Streaming,Mjpeg,我们有一个包含摄像头的系统,我们希望将摄像头传输到多个客户端。 在服务器的后台,我们从摄像头获得连接,我们将与该摄像头相关的所有内容保存在一个CameraContainer中,该容器还包括一个mpegtsToMjpegStream,该流扩展了双工(可读和可写流) 摄像机连接后,我们打开一个ffmpeg进程来处理传入的mpegts流,并输出一个MJPEG流: '-map', '0:v', '-c:v', 'mjpeg','-f', 'mjpeg', `-`, **我们这样做是因为我们

我们有一个包含摄像头的系统,我们希望将摄像头传输到多个客户端。 在服务器的后台,我们从摄像头获得连接,我们将与该摄像头相关的所有内容保存在一个CameraContainer中,该容器还包括一个mpegtsToMjpegStream,该流扩展了双工(可读和可写流)

摄像机连接后,我们打开一个ffmpeg进程来处理传入的mpegts流,并输出一个MJPEG流:

      '-map', '0:v', '-c:v', 'mjpeg','-f', 'mjpeg', `-`,
**我们这样做是因为我们也映射到其他输出,比如写文件


在“服务”方面,我们目前正在测试一个简单的API,以获得带有摄像头id的mjpeg流:

  async getCameraStream(@Param('cameraId') cameraId: string, @Res() res): Promise<any> {
const cameraContainer = this.cameraBridgeService.getCameraContainer(cameraId);
if (!cameraContainer) {
  throw new Error(`Camera with id: ${cameraId} was not found`);
}

if (!cameraContainer.mpegtsToMjpegStream) {
  throw new Error('ERROR: mpegtsToMjpegStream stream does not exist on this camera container');
}

const writable = new Writable({
  write: (chunk, encoding, callback) => {
    res.write(`Content-Type: image/jpeg\r\nContent-Length: ${chunk.length}\r\n\r\n`);
    res.write(chunk);
    res.write('\r\n--ffmpeg_streamer\r\n');
    callback();
  },
});

res.set('Content-Type', 'multipart/x-mixed-replace;boundary=ffmpeg_streamer');
res.write('--ffmpeg_streamer\r\n');

cameraContainer.mpegtsToMjpegStream.pipe(writable, { end: false });

res.once('close', () => {
  if (cameraContainer.mpegtsToMjpegStream && writable) {
    cameraContainer.mpegtsToMjpegStream.unpipe(writable);
  }
  res.destroy();
});
async getCameraStream(@Param('cameraId')cameraId:string,@Res()Res):承诺{
const cameraContainer=this.camerarbridgeservice.getCameraContainer(cameraId);
如果(!cameraContainer){
抛出新错误(`Camera with id:${cameraId}未找到`);
}
if(!cameraContainer.mpegtsToMjpegStream){
抛出新错误(“错误:此摄影机容器上不存在mpegtsToMjpegStream流”);
}
常量可写=新可写({
写入:(区块、编码、回调)=>{
res.write(`Content Type:image/jpeg\r\n内容长度:${chunk.Length}\r\n\r\n`);
res.write(块);
res.write('\r\n--ffmpeg_streamer\r\n');
回调();
},
});
res.set('Content-Type','multipart/x-mixed-replace;boundary=ffmpeg_拖缆');
res.write('--ffmpeg_拖缆\r\n');
cameraContainer.mpegtsToMjpegStream.pipe(可写,{end:false});
res.once('close',()=>{
if(cameraContainer.mpegtsToMjpegStream&可写){
cameraContainer.mpegtsToMjpegStream.unpipe(可写);
}
res.destroy();
});

问题是,当使用Firefox访问流时,该代码工作得非常好——1-2秒后,我们得到了一个稳定、高质量、低延迟的流。 然而,在Chrome浏览器中,同样的代码不起作用——视频输出被破坏,一直消失在黑屏上,我们必须不断刷新页面,只是为了查看流的几秒钟,直到它再次消失

关于为什么会发生这种情况以及我如何解决它,有什么建议吗