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. }

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