硬件:MINI2440 軟件:Linux-2.6.32 一、H.264介紹 H.264是一種視頻壓縮編碼標準。該標準能夠在較低帶寬(2M以內)情況下提供高質量的圖像傳輸。據(jù)數(shù)據(jù)分析,在同等畫質下,H.264比上一代編碼標準MPEG2平均節(jié)約64%的傳輸碼流,而比MPEG4要平均節(jié)約39%的傳輸碼流。 二、H.264視頻監(jiān)控系統(tǒng)架構 架構圖如下 注意,攝像頭最好采用網(wǎng)眼2000這款老攝像頭,這款攝像頭已經(jīng)停產(chǎn),很難找。我買了一個最新款的攝像頭,最終由于采集的圖像包數(shù)據(jù)過大,無法用UDP傳輸導致失敗,因為UDP一次最多傳送2K以內的包,否則會造成丟包,導致客戶端收到數(shù)據(jù)顯示為一片綠色。 三、視頻數(shù)據(jù)采集接口V4L2 首先我們要解決的第一個問題當然是如何采集到攝像頭的數(shù)據(jù)。要操作攝像頭就要和攝像頭驅動打交道,幸運的是現(xiàn)在的Linux內核已經(jīng)集成了大多數(shù)的攝像頭驅動。所以這點不需要我們關心,如果Linux內核沒有集成就只有自己移植咯。 V4L2全稱Video for Linux two,它是Linux提供的一套標準的API,應用程序通過一套API來調用音視頻設備驅動操作音視頻設備。這一套API屏蔽了音視頻的硬件細節(jié),提供了一個通用接口給應用程序。V4L2具體在Linux上以IOCTL系統(tǒng)調用提供給用戶,通過IOTCL寫入不同的命令實現(xiàn)音視頻設備的不同操作。 具體操作流程如下: 首先打開視頻設備,然后獲取設備和圖像的信息,如最大最小分辨率等,然后獲得攝像頭存儲緩沖區(qū)的信息并且進行內存映射,再然后對攝像頭進行一些必要的設置,如獲取一幀圖像的大小,圖像的格式(RGB、YUV等等),然后啟動采集。下面是一些常用的V4L2命令: 1 VIDIOC_REQBUFS:分配內存 2 VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的數(shù)據(jù)緩存轉換成物理地址 3 VIDIOC_QUERYCAP:查詢驅動功能 4 VIDIOC_ENUM_FMT:獲取當前驅動支持的視頻格式 5 VIDIOC_S_FMT:設置當前驅動的頻捕獲格式 6 VIDIOC_G_FMT:讀取當前驅動的頻捕獲格式 7 VIDIOC_TRY_FMT:驗證當前驅動的顯示格式 8 VIDIOC_CROPCAP:查詢驅動的修剪能力 9 VIDIOC_S_CROP:設置視頻信號的邊框 10 VIDIOC_G_CROP:讀取視頻信號的邊框 11 VIDIOC_QBUF:把數(shù)據(jù)從緩存中讀取出來 12 VIDIOC_DQBUF:把數(shù)據(jù)放回緩存隊列 13 VIDIOC_STREAMON:開始視頻顯示函數(shù) 14 VIDIOC_STREAMOFF:結束視頻顯示函數(shù) 15 VIDIOC_QUERYSTD:檢查當前視頻設備支持的標準,例如PAL或NTSC。 具體操作參考這篇文章:http://blog.csdn.net/seven407/article/details/6401792#comments 四、H.264編碼庫的操作 通過V4L2接口我們采集到了一幀一幀的視頻數(shù)據(jù),然后我們的第二個問題是如何將內存中的幀數(shù)據(jù)進行H.264標準壓縮了。H.264是一套標準,有很多組織對其進行的代碼編寫和實現(xiàn),我用的是T264編碼庫,它是國內視頻編碼自由組織合力開發(fā)的。它遵循H.264視頻編碼標準,并吸收了JM,X264和Xvid三個源碼的優(yōu)點。在Linux下完成壓縮編碼。大家可以去下載T264的源碼,然后進行編譯,然后在T264/avr文件夾下會生成一些列*.obj文件,應用程序可以直接使用這些目標文件提供的功能函數(shù)對YUV格式視頻進行編碼。其流程如下圖所示 首先init_param函數(shù)讀取配置文件的一些編碼配置信息,包括圖像幀大小,1幀間距,參考幀數(shù)目等。T264的源碼庫中有配置參考文件enconfig.txt,一般需要改變的參數(shù)只有是圖像幀大小的配置。然后t264_open調用init_param讀取的配置信息讀264編碼器進行初始化。再然后調用T264_malloc為編碼器分配空間用于存儲編碼后的幀數(shù)據(jù)。最后再調用T264_encode開始編碼,該函數(shù)的參數(shù)包括上一部分V4L2操作中為視頻數(shù)據(jù)映射的內存地址,且該函數(shù)會返回編碼后一幀數(shù)據(jù)大小。這樣視頻數(shù)據(jù)就被壓縮放到為T264分配的內存空間中了。當不需要編碼的時候調用T264_close關閉編碼器。 五、基于UDP方式的視頻實時傳輸 當我們得到H.264編碼標準壓縮好的數(shù)據(jù)的時候我們需要發(fā)送到windows客戶端,那下面一個問題便是如何與windows通信和傳輸視頻數(shù)據(jù)。如何接觸到網(wǎng)絡編程應該都知道如何通過socket方式進行UDP數(shù)據(jù)傳送。注意如果壓縮后的數(shù)據(jù)包過大便無法通過UDP傳輸了,因為windows應用程序我沒時間去寫,是采用別人現(xiàn)成的,所以無奈只有用UDP方式了,如果你能寫windows應用程序可以考慮采用TCP方式,然后攝像頭就不局限于網(wǎng)眼2000了。下面是UDP傳輸方式流程: UDP我就不多廢話了,學過網(wǎng)絡編程的都知道。 六、程序主流程圖 七、結語 之所以去做這個項目是因為聽了國嵌的項目視頻,聽了視頻也沒理出個思路來,后來查閱了很多資料才知道了大體思路。后來我查到一篇文章是桂林電子科大的碩士論文,將這個項目講的很詳細,也測試很多數(shù)據(jù),同時說了windows應用程序的編寫。我想這個項目的作者應該是來自此人吧,國嵌給的windows應用程序和文章上貼圖的一樣,沒給源碼,且還有BUG也沒修復,后來我將此文章往國嵌的交流群一上傳便被踢出了。不管這么多了,反正跟我無關。我給大家提供下載:http://download.csdn.net/detail/ayangke/3969255 此文只給了大體上的實現(xiàn)思路,具體實現(xiàn)還有童鞋們多查閱資料和多寫代碼??!有問題可以聯(lián)系我:qq:843308498。 |
|