亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python openCV 基于TCP的socket網(wǎng)絡(luò)傳輸視頻(三)

系統(tǒng) 2600 0

??在這個版本中,我實現(xiàn)了兩個客戶端,一個服務(wù)器的操作,其實有時候解決問題,就差這么一點,一點就通。我來說說我這個版本,一個客戶端可以采集視頻,另一個客戶端可以觀看視頻,服務(wù)器可以建在本地,也可以搭建在云平臺上,就是可以被外網(wǎng)訪問。
??服務(wù)器的思路:采用多線程,采集視頻一個客戶端,觀看視頻一個客戶端,其中有個要關(guān)注的點,就是有一個線程要加延時,不然的話觀看視頻會太卡。另外我這只是實現(xiàn)了,有需要注意的地方很多,代碼還不完善,先開服務(wù)器,再開采集,最后開觀看客戶端,錯了順序就不好使了,等我把多線程旅順了,再更新整理。主要是這個思路。

服務(wù)器

            
              
                #!/usr/bin/python
              
              
                # -*-coding:utf-8 -*-
              
              
                import
              
               socket

              
                import
              
               threading

              
                import
              
               cv2

              
                import
              
               numpy

              
                from
              
               time 
              
                import
              
               sleep



              
                def
              
              
                recv_all
              
              
                (
              
              sock
              
                ,
              
               count
              
                )
              
              
                :
              
              
    buf 
              
                =
              
              
                ''
              
              
                while
              
               count
              
                :
              
              
        newbuf 
              
                =
              
               sock
              
                .
              
              recv
              
                (
              
              count
              
                )
              
              
                if
              
              
                not
              
               newbuf
              
                :
              
              
                return
              
              
                None
              
              
        buf 
              
                +=
              
               newbuf
        count 
              
                -=
              
              
                len
              
              
                (
              
              newbuf
              
                )
              
              
                return
              
               buf



              
                # 線程鎖
              
              
threadLock 
              
                =
              
               threading
              
                .
              
              Lock
              
                (
              
              
                )
              
              
                # 視頻buf
              
              
                # videoDatastr = ''
              
              
                # 客戶端套接字
              
              
conn_list 
              
                =
              
              
                [
              
              
                ]
              
              
                def
              
              
                robotVideoThread
              
              
                (
              
              sock
              
                )
              
              
                :
              
              
                global
              
               videoDatastr
    
              
                # 接受TCP鏈接并返回(conn, addr),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù),addr是鏈接客戶端的地址。
              
              
    conn
              
                ,
              
               addr 
              
                =
              
               sock
              
                .
              
              accept
              
                (
              
              
                )
              
              
                print
              
              
                'robot Connected with'
              
              
                +
              
              
                ' '
              
              
                +
              
               addr
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
              
                ':'
              
              
                +
              
              
                str
              
              
                (
              
              addr
              
                [
              
              
                1
              
              
                ]
              
              
                )
              
              
    conn_list
              
                .
              
              append
              
                (
              
              conn
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
        length 
              
                =
              
               recv_all
              
                (
              
              conn
              
                ,
              
              
                16
              
              
                )
              
              
                # 首先接收來自客戶端發(fā)送的大小信息
              
              
                if
              
              
                len
              
              
                (
              
              length
              
                )
              
              
                ==
              
              
                16
              
              
                :
              
              
                # 若成功接收到大小信息,進一步再接收整張圖片
              
              
                #threadLock.acquire()
              
              
            videoDatastr 
              
                =
              
               recv_all
              
                (
              
              conn
              
                ,
              
              
                int
              
              
                (
              
              length
              
                )
              
              
                )
              
              
                #threadLock.release()
              
              
                def
              
              
                userVideoThread
              
              
                (
              
              sock
              
                )
              
              
                :
              
              
                global
              
               videoDatastr
    
              
                # 接受TCP鏈接并返回(conn, addr),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù),addr是鏈接客戶端的地址。
              
              
    conn
              
                ,
              
               addr 
              
                =
              
               sock
              
                .
              
              accept
              
                (
              
              
                )
              
              
                print
              
              
                'user Connected with'
              
              
                +
              
              
                ' '
              
              
                +
              
               addr
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
              
                ':'
              
              
                +
              
              
                str
              
              
                (
              
              addr
              
                [
              
              
                1
              
              
                ]
              
              
                )
              
              
    conn_list
              
                .
              
              append
              
                (
              
              conn
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
                #threadLock.acquire()
              
              
        conn
              
                .
              
              send
              
                (
              
              
                str
              
              
                (
              
              
                len
              
              
                (
              
              videoDatastr
              
                )
              
              
                )
              
              
                .
              
              ljust
              
                (
              
              
                16
              
              
                )
              
              
                )
              
              
        conn
              
                .
              
              send
              
                (
              
              videoDatastr
              
                )
              
              
                #threadLock.release()
              
              
        sleep
              
                (
              
              
                0.1
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              

    s_robot 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
    address 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                8888
              
              
                )
              
              
    s_robot
              
                .
              
              bind
              
                (
              
              address
              
                )
              
              
    s_robot
              
                .
              
              listen
              
                (
              
              
                True
              
              
                )
              
              
                print
              
              
                'robot服務(wù)器初始化成功'
              
              

    s_user 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
    address 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                9999
              
              
                )
              
              
    s_user
              
                .
              
              bind
              
                (
              
              address
              
                )
              
              
    s_user
              
                .
              
              listen
              
                (
              
              
                True
              
              
                )
              
              
                print
              
              
                'user服務(wù)器初始化成功'
              
              

    threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              robotVideoThread
              
                ,
              
               args
              
                =
              
              
                (
              
              s_robot
              
                ,
              
              
                )
              
              
                )
              
              
                .
              
              start
              
                (
              
              
                )
              
              
    threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              userVideoThread
              
                ,
              
               args
              
                =
              
              
                (
              
              s_user
              
                ,
              
              
                )
              
              
                )
              
              
                .
              
              start
              
                (
              
              
                )
              
            
          

