python 用socket 和flask 实现传输实时摄像头到网页,网页一直在加载打不开

我想在python 用socket 和flask 实现不同计算机的通讯,由客户端传输实时摄像头到另一台计算机的服务端,再将实时视频传输到网页上。目前我写了这些代码:

这是服务端的

from flask import Flask
from flask import render_template
from flask import Response
import cv2
import socket
import threading

lock = threading.Lock()
app = Flask(__name__, template_folder="data/template") # 这是web.html存放的目录


sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 确保下次启动是端口保留
sk.bind(('10.40.129.105', 1))  # 这里也是写本服务机的ip,端口随便写
sk.listen(5)
conn, address = sk.accept()


@app.route('/')
def index():
    return render_template("web.html")

#cap = cv2.VideoCapture(0)
def generate():
    while True:
        with lock:
            #ret, frame = cap.read()
            data = conn.recv(188888)  # 188888为接受的最大字节数
            #flag, img_encode = cv2.imencode('.jpg', frame)
        yield(b'--frame\r\n' b'content-type:image/jpeg\r\n\r\n' + data + b'\r\n') # bytearray(img_encode)


@app.route('/video_feed')
def video_feed():
    return Response(generate(), mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == "__main__":
     app.run(debug=True)

这是客户端的

import socket
import cv2
import numpy as np

ip_port = ('10.40.129.105', 1)  # 这里填服务端的ip,端口要和服务端一致
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建套接字
s.connect(ip_port)  # 连接服务器

cap = cv2.VideoCapture(0)  # 打开摄像头,0为默认摄像头
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 352)  # 设置每帧图片的宽
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 288)  # 设置每帧图片的高

while True:
    ret, frame = cap.read()  # 获取视频的开启状态和每一帧图片
    img_encode = cv2.imencode('.jpg', frame)[1]  # 对每一帧图片进行编码
    data = np.array(img_encode)  # 转化为矩阵
    byte_encode = data.tobytes()  # 编码格式转为字节格式
    data_len = str(len(byte_encode))  # 获取每一帧图片的大小(字节数)
    s.send(byte_encode)  # 发送给服务端呈现
    print('每帧图片大小: %s' % data_len)

这是web.html

html>

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>videotitle>
    head>
    <body>
        <h1>videoh1>
        <img src="{{url_for('video_feed')}}">
    body>
html>


目前的问题就是运行服务端和客户端后,网页打不开,就一直在加载

img

img

而且客户端每一帧图片传了一部分后停止:

img

运行程序后客户端摄像头一直开着,两边程序一直在运行

希望可以帮我找出问题并解决

socket代码放到generate函数里面测试没问题,放外面,客户端链接后,服务器端接受链接视乎又执行了监听,所以网页打开后一直加载状态

def generate():
    sk = socket.socket()
    sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 确保下次启动是端口保留
    sk.bind(('127.0.0.1', 7782))  # 这里也是写本服务机的ip,端口随便写
    sk.listen(5)
    print('before accept')
    conn, address = sk.accept()
    ###原来的代码

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632