opencv - 较小的 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);
}
}
解决方案
推荐阅读
- c++ - c++错误:没有匹配函数调用'std::__cxx11::basic_string
::附加 (整数,整数)' - unity3d - App Bundle 密钥库丢失,如何在 Unity 中重置
- ios - SwiftUI:TabView 的问题
- shell - Shell中命令的管道输出,如何重定向而不将其保存在文件中?
- reactjs - 反应:我如何路由到另一个页面,例如'./login'和'./sign_up'作为整个页面
- javascript - 如何在 reactJs 中显示实时摄像头提要
- python - Python:正则表达式并替换随机子字符串
- git - Git 使用了错误的身份(.ssh/config 文件未读取?)
- azure-language-understanding - 无法删除 LUIS 帐户
- python - 基于 sqlite DB 值的 Python 依赖组合框