基于TCP协议的摄像头视频网络传输
最近剛完成了項目中攝像頭視頻網絡傳輸這部分的工作,現在做個總結。
一、設計思路
整個裝置包括上位機和下位機,它們都是搭載linux系統的樹莓派。
1、程序設計思路
在上位機端:通過v4l2抓取攝像頭視頻流中的一幀YUV420格式的幀數據,然后使用x264進行編碼,最后通過網絡傳輸給下位機,網絡協議使用TCP協議。
在下位機端:接收到上位機發來的一幀數據之后使用ffmpeg解碼,然后轉換為RGB24格式再通過opencv來顯示圖像。
2、程序實現思路
將上面的每一個操作封裝為一個類,這樣程序更加清晰,使用更加方便,維護起來也容易些。
二、實現過程
1、v4l2抓取攝像頭視頻幀數據
我所使用的攝像頭是Raspberry Pi Camera V2,可以參考我的另一篇博客“使用v4l2在樹莓派上抓取視頻圖像”。可以直接抓取到YUV420格式的數據,需要做的更改是在成功抓取到一幀數據之后不要保存為圖片,而是使用x264進行編碼(具體的實現的方法是將YUV420格式的數據存到變量中然后傳送給x264編碼函數)。
2、x264編碼
x264是開源的,它有編碼的函數接口,程序代碼不是很難,可以參考“x264的編碼示例”和“FFmpeg實時解碼H264”中的x264編碼部分,Windows下的程序和Linux下的程序是通用的,只是一個使用.lib靜態庫,另一個使用.so動態庫。windows端編譯程序時只需要libx264.lib文件(靜態庫,在程序中使用#pragma comment(lib,"libx264.lib")即可將.lib文件音·連入程序,但要設置好文件路徑),運行時需要libx264.dll動態庫(與.exe文件放在一起即可)。這些文件在文尾附上。關于如何在Linux下編譯x264的方法,可以參考我的另一篇博客“Linux下編譯x264與樹莓派交叉編譯X264(附加測試小程序)”。
3、基于TCP的視頻網絡傳輸
可以說這部分是最核心的部分了。整體的思路是在上、下位機建立好連接之后開始傳輸數據,由于每次編碼后產生的數據長度是不一樣的,所以每幀數據需要發送兩次,第一次發數據長度,下位機接收到數據長度信息之后回應消息,接著上位機再發送數據內容,下位機接收完成之后回應上位機。然后周而復始發送下一幀。
至于為什么使用TCP協議而不是用UDP協議,是為了保證視頻傳輸的穩定性。
4、ffmpeg解碼視頻
當客戶端接收到一幀數據之后就會存入隊列中,然后在另一個線程進行解碼并顯示。這之中就會使用ffmpeg進行解碼,目前我也只是會用這個,具體的解釋需要參考“雷霄驊”的“最簡單的基于FFmpeg的AVfilter的例子-純凈版”,雷博士的一系列視頻類的博客都很值得參考。
5、opencv播放視頻
解碼之后的視頻格式是YUV420格式的,需要轉換為RGB24或者BGR24格式的,具體要看編碼之前是哪種YUV420,因為一共有兩種YUV420,我在Windows下使用opencv的videocapture類抓取一幀視頻數據之后編碼再解碼就需要轉換成RGB24格式,而從上位機上抓取的YUV420格式的視頻幀編碼之后再解碼就需要轉換成BGR24格式,這樣圖像的顏色才正常。
總結
以上是生活随笔為你收集整理的基于TCP协议的摄像头视频网络传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] 有使用过vue吗?说说你对v
- 下一篇: [html] 写一个垂直的三栏布局,第