RTSP 流中的 FFMPEG MP4 片段偶尔会产生损坏的 MP4 数据

RTSP 流中的 FFMPEG MP4 片段偶尔会产生损坏的 MP4 数据

我正在使用响应事件的 node.js fluent-ffmpeg 库,并使用以下代码从 RTSP 流中获取三个剪辑:

const getCameraVideoSnapshot = (
  rtspUrl: string,
  logger: Logger,
  lengthInSeconds: number
): Promise<Buffer> => {
  return new Promise<Buffer>((resolve, reject) => {
    const startTime = new Date();
    startTime.setSeconds(startTime.getSeconds() - 10); // Subtract 3 seconds from the current time

    const bufferStream = new stream.PassThrough();
    const captureVideoCommand = FfmpegCommand(rtspUrl);

    captureVideoCommand
      .inputOptions(["-rtsp_transport tcp"])
      .on("error", (err, stdout, stderr) => {
        logger.fatal(stderr);
        console.log(err);
        reject(err);
      })
      .addOptions(["-rtsp_transport tcp"])
      .audioCodec("aac") // Specify an audio codec (in this case, AAC)
      .videoCodec("libx264") // Use libx264 for H.264 encoding
      .format("avi") // Use MPEG-4 container format
      .size("640x480")
      .outputOptions(["-an"]) // Disable audio recording
      .outputOptions([`-t ${lengthInSeconds}`]) // Set output duration to 3 seconds
      .writeToStream(bufferStream, { end: true });

    // Read the passthrough stream
    const buffers: Uint8Array[] = [];
    bufferStream.on("data", function (buf: Uint8Array) {
      buffers.push(buf);
    });
    bufferStream.on("end", function () {
      const outputBuffer = Buffer.concat(buffers);
      resolve(outputBuffer);
    });
  });
};

我相信 FfmpegCommand 转换为命令行输入:

ffmpeg -rtsp_transport tcp -i input_file \
       -rtsp_transport tcp \
       -c:a aac \
       -c:v libx264 \
       -f avi \
       -s 640x480 \
       -an \
       -t lengthInSeconds \
       - > output_file

90% 的时间里,这一切似乎都运行良好。但有时我会得到一个似乎只包含一帧的 MP4 数据(当它在另一个进程上转换为 GIF 时)。我可以看到,当 MP4 数据上传到 S3 时,文件只有大约 2KB,我假设其中大部分只是 MP4 标头数据。

我还注意到一些 MP4 文件在剪辑的最后跳过了几秒钟,不确定这是否相关。

有人知道我可能哪里出错了吗?

提前致谢!

相关内容