mjpg-streamer源碼分析
時間:2018-08-15作者:華清遠見
mjpg-streamer是一個很好的開源項目,用來做視頻服務器,使用的是v4l2的接口。前面我們說了它的移植過程,但是在某些特定的情況下這個工程不能達到我們的需求,所以我們需要對源碼進行修改,或者直接寫一個自己的視頻服務器。在修改源碼或寫自己的服務器之前我們分析下這個源碼的代碼。 這個代碼里有三個部分是我們需要掌握的內容,第一是v4l2接口,第二個是socket編程,第三個是多線程編程。 一、 v4l2接口說明 這里涉及到我們如何從攝像頭中把數據取出來,首先是封裝一個結構體用來描述攝像頭的一些信息,比如采集圖片的寬高,圖片的格式,等等。
struct vdIn { 接著是把這個結構體寫入驅動中,用來初始化攝像頭。這個操作通過ioctl完成,涉及到的命令包括VIDIOC_QUERYCAP、VIDIOC_S_FMT、VIDIOC_S_PARM、VIDIOC_REQBUFS,VIDIOC_QUERYBUF,并通過mmap完成內存的映射。 后我們通過ioct命令完成圖片的讀取,涉及到的命令包括VIDIOC_QBUF和VIDIOC_DQBUF。然后把獲得的數據寫入到文件里就是圖片,通過網絡傳輸出去連續的圖片就是視頻。 二、 socket編程 在這個程序里使用的是tcp套接字,每有一個連接請求就創建一個線程單獨和這個請求通信,這里涉及到的函數包括socket、bind、listen、accept和write。 三、 多線程編程 為了能同時響應多個客戶端的請求,這里使用了多線程編程,為每一個請求建立一個連接,每個連接就是一個線程。這里涉及到的函數包括pthread_create、pthread_detach、pthread_cond_init、pthread_cond_destroy、pthread_mutex_init、pthread_mutex_destroy。 四、 mjpg-streamer工作流程
相關資訊
發表評論
|