日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于TCP协议的摄像头视频网络传输

發(fā)布時(shí)間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于TCP协议的摄像头视频网络传输 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近剛完成了項(xiàng)目中攝像頭視頻網(wǎng)絡(luò)傳輸這部分的工作,現(xiàn)在做個(gè)總結(jié)。

一、設(shè)計(jì)思路

整個(gè)裝置包括上位機(jī)和下位機(jī),它們都是搭載linux系統(tǒng)的樹(shù)莓派。

1、程序設(shè)計(jì)思路

在上位機(jī)端:通過(guò)v4l2抓取攝像頭視頻流中的一幀YUV420格式的幀數(shù)據(jù),然后使用x264進(jìn)行編碼,最后通過(guò)網(wǎng)絡(luò)傳輸給下位機(jī),網(wǎng)絡(luò)協(xié)議使用TCP協(xié)議。

在下位機(jī)端:接收到上位機(jī)發(fā)來(lái)的一幀數(shù)據(jù)之后使用ffmpeg解碼,然后轉(zhuǎn)換為RGB24格式再通過(guò)opencv來(lái)顯示圖像。

2、程序?qū)崿F(xiàn)思路

將上面的每一個(gè)操作封裝為一個(gè)類,這樣程序更加清晰,使用更加方便,維護(hù)起來(lái)也容易些。

二、實(shí)現(xiàn)過(guò)程

1、v4l2抓取攝像頭視頻幀數(shù)據(jù)

我所使用的攝像頭是Raspberry Pi Camera V2,可以參考我的另一篇博客“使用v4l2在樹(shù)莓派上抓取視頻圖像”。可以直接抓取到Y(jié)UV420格式的數(shù)據(jù),需要做的更改是在成功抓取到一幀數(shù)據(jù)之后不要保存為圖片,而是使用x264進(jìn)行編碼(具體的實(shí)現(xiàn)的方法是將YUV420格式的數(shù)據(jù)存到變量中然后傳送給x264編碼函數(shù))。

2、x264編碼

x264是開(kāi)源的,它有編碼的函數(shù)接口,程序代碼不是很難,可以參考“x264的編碼示例”和“FFmpeg實(shí)時(shí)解碼H264”中的x264編碼部分,Windows下的程序和Linux下的程序是通用的,只是一個(gè)使用.lib靜態(tài)庫(kù),另一個(gè)使用.so動(dòng)態(tài)庫(kù)。windows端編譯程序時(shí)只需要libx264.lib文件(靜態(tài)庫(kù),在程序中使用#pragma comment(lib,"libx264.lib")即可將.lib文件音·連入程序,但要設(shè)置好文件路徑),運(yùn)行時(shí)需要libx264.dll動(dòng)態(tài)庫(kù)(與.exe文件放在一起即可)。這些文件在文尾附上。關(guān)于如何在Linux下編譯x264的方法,可以參考我的另一篇博客“Linux下編譯x264與樹(shù)莓派交叉編譯X264(附加測(cè)試小程序)”。

3、基于TCP的視頻網(wǎng)絡(luò)傳輸

可以說(shuō)這部分是最核心的部分了。整體的思路是在上、下位機(jī)建立好連接之后開(kāi)始傳輸數(shù)據(jù),由于每次編碼后產(chǎn)生的數(shù)據(jù)長(zhǎng)度是不一樣的,所以每幀數(shù)據(jù)需要發(fā)送兩次,第一次發(fā)數(shù)據(jù)長(zhǎng)度,下位機(jī)接收到數(shù)據(jù)長(zhǎng)度信息之后回應(yīng)消息,接著上位機(jī)再發(fā)送數(shù)據(jù)內(nèi)容,下位機(jī)接收完成之后回應(yīng)上位機(jī)。然后周而復(fù)始發(fā)送下一幀。

至于為什么使用TCP協(xié)議而不是用UDP協(xié)議,是為了保證視頻傳輸?shù)姆€(wěn)定性。

4、ffmpeg解碼視頻

當(dāng)客戶端接收到一幀數(shù)據(jù)之后就會(huì)存入隊(duì)列中,然后在另一個(gè)線程進(jìn)行解碼并顯示。這之中就會(huì)使用ffmpeg進(jìn)行解碼,目前我也只是會(huì)用這個(gè),具體的解釋需要參考“雷霄驊”的“最簡(jiǎn)單的基于FFmpeg的AVfilter的例子-純凈版”,雷博士的一系列視頻類的博客都很值得參考。

5、opencv播放視頻

解碼之后的視頻格式是YUV420格式的,需要轉(zhuǎn)換為RGB24或者BGR24格式的,具體要看編碼之前是哪種YUV420,因?yàn)橐还灿袃煞NYUV420,我在Windows下使用opencv的videocapture類抓取一幀視頻數(shù)據(jù)之后編碼再解碼就需要轉(zhuǎn)換成RGB24格式,而從上位機(jī)上抓取的YUV420格式的視頻幀編碼之后再解碼就需要轉(zhuǎn)換成BGR24格式,這樣圖像的顏色才正常。

總結(jié)

以上是生活随笔為你收集整理的基于TCP协议的摄像头视频网络传输的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。