找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1091|回复: 2

[求助] 多进程,生成器,推视频流相关问题

回帖奖励 1 点威望 回复本帖可获得 1 点威望奖励! 每人限 1 次

1

主题

3

帖子

3

积分

贫民

积分
3
WhutWP 发表于 2022-5-19 09:52:57 | 显示全部楼层 |阅读模式
在网上借鉴了视频读流和推流到网页的方法。首先说读流,因为要算法处理图片,为了提高实时性,设置了多进程读流方法,一个进程从摄像头读流将图片放进队列并只保留最新的视频帧,一个进程从队列取最新的图片用于处理,代码见1楼:

在运行run_single_camera()后,image_get没有启动起来,那两个测试的print没有输出出来,应该是yield关键字让这个函数变成生成器了的原因,这地方用yield是为了生成视频流,然后用flask推到网页,代码见2楼:

请问,有没有大佬知道怎么能让这个生成器启动起来,或者有什么其他的方案来实施,敬请不吝赐教。
回复

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
WhutWP  楼主| 发表于 2022-5-19 10:00:17 | 显示全部楼层
本帖最后由 WhutWP 于 2022-5-19 10:04 编辑

# 从摄像头读流,送入队列
def image_put(q, user, pwd, ip, channel=1):
    cap = cv2.VideoCapture("rtsp://%s:%s@%s/%s/%s:%s/main" % (user, pwd, ip, channel, user, pwd))
    while True:
        q.put(cap.read()[1])
        q.get() if q.qsize() > 1 else time.sleep(0.01)
# 从队列取图片,处理,生成视频流
def image_get(q, window_name):
#     cv2.namedWindow(window_name, flags=cv2.WINDOW_FREERATIO)
    while True:
        print(q)
        img = q.get()
        print(window_name)
        frame = img
        ret, jpeg = cv2.imencode('.jpg', frame)
        frame = jpeg.tobytes()
        # 创建生成器推流
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
        # cv2.imshow(window_name, img)
        # cv2.waitKey(1)
# 设置和启动进程
def run_single_camera():
    global queue, camera_ip
    user_name, user_pwd, camera_ip = "admin", "adm12345", "192.168.25.64"
    mp.set_start_method(method='spawn')  # init
    m = mp.Manager()
    queue = m.Queue(maxsize=2)
    processes = [mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)),
                 mp.Process(target=image_get, args=(queue, camera_ip))]

    for process in processes:
        process.start()
    for process in processes:
        process.join()
回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
WhutWP  楼主| 发表于 2022-5-19 10:03:49 | 显示全部楼层
# FLASK推流主要代码
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
@app.route('/video_feed')
def video_feed():
    return Resp**e(image_get(img_queue, camera_ip), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
    run_single_camera()
    app.run(host='127.0.0.1', port=5000)
回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
WhutWP  楼主| 发表于 2022-6-25 00:21:51 | 显示全部楼层
已解决,谢谢查看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表