資源簡(jiǎn)介
python 3.6 socket傳輸視頻 ,采用TCP傳輸?shù)姆绞?,?shí)現(xiàn)服務(wù)器和客服端視頻傳輸

代碼片段和文件信息
import?socket
import?cv2
import?threading
import?struct
import?numpy
#TCP連接
#1. 客戶(hù)端連接端口后,首先發(fā)送需要協(xié)商的分辨率和幀數(shù),以致能夠使傳輸“協(xié)議”一致
#2. 客戶(hù)端使用線(xiàn)程,對(duì)圖片進(jìn)行收集
#3. 對(duì)收到的每一張圖片進(jìn)行解碼,并利用OpenCV播放出來(lái),即可實(shí)現(xiàn)C/S兩端實(shí)時(shí)視頻傳輸。
#4?利用服務(wù)器端打開(kāi)端口8880,此時(shí)客戶(hù)端連接后,便可以在客戶(hù)端中捕獲到服務(wù)器端的視頻。
class?Camera_Connect_object:?????????????????????????????????????????#定義一個(gè)攝像頭類(lèi)
?????def?__init__(selfD_addr_port=[““8880]):?????????????????????????#類(lèi)的構(gòu)造函數(shù),當(dāng)創(chuàng)建了這個(gè)類(lèi)的實(shí)例時(shí)就會(huì)調(diào)用該方法
?????????self.resolution=[640480]??????????????????????????????????????#self?代表類(lèi)的實(shí)例
?????????self.addr_port=D_addr_port?????????????????????????????????????#綁定的端口和ip
?????????self.src=888+15????????????????????????????????????????????????#雙方確定傳輸幀數(shù),(888)為校驗(yàn)值
?????????self.interval=0????????????????????????????????????????????????#圖片播放時(shí)間間隔
?????????self.img_fps=15????????????????????????????????????????????????#每秒傳輸多少幀數(shù)
?????def?Socket_Connect(self):
?????????self.client=socket.socket(socket.AF_INETsocket.SOCK_STREAM)?????????#?選擇TCP連接方式
?????????self.client.setsockopt(socket.SOL_SOCKETsocket.SO_REUSEADDR1)??????#?操作系統(tǒng)會(huì)在服務(wù)器socket被關(guān)閉或服務(wù)器進(jìn)程終止后馬上釋放該服務(wù)器的端口,否則操作系統(tǒng)會(huì)保留幾分鐘該端口。
?????????self.client.connect(self.addr_port)???????????????????????????????????#連接對(duì)應(yīng)的端口位置,包括IP和端口,傳輸給客戶(hù)端
?????????print(“IP?is?%s:%d“?%?(self.addr_port[0]self.addr_port[1]))??????????#輸入連接的IP和端口號(hào)
?????def?RT_Image(self):
?????????self.name=self.addr_port[0]+“?Camera“
?????????self.client.send(struct.pack(“l(fā)hh“?self.src?self.resolution[0]?self.resolution[1]))?????#按照格式打包發(fā)送幀數(shù)和分辨率
?????????while(1):
??????????????info=struct.unpack(“l(fā)hh“self.client.recv(8))??????????????????????????#將接收到的8位二進(jìn)制解包
??????????????buf_size=info[0]???????????????????????????????????????????????????????#獲取讀的圖片總長(zhǎng)度
??????????????if?buf_size:
??????????????????try:
??????????????????????self.buf=b““????????????????#代表bytes類(lèi)型
??????????????????????temp_buf=self.buf
??????????????????????while(buf_size):????????????#讀取每一張圖片的長(zhǎng)度
???????????????????????????temp_buf=self.client.recv(buf_size)
???????????????????????????buf_size-=len(temp_buf)
???????????????????????????self.buf+=temp_buf??????#獲取圖片
???????????????????????????data?=?numpy.fromstring(self.buf?dtype=‘uint8‘)????#按uint8轉(zhuǎn)換為圖像矩陣
???????????????????????????self.image?=?cv2.imdecode(data?1)??????????????????#圖像解碼
???????????????????????????cv2.imshow(self.name?self.image)???????????????????#展示圖片
??????????????????except:
?????????????????????pass;
??????????????????finally:
?????????????????????if(cv2.waitKey(10)==27):?????????????????#每10ms刷新一次圖片,按‘ESC’(27)退出
?????????????????????????self.client.close()
?????????????????????????cv2.destroyAllWindows()
?????????????????????????break
?????def?Get_Data(selfinterval):
?????????showThread=threading.Thread(target=self.RT_Image)
?????????showThread.start()
if?__name__?==?‘__main__‘:
?????camera=Camera_Connect_object()
?????camera.addr_port[0]=input(“Please?input?IP:“)
?????camera.addr_port=tuple(camera.addr_port)
?????camera.So
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????3807??2018-05-13?17:05??SOCKET傳輸視頻\video_C.py
?????文件???????3605??2018-05-13?17:33??SOCKET傳輸視頻\video_S.py
?????目錄??????????0??2018-05-23?17:13??SOCKET傳輸視頻
-----------?---------??----------?-----??----
?????????????????7412????????????????????3
評(píng)論
共有 條評(píng)論