采集客戶端

            
              
                #!/usr/bin/python
              
              
                # -*-coding:utf-8 -*-
              
              
                import
              
               socket

              
                import
              
               cv2

              
                import
              
               numpy

              
                from
              
               time 
              
                import
              
               sleep


              
                # socket.AF_INET 用于服務(wù)器與服務(wù)器之間的網(wǎng)絡(luò)通信
              
              
                # socket.SOCK_STREAM 代表基于TCP的流式socket通信
              
              
sock 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
                # 連接服務(wù)端
              
              
address_server 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                8888
              
              
                )
              
              
sock
              
                .
              
              connect
              
                (
              
              address_server
              
                )
              
              
                # 從攝像頭采集圖像
              
              
                # 參數(shù)是0,表示打開筆記本的內(nèi)置攝像頭,參數(shù)是視頻文件路徑則打開視頻
              
              
capture 
              
                =
              
               cv2
              
                .
              
              VideoCapture
              
                (
              
              
                0
              
              
                )
              
              
                # capture.read() 按幀讀取視頻
              
              
                # ret,frame 是capture.read()方法的返回值
              
              
                # 其中ret是布爾值,如果讀取幀正確,返回True;如果文件讀到末尾,返回False。
              
              
                # frame 就是每一幀圖像,是個三維矩陣
              
              
ret
              
                ,
              
               frame 
              
                =
              
               capture
              
                .
              
              read
              
                (
              
              
                )
              
              
encode_param 
              
                =
              
              
                [
              
              
                int
              
              
                (
              
              cv2
              
                .
              
              IMWRITE_JPEG_QUALITY
              
                )
              
              
                ,
              
              
                50
              
              
                ]
              
              
                while
              
               ret
              
                :
              
              
                # 首先對圖片進行編碼,因為socket不支持直接發(fā)送圖片
              
              
                # '.jpg'表示把當(dāng)前圖片frame按照jpg格式編碼
              
              
                # result, img_encode = cv2.imencode('.jpg', frame)
              
              
                # img_encode = cv2.imencode('.jpg', frame, encode_param)[1]
              
              
    result
              
                ,
              
               img_encode 
              
                =
              
               cv2
              
                .
              
              imencode
              
                (
              
              
                '.jpg'
              
              
                ,
              
               frame
              
                )
              
              
                # data = numpy.array(img_encode)
              
              
                # stringData = data.tostring()
              
              
    stringData 
              
                =
              
               img_encode
              
                .
              
              tostring
              
                (
              
              
                )
              
              
                # 首先發(fā)送圖片編碼后的長度
              
              
    sock
              
                .
              
              send
              
                (
              
              
                str
              
              
                (
              
              
                len
              
              
                (
              
              stringData
              
                )
              
              
                )
              
              
                .
              
              ljust
              
                (
              
              
                16
              
              
                )
              
              
                )
              
              
                # 然后一個字節(jié)一個字節(jié)發(fā)送編碼的內(nèi)容
              
              
                # 如果是python對python那么可以一次性發(fā)送,如果發(fā)給c++的server則必須分開發(fā)因為編碼里面有字符串結(jié)束標(biāo)志位,c++會截斷
              
              
                # for i in range(0, len(stringData)):
              
              
                #     sock.send(stringData[i])
              
              
    sock
              
                .
              
              send
              
                (
              
              stringData
              
                )
              
              
                # sleep(1)
              
              
    ret
              
                ,
              
               frame 
              
                =
              
               capture
              
                .
              
              read
              
                (
              
              
                )
              
              
    cv2
              
                .
              
              resize
              
                (
              
              frame
              
                ,
              
              
                (
              
              
                640
              
              
                ,
              
              
                480
              
              
                )
              
              
                )
              
              

