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

从RTSP流截取MP4片段时FFmpeg偶尔生成损坏数据的问题排查

问题分析与修复方案

核心问题点

  • 重复且错误的RTSP传输配置:你在inputOptions和addOptions里都加了-rtsp_transport tcp,后者会被当成输出选项,而RTSP传输参数属于输入配置,这会导致ffmpeg处理逻辑混乱。
  • 未使用预设的起始时间:代码里定义了startTime但没传给ffmpeg,当前逻辑是从RTSP流的实时当前位置开始截取,而非你想要的过去10秒片段。如果拉流初期未获取到足够帧就触发结束,就会生成仅含文件头的极小文件。
  • 冗余的音频配置:既设置了-an禁用音频,又指定audioCodec: "aac",这会造成ffmpeg内部逻辑冲突,可能导致异常截断。
  • 时长参数的位置与逻辑问题:-t作为输出选项时,若输入流未稳定提供帧,ffmpeg可能提前终止输出,导致片段时长不足或仅含单帧。

对应命令行的错误

你推导的命令行里重复了-rtsp_transport tcp(输出阶段的该参数无效),且缺少了关键的起始时间参数-ss,同时存在-c:a aac和-an的冲突。

修复后的代码

const getCameraVideoSnapshot = (
  rtspUrl: string,
  logger: Logger,
  lengthInSeconds: number
): Promise<Buffer> => {
  return new Promise<Buffer>((resolve, reject) => {
    const bufferStream = new stream.PassThrough();
    const captureVideoCommand = FfmpegCommand(rtspUrl);

    captureVideoCommand
      // 仅在输入阶段设置RTSP传输模式
      .inputOptions([
        "-rtsp_transport tcp",
        // 指定从当前时间往前10秒开始截取(对应你原本的startTime逻辑)
        "-ss -10"
      ])
      .on("error", (err, stdout, stderr) => {
        logger.fatal(stderr);
        console.log(err);
        reject(err);
      })
      .videoCodec("libx264")
      .format("avi")
      .size("640x480")
      // 禁用音频,无需再指定音频编码
      .outputOptions([
        "-an",
        // 控制输出时长
        `-t ${lengthInSeconds}`
      ])
      .writeToStream(bufferStream, { end: true });

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

额外优化建议

  • 添加帧校验逻辑:在bufferStream的end事件中,可检查输出Buffer的大小(比如小于5KB则判定为无效,触发重试),避免上传无效文件。
  • 调整RTSP拉流超时:添加输入选项"-stimeout 5000000"(5秒超时),避免ffmpeg无限等待流数据。
  • 确认输出格式一致性:若实际需要MP4格式,将.format("avi")改为.format("mp4"),同时添加输出选项"-movflags frag_keyframe+empty_moov",确保流式输出的MP4文件可正常播放。

内容的提问来源于stack exchange,提问作者Callum Houghton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:53:17