v4l2视频捕获示例

时间:2012-02-25 21:36:37

标签: embedded-linux codec mpeg yuv v4l2

这是我在这里发表的第一篇文章,希望能找到一些帮助

我正在使用三星ok6410主板和ov9650 cmos相机上的嵌入式Linux

我必须捕捉视频并将其保存在SD卡上

我想使用一个捕获视频的循环缓冲区,当它已满时,允许新数据覆盖旧的。

有一个标志,当提升时,捕捉持续10秒然后停止。视频保存到SD卡应该包含提升标志前10秒和提升后10秒。

我在这里阅读了v4l2 API规范官方网站上的捕获示例

http://free-electrons.com/kerneldoc/latest/video4linux/API.html

但有些观点我无法理解或不知道我是否理解正确

  1. 在此示例中,有4个帧缓冲区,每个缓冲区可以容纳一个帧。这是对的吗?

  2. 有一个变量(frame_count)被初始化为70,这​​是否意味着通过完成这个程序,我将有一个包含70帧的视频?

  3. fns(主循环)和(读框)有什么作用?我知道他们应该做什么,但无法理解书面代码,loop..etc

  4. 如何在此代码中调整fps?或者我应该在相机寄存器中写入值?

  5. 捕获视频后,我将有一个填充原始数据的缓冲区,我想压缩它或使用编解码器将其保存为MPEG,我可以更改要压缩的像素格式(例如MPEG)而不是YUYV?或者我该怎么做来压缩视频?编解码器还是什么?

  6. 我可以将缓冲区中的这些原始数据写入文件.yuv吗?我找到了一些可以播放这种格式视频的软件。

  7. 是否可以使用循环缓冲区而不是线性缓冲区来保存捕获的视频?

  8. 我知道我的帖子太长了,但我是新手,找不到任何可以帮我编写代码的教程。

    提前致谢

1 个答案:

答案 0 :(得分:6)

您要关联的页面返回404,但是如果您要查看文档,则应检查此https://linuxtv.org/downloads/v4l-dvb-apis/,特别检查此example,这是一个很好的起点你想要什么。

由于我认为我猜到了你所指的代码,我试着回答你的问题

  1. 4帧缓冲区用于进行双缓冲,即您将帧出列并对其进行操作,而其他缓冲区则由视频输入填充
  2. 如果它与我链接的示例相同,那么它只是从输入中抓取70帧然后退出。
  3. read_frame从缓冲区中取消一帧,以便您可以对其进行操作,并在完成后将其重新添加到队列中。
  4. 要调整fps,您需要将帧出列并重新排队到驱动程序而不做任何事情。修改fps是通过跳帧来完成的。
  5. 一般来说,这取决于您的驱动程序和编码器。您需要找到驱动程序和编码器都支持的视频格式(例如V4L2_PIX_FMT_YUYV)。如果它不存在,那么你需要编写自己的颜色空间转换例程。
  6. 当然!我经常这样做。
  7. 我不明白这个问题。