OpenCV,可以'不要为长记录发布CAP_OPENCV_MJPEG VideoWriter



Hi-stackoverflow社区,我最近在opencv VideoWriter的性能方面遇到了问题(请参阅此处(,现在我使用cv::CAP_opencv_MJPEG作为后端,而不是cv::CAP_FFMPEG。现在我正在运行另一个问题,所以我的代码看起来像这样:

cv::VideoWriter videoWriter(path, cv::CAP_OPENCV_MJPEG, fourcc, fps, *size);
videoWriter.set(cv::VIDEOWRITER_PROP_QUALITY, 100);
int id = metaDataWriter.insertNow(path);
while (this->isRunning) {
while (!this->stackFrames.empty()) {
cv:Mat m = this->stackFrames.pop();
videoWriter << m;
}
}
videoWriter.release();

这个循环在一个单独的线程中运行;isRunning"将从外部切换。有一个带有cv::Mat(stackFrames(的堆栈,它由另一个线程填充,该线程通过视频捕获卡捕获图像。这很好,但如果文件大小太大,几GB,当调用videoWriter.release((时,我会得到以下错误:

在抛出"cv::Exception"的实例后调用terminatewhat((:OpenCV(4.4.0(/home/michael gary/OpenCV/OpenCV/modules/videio/src/container_avi.cpp:27:错误:(-211:其中一个参数的值超出范围(写入avi文件失败:块大小超出函数"safe_int_cast"的范围

我试图将视频容器从.avi更改为.mmv、.mp4、.mpg,但它们都不起作用,甚至无法创建文件。只有.avi在工作,但发布时失败了。现在我将尝试编写多个文件,这样我就不会遇到这个问题,但我想面对这个问题本身。开放接受任何建议

BR Michael

AVI文件的大小实际上是有限的。

当你强迫它使用OPENCV_MJPEG时,它只会使用OPENCV自己的编写方法,只能做AVI和MJPEG。

如果需要不同的容器,则必须使用不同的后端,例如FFMPEG。您仍然可以使用MJPG作为编解码器(fourcc(。

最新更新