dabo_520 2023-04-18 12:48 采纳率: 100%
浏览 74
已结题

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

<!DOCTYPE html>

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


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

img

img

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

img

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

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

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2023-04-18 15:25
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月19日
  • 已采纳回答 4月18日
  • 创建了问题 4月18日

悬赏问题

  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像
  • ¥15 如何用Matlab求Pearcey函数的数值积分?
  • ¥15 一个简单的函数定义问题,输出结果是相反的,怎么回事呢?
  • ¥15 页面加载报错,不知道怎么处理