video4linux--1

1。 video for linux 现在是第2版
 
2。 号称是支持multiple opens,当然前提是这多个open最好不要是在都要进行数据传输的情况下的,比如一个process可以控制它的一些参数,一个process在进行在线的video recoding。
 
3。 Shared Data Streams
  数据流的共享,建议是在应用级去实现,在底层我们用一个proxy单独去管理获取数据,再上层,多个人去与proxy通信,达到数据流的共享。与底层透明。
 
4。主要使用的操作就是open, close, ioctl
 
5. Querying Capabilities
 虽然这是个标准,但不是强制性的,因此不同的设备对功能的支持不同,所以地提供一个功能查询机制,而这个功能查询机制应该是必需的。All V4L2 drivers must support VIDIOC_QUERYCAP. Applications should always call this ioctl after opening the device
 
6。Application Priority
  既然允许multiple opens,那么不同的任务之间应该有个优先级,来处理一些具有conflict的情况,可以使用 VIDIOC_S_PRIORITYVIDIOC_G_PRIORITY 的ioctl操作分别来设置和查询当前任务的优先级。据个例子,如果你要通过 VIDIOC_S_INPUT修改driver的属性,你可能由于已经存在了另一个具有较高优先级的任务而导致,你这次修改失败,你总不能把高优先级的任务影响了吧。
 
7。Video Inputs and Outputs
  一个device可以接好多个connectors,如RGB,DVI, CVBS, S-Video接口,因此它有多个输入或输出,那么有几个可用,当前在用哪个?他是什么类型呢?这些都是可以查看的。下面是CVBS的概念:

中文解释:复合视频广播信号 或 复合视频消隐和同步
全称:Composite Video Broadcast Signal 或Composite Video Blanking and Sync

它是的一个模拟电视节目(图片)信号在与声音信号结合,并调制到射频载波之前的一种格式。
CVBS是"Color, Video, Blank and Sync", "Composite Video Baseband Signal", "Composite Video Burst Signal", or "Composite Video with Burst and Sync".的缩写

CVBS 是被广泛使用的标准,也叫做基带视频或RCA视频,是全国电视系统委员会(NTSC)电视信号的传统图像数据传输方法,它以模拟波形来传输数据。复合视频包含色差(色调和饱和度)和亮度(光亮)信息,并将它们同步在消隐脉冲中,用同一信号传输。  
在 快速扫描的NTSC电视中,甚高频(VHF)或超高频(UHF)载波是复合视频所使用的调整振幅,这使产生的信号大约有6MHz宽。一些闭路电视系统使用 同轴电缆近距离传输复合视频,一些DVD播放器和视频磁带录像机(VCR)通过拾音插座提供复合视频输入和输出,这个插座也叫做RCA连接器。
复 合视频中,色差和亮度信息的干涉是不可避免的,特别是在信号微弱的时候。这就是为何远距离的使用VHF或UHF的NTFS电视台用老旧的鞭形天线,“兔子 耳朵”,或世外的“空中”经常包含假的或上下摇动的颜色。CVBS又叫RCA是一种比较低级的模拟信号的传输标准,用一条线传输视频,亮度和色度混合,失 真严重,我们常看到的三接头的电视中的黄色接头就是CVBS接头,其他两个对应2个声道的音频。注意,色度应该是可以分离出色差和饱和度信号的,具体有待 进一步研究。

    言归正传,我们可以通过VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT 分别列举一个input或者output的信息,我们使用一个v4l2_input结构体来乘放查询结果,这个结构体中有一个index域用来指定你索要查询的是第几个input/ouput,如果你所查询的这个input是当前正在使用的,那么在v4l2_input还会包含一些当前的状态信息,如果所查询的input/output不存在,那么回返回EINVAL错误,所以,我们通过循环查找,直到返回错误来遍历所有的input/output. VIDIOC_G_INPUT and VIDIOC_G_OUTPUT 返回当前的video input和output的index. 

  1. Example 1-1. Information about the current video input
  2. struct v4l2_input input;
  3. int index;
  4. if (-1 == ioctl (fd, VIDIOC_G_INPUT, &index)) {
  5.         perror ("VIDIOC_G_INPUT");
  6.         exit (EXIT_FAILURE);
  7. }
  8. memset (&input, 0, sizeof (input));
  9. input.index = index;
  10. if (-1 == ioctl (fd, VIDIOC_ENUMINPUT, &input)) {
  11.         perror ("VIDIOC_ENUMINPUT");
  12.         exit (EXIT_FAILURE);
  13. }
  14. printf ("Current input: %s/n", input.name);
  15.       
  16. Example 1-2. Switching to the first video input
  17. int index;
  18. index = 0;
  19. if (-1 == ioctl (fd, VIDIOC_S_INPUT, &index)) {
  20.         perror ("VIDIOC_S_INPUT");
  21.         exit (EXIT_FAILURE);
  22. }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章