在 opencv 中录制视频仅 30 秒
Posted
技术标签:
【中文标题】在 opencv 中录制视频仅 30 秒【英文标题】:Record a video in opencv only for 30 secs 【发布时间】:2013-05-22 14:04:55 【问题描述】:如何在 opencv 中仅录制 30 秒的视频。我使用了下面的代码,但它只录制了 24 秒的视频?有什么问题?
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/contrib/contrib.hpp"
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <stdlib.h>
#include <time.h>
using namespace cv;
using namespace std;
int ex = 1734701162;
int main( int argc, const char** argv )
VideoCapture cap(0);
int i_fps = 15;
time_t start = time(0);
string OutputVideoPath = "output.mov";
VideoWriter outputVideo(OutputVideoPath, ex, i_fps, Size(640,480), true);
if(!cap.isOpened())
cout << "Not opened" << endl; // check if we succeeded
return -1;
while ( 1 )
Mat frame;
cap >> frame;
outputVideo << frame;
if ( difftime( time(0), start) == 30) break;
outputVideo.release();
cap.release();
return 0;
【问题讨论】:
【参考方案1】:这里有两件事:
您正在检查墙上时间。 difftime 返回一个双精度值,因此您不太可能得到 exactly 30 作为结果。改为这样:if ( difftime( time(0), start) >= 30) break;
您为 VideoWriter 指定 15fps,但您测量的时间是播放(和写入)视频所花费的时间。 (这完全是任意的)
如果您的输入视频是以不同于 15fps 的帧速率录制的,您必须自己通过丢弃或复制帧来处理该比率。
如果你到达30 * 15
,你最好数帧并停止。
【讨论】:
您好,我查过了。现在我得到 30 秒的视频。但捕获在 30 秒前结束。即,exe 在 30 秒内完成运行。我不能两个都沉下去吗?我有需要做的。所以请指教。 请注意,播放不与任何时钟同步。您测量的时间用于检索和编写框架。您的机器似乎需要超过 30 秒才能处理 30 秒。一段视频,就是这样。那就去计算帧数吧! 长话短说:恕我直言,对播放/写入过程进行计时的想法一开始就是个坏主意。它与录制的视频序列无关以上是关于在 opencv 中录制视频仅 30 秒的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 和 macOS 上的 Safari 中使用网络摄像头录制视频?