every-every-day

导航

 

1.描述:通过openCV多线程读取展示保存视频中,保存视频线程创建writer对象失败。

原因:多线程中保存线程运行后,但读取视频线程还没有运行,导致无法创建writer对象。

解决方法:在创建writer对象之前使用条件变量std::condition_variable.wait(lock),直到读取视频线程读取到视频帧的时候,唤醒保存视频线程。

std::condition_variable con_var;
void videoCaptureThread()
{
  //获取到视频帧后
  con_var.notify_one();
}
void videoSaveThread()
{
	std::unique_lockstd::mutex lock(frameMutex);
	con_var.wait(lock);
	......
}

2.描述:展示和保存视频会掉帧。

问题:读取视频帧到一个队列,展示和保存线程取帧也是使用一个队列就导致了所有的帧一半用来展示,一半用来保存。

解决:暂时的解决办法是开两个队列,分别用来展示和保存。

3.描述:由于我在main函数里添加了以下代码,但保存的视频时间并不足该时长,是由于这个计时是从运行main函数开始就计时了。但是修改以下代码中的时长后,保存视频的时长不变。

// 运行一定时间后停止线程
std::this_thread::sleep_for(std::chrono::seconds(70));
stopThreads = true;

原因:未知

解决:将保存视频线程里创建writer对象中的编码格式从cap.get(cv::CAP_PROP_FOURCC)更改为cv::VideoWriter::fourcc('M', 'P', '4', 'V')

posted on 2024-01-19 16:56  酒不醉人人自醉  阅读(60)  评论(0)    收藏  举报