video4linux--1

来源:互联网 发布:java中线程的使用 编辑:程序博客网 时间:2024/09/21 09:18
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 VideoBurst 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. }

原创粉丝点击