首页 > 解决方案 > 较小的 mp4 文件持续时间

问题描述

我正在通过测量创建一个 60 FPS 的 mp4 文件,该测量为我提供了可变 FPS 的帧。我通过添加相同的帧来做到这一点,直到它给我一个新帧的时间戳。即使是帧数 * FPS 也应该给我一个特定的持续时间,最终文件的持续时间更短。例如,从 8 分钟的持续时间开始,最终文件只有 5 分钟。我使用带有 H264 编解码器的 opencv 3.4.3。为什么会这样?

这是功能:

   void ExporterChannel::ProcessMFCImage(Timestamp _timestamp, const std::string& _filename, const std::string& _data)
{
  static bool first = true;
  static long long accumulated_time_error = 0;
  static long long first_timestamp;

  static structs::SensorNearData::MFC::CameraImage mfc_image_struct;
  static pb::SensorNearData::MFC::CameraImage  mfc_image_pb;

  if (first)
  {
    first = false;
    mfc_image_pb.ParseFromString(_data);
    pb2structs::convert(mfc_image_pb, mfc_image_struct);
    first_timestamp = _timestamp;
    Size frameSize(mfc_image_struct.image_width, mfc_image_struct.image_height);
    bool color_mode_rgb = (config_.color == "true");
    if (color_mode_rgb == true)
    {
      video_file.open(_filename, CV_FOURCC('H', '2', '6', '4'), FPS, frameSize, true);
    }
    else
    {
      video_file.open(_filename, CV_FOURCC('H', '2', '6', '4'), FPS, frameSize, false);
    }
    // check if we succeeded
    if (!video_file.isOpened())
    {
      ExporterException("Could not open the output video file for write\n");
      return;
    }
    HandleMFCImage(mfc_image_struct);
  }
  else
  {
    if ((long long)_timestamp < (first_timestamp + STEP))
    {
      accumulated_time_error += first_timestamp + STEP - (long long)_timestamp;
    }
    else
    {
      while ((long long)_timestamp >= (first_timestamp + 2 * STEP))
      {
        HandleMFCImage(mfc_image_struct);
        first_timestamp += STEP;
      }
      accumulated_time_error += (long long)_timestamp - (first_timestamp + STEP);
      if (accumulated_time_error >= STEP)
      {
        HandleMFCImage(mfc_image_struct);
        accumulated_time_error -= STEP;
      }
    }
    mfc_image_pb.ParseFromString(_data);
    pb2structs::convert(mfc_image_pb, mfc_image_struct);
    first_timestamp = (long long)_timestamp;
    HandleMFCImage(mfc_image_struct);
  }
}

标签: opencv

解决方案


推荐阅读