Socket 视频【分帧】 发送

2021电赛 代码记录。

  • server.py
import socket  # 导入socket模块,用于网络通信
import time  # 导入time模块,用于计时操作

import cv2  # 导入cv2模块,用于图像处理
import numpy  # 导入numpy模块,用于数组操作


def receive_video():
    address = ('0.0.0.0', 8002)  # 定义服务器地址和端口
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建TCP套接字对象
    s.bind(address)  # 将套接字绑定到指定地址
    s.listen(1)  # 开始监听传入连接

    def recv_all(sock, count):
        # 自定义函数,用于接收指定数量的数据
        buf = b''  # 定义一个空字节串
        while count:
            new_buf = sock.recv(count)  # 接收数据
            if not new_buf:
                return None  # 如果接收失败,返回None
            buf += new_buf  # 将接收到的数据追加到buf中
            count -= len(new_buf)  # 减去已接收数据的长度
        return buf

    conn, addr = s.accept()  # 接受客户端连接并返回连接对象和客户端地址
    print('Connected from:', addr)  # 打印客户端地址
    while True:
        start = time.time()  # 记录开始时间
        length = recv_all(conn, 16)  # 接收图像数据的长度,16代表接收长度
        string_data = recv_all(conn, int(length))  # 接收图像数据
        data = numpy.frombuffer(string_data, numpy.uint8)  # 将接收到的数据转换为numpy数组
        dec_img = cv2.imdecode(data, cv2.IMREAD_COLOR)  # 解码数组为图像
        cv2.imshow('SERVER', dec_img)  # 在窗口中显示图像

        end = time.time()  # 记录结束时间
        seconds = end - start  # 计算时间差
        fps = 1 / seconds  # 计算帧率
        conn.send(bytes(str(int(fps)), encoding='utf-8'))  # 发送帧率给客户端
        k = cv2.waitKey(10) & 0xFF  # 等待按键输入,如果按下ESC键,则退出循环
        if k == 27:
            break
    s.close()  # 关闭套接字
    cv2.destroyAllWindows()  # 关闭窗口


if __name__ == '__main__':
    receive_video()

  • Client.py
import socket  # 导入socket模块,用于网络通信
import cv2  # 导入cv2模块,用于图像处理
import numpy  # 导入numpy模块,用于数组操作
import time  # 导入time模块,用于计时操作
import sys  # 导入sys模块,用于系统相关操作


def send_video():
    address = ('127.0.0.1', 8002)  # 定义服务器地址和端口
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建TCP套接字对象
        sock.connect(address)  # 连接到服务器
    except socket.error as msg:
        print(msg)  # 打印错误信息
        sys.exit(1)  # 退出程序

    capture = cv2.VideoCapture('rtmp://ns8.indexforce.com/home/mystream')  # 打开视频流
    ret, frame = capture.read()  # 读取一帧图像
    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 15]  # 图像编码参数

    while ret:
        time.sleep(0.01)  # 暂停0.01秒,控制发送速率
        frame = cv2.resize(frame, dsize=(400, 400))  # 调整图像大小为400x400
        frame = cv2.rectangle(frame, (0, 200), (400, 200), (255, 255, 255), 3)  # 在图像上绘制矩形
        frame = cv2.rectangle(frame, (200, 0), (200, 400), (255, 255, 255), 5)  # 在图像上绘制矩形

        result, imgencode = cv2.imencode('.jpg', frame, encode_param)  # 将图像编码为JPEG格式
        data = numpy.array(imgencode)  # 将编码后的图像转换为numpy数组
        string_data = data.tostring()  # 将数组转换为字符串

        sock.send(str(len(string_data)).encode('utf-8').ljust(16))  # 发送图像数据长度
        sock.send(string_data)  # 发送图像数据
        receive = sock.recv(1024)  # 接收服务器返回的数据
        if len(receive):
            print(str(receive, encoding='utf-8'))  # 打印接收到的数据

        ret, frame = capture.read()  # 读取下一帧图像
        if cv2.waitKey(10) == 27:  # 如果按下ESC键,则退出循环
            break
    sock.close()  # 关闭套接字


if __name__ == '__main__':
    send_video()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流星蝴蝶没有剑

篮球弹弹弹

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值