【问题标题】:Synchronizing screencasting (ffmpeg) and capturing from the webcam (OpenCV)同步截屏(ffmpeg)和从网络摄像头捕获(OpenCV)
【发布时间】:2011-02-28 04:36:18
【问题描述】:

根据我之前的问题,我正在尝试构建一个简单的眼动仪。决定从Linux版本开始(运行Ubuntu)。

要完成这项任务,您应该组织截屏和网络摄像头捕获,使两个流中的帧完全匹配,并且每个流中的帧数完全相同。

屏幕播放 fps 完全取决于相机的 fps,因此每次我们从网络摄像头获取图像时,我们都可能会抓取屏幕帧并保持快乐。但是,所有用于快速投屏的工具,例如 ffmpeg,都会返回 .avi 文件作为结果,并且需要启动已知的 fps。

另一方面,Java+Robot 或 ImageMagick 之类的工具似乎需要大约 20 毫秒才能返回 .jpg 屏幕截图,这对于这项任务来说相当慢。但可能会在每次抓取网络摄像头帧并提供所需的同步后立即请求它们。

所以子问题是:

  1. USD 相机的帧速率在单个会话期间会发生变化吗?
  2. 是否有任何工具可以逐帧提供快速截屏?
  3. 有什么方法可以让ffmpeg只在程序发起这个请求时才将新帧推送到.avi文件?

对于我的任务,我可以使用 C++ 或 Java。

实际上,我是一个界面设计师,而不是驱动程序程序员,而且这个任务似乎相当低级。如有任何建议和提示,我将不胜感激!

【问题讨论】:

  • 您的意思是 fps(每秒帧数),而不是 fsp,对吗?
  • 用 USB 代替美元?

标签: java c++ opencv ffmpeg


【解决方案1】:

使用 OpenCV 的 HighGUI 中的 cvGetCaptureProperty(CvCapture* capture, int property_id) 函数和 property_id = CV_CAP_PROP_FPS 来确定网络摄像头每秒捕获的帧数。

使用示例:

CvCapture *capture = 0;
double fps = 0.0;

capture = cvCaptureFromCAM( 0 );
fps = cvCaptureProperty(capture, CV_CAP_PROP_FPS);

【讨论】:

  • 好主意,但是在这种情况下,您建议如何组织同步精确匹配捕获?我应该使用两个线程吗?或者只是在收到来自网络摄像头的第一帧并且我们知道 fps 后立即初始化 ffmpeg 捕获器?欢迎任何建议,谢谢!
  • 不确定 ffmpeg,但您可以使用 cvCreateVideoWriter() 函数创建一个带有视频源的 .avi 文件,使用 cvGrabFrame() 函数循环提取每一帧并将其写入视频带有cvWriteFrame() 的文件。在同一个循环中,您可以从屏幕中提取图像并将其写入另一个视频文件。我相信,如果您将投屏者的 FPS 设置为与摄像头的 FPS 相同,您将实现同步。
  • Metaliving,我已经尝试过您的方法,但不幸的是,CV_CAP_PROP_FPS 属性仅适用于 Windows,如 OpenCV 文档中所述。错误是:HIGHGUI ERROR: V4L2: getting property #5 is not supported。我在 Ubuntu 下工作,也希望我的项目是跨平台的,所以必须寻找另一种方式来实现它。顺便说一句,您的代码有一个错误:那里应该有 cvGetCaptureProperty(不是 cvCaptureProperty)。不管怎样,谢谢你们的cmets!
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多