sock
              
                .
              
              close
              
                (
              
              
                )
              
              
cv2
              
                .
              
              destroyAllWindows
              
                (
              
              
                )
              
            
          

觀看客戶端

            
              
                #!usr/bin/python
              
              
                # coding=utf-8
              
              
                import
              
               socket

              
                import
              
               cv2

              
                import
              
               numpy



              
                # 接受圖片大小的信息
              
              
                def
              
              
                recv_size
              
              
                (
              
              sock
              
                ,
              
               count
              
                )
              
              
                :
              
              
    buf 
              
                =
              
              
                ''
              
              
                while
              
               count
              
                :
              
              
        newbuf 
              
                =
              
               sock
              
                .
              
              recv
              
                (
              
              count
              
                )
              
              
                if
              
              
                not
              
               newbuf
              
                :
              
              
                return
              
              
                None
              
              
        buf 
              
                +=
              
               newbuf
        count 
              
                -=
              
              
                len
              
              
                (
              
              newbuf
              
                )
              
              
                return
              
               buf



              
                # socket.AF_INET 用于服務(wù)器與服務(wù)器之間的網(wǎng)絡(luò)通信
              
              
                # socket.SOCK_STREAM 代表基于TCP的流式socket通信
              
              
sock 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              socket
              
                .
              
              AF_INET
              
                ,
              
               socket
              
                .
              
              SOCK_STREAM
              
                )
              
              
                # 連接服務(wù)端
              
              
address_server 
              
                =
              
              
                (
              
              
                '10.0.0.30'
              
              
                ,
              
              
                9999
              
              
                )
              
              
sock
              
                .
              
              connect
              
                (
              
              address_server
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
    length 
              
                =
              
               recv_size
              
                (
              
              sock
              
                ,
              
              
                16
              
              
                )
              
              
                # 首先接收來自客戶端發(fā)送的大小信息
              
              
                if
              
              
                len
              
              
                (
              
              length
              
                )
              
              
                ==
              
              
                16
              
              
                :
              
              
                # 若成功接收到大小信息,進一步再接收整張圖片
              
              
        stringData 
              
                =
              
               recv_size
              
                (
              
              sock
              
                ,
              
              
                int
              
              
                (
              
              length
              
                )
              
              
                )
              
              
        data 
              
                =
              
               numpy
              
                .
              
              fromstring
              
                (
              
              stringData
              
                ,
              
               dtype
              
                =
              
              
                'uint8'
              
              
                )
              
              
        decimg 
              
                =
              
               cv2
              
                .
              
              imdecode
              
                (
              
              data
              
                ,
              
              
                1
              
              
                )
              
              
                # 解碼處理,返回mat圖片
              
              
        img 
              
                =
              
               cv2
              
                .
              
              resize
              
                (
              
              decimg
              
                ,
              
              
                (
              
              
                640
              
              
                ,
              
              
                480
              
              
                )
              
              
                )
              
              
        cv2
              
                .
              
              imshow
              
                (
              
              
                'SERVER'
              
              
                ,
              
               img
              
                )
              
              
                if
              
               cv2
              
                .
              
              waitKey
              
                (
              
              
                1
              
              
                )
              
              
                ==
              
              
                27
              
              
                :
              
              
                break
              
              
                # print('Image recieved successfully!')
              
              



sock
              
                .
              
              close
              
                (
              
              
                )
              
              
cv2
              
                .
              
              destroyAllWindows
              
                (
              
              
                )
              
            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91热久久免费频精品99欧美 | 国产成人久久精品推最新 | 在线a毛片免费视频观看 | 亚洲伦理一二三四 | 在线播放色 | 免费特黄级夫费生活片 | 国产精品麻豆视频 | 亚洲国产成人久久一区www | 久久香蕉综合色一综合色88 | 精品久久久久久久久久 | 天天看天天射天天碰 | 成人免费国产欧美日韩你懂的 | 香蕉免费一区二区三区在线观看 | 操操干 | 色婷婷在线观看视频 | 毛片a级 | 伊人久久大香线焦综合四虎 | 免费网站日本永久免费观看 | 日本成人一区 | 国产精品色婷婷在线观看 | 日韩不卡毛片 | 久久久久国产精品免费 | 婷婷色在线观看 | 亚洲欧美人成人综合在线50p | 国产99区 | 7m凹凸国产刺激在线视频 | 色婷婷久久合月综 | 亚洲精品高清久久 | 91精品国产综合久久久久 | 成人精品一区二区不卡视频 | 精品视频在线一区 | 国产波波社区精品视频 | 理论毛片 | 日日私人影院 | 免费大片黄在线观看yw | 天堂成人一区二区三区 | 爆操在线 | 日产国产欧美视频一区精品 | 久久九九青青国产精品 | 精品国产免费久久久久久 | 97se在线|