Python Opencv 和 Sockets - 以 h264 编码的流视频

2023-11-30

所以我正在尝试制作一个流媒体,将视频从局域网上的一台计算机流式传输到另一台计算机(或目前同一台计算机)。我需要它使用尽可能少的带宽,所以我尝试用 h264 进行编码。我在做这件事时遇到了困难,我真的不知道从哪里开始。现在它是用jpg编码的,并且是逐帧发送的。然而,我知道这是非常低效的并且消耗大量带宽。这是我当前的接收器代码。

import cv2
import socket
import _pickle
import time

host = "192.168.1.196"
port = 25565
boo = True

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # declares s object with two parameters
s.bind((host, port)) # tells my socket object to connect to this host & port "binds it to it"
s.listen(10) # tells the socket how much data it will be receiving.

conn, addr = s.accept()
buf = ''
while boo:
        pictures = conn.recv(128000) # creates a pictures variable that receives the pictures with a max amount of 128000 data it can receive
        decoded = _pickle.loads(pictures) # decodes the pictures
        frame = cv2.imdecode(decoded, cv2.IMREAD_COLOR) # translates decoded into frames that we can see!
        cv2.imshow("recv", frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):  # wait until q key was pressed once and
            break

这是我当前的客户端代码(发送者):

import cv2
import numpy as np
import socket
import _pickle
from cv2 import *

host = "192.168.1.196"
port = 25565

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # declares s object with two parameters
s.connect((host, port))  # connects to the host & port
cap = cv2.VideoCapture(1)
cv2.cv.CV_FOURCC('H','2','6','4')
while cap.isOpened(): # while camera is being used
    ret, frame = cap.read()  # reads each frame from webcam
    cv2.imshow("client", frame)
    if ret:
        encoded = _pickle.dumps(cv2.imencode("fourcc", frame)[1]) # encoding each frame, instead of sending live video it is sending pictures one by one
        s.sendall(encoded)
    if cv2.waitKey(1) & 0xFF == ord("q"): # wait until key was pressed once and
        break
cap.release()
cv2.destroyAllWindows()

我只需要一些有关如何对视频进行编码并以 h264 进行解码的帮助。


您可以使用以下方法执行此操作pyzmq以及发布/订阅具有 Base64 字符串编码/解码的模式。在服务器端,想法是:

  • 从相机流中获取帧
  • 从内存缓冲区读取图像cv2.imencode
  • Convert ndarray into str使用 base64 并通过套接字发送

在客户端,我们只需反转该过程:

  • 从套接字读取图像字符串
  • Convert str into bytes与base64
  • Convert bytes into ndarray with np.frombuffer + cv2.imdecode

此方法不应使用太多带宽,因为它仅通过套接字发送字符串。


Server

import base64
import cv2
import zmq

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect('tcp://localhost:7777')

camera = cv2.VideoCapture(0)

while True:
    try:
        ret, frame = camera.read()
        frame = cv2.resize(frame, (640, 480))
        encoded, buf = cv2.imencode('.jpg', frame)
        image = base64.b64encode(buf)
        socket.send(image)
    except KeyboardInterrupt:
        camera.release()
        cv2.destroyAllWindows()
        break

Client

import cv2
import zmq
import base64
import numpy as np

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.bind('tcp://*:7777')
socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))

while True:
    try:
        image_string = socket.recv_string()
        raw_image = base64.b64decode(image_string)
        image = np.frombuffer(raw_image, dtype=np.uint8)
        frame = cv2.imdecode(image, 1)
        cv2.imshow("frame", frame)
        cv2.waitKey(1)
    except KeyboardInterrupt:
        cv2.destroyAllWindows()
        break
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Opencv 和 Sockets - 以 h264 编码的流视频 的相关文章

随机推荐

  • 如何在我的本地 Geth 账户中获取一些以太币?

    我已经设置了 Geth 并创建了一些没有余额的帐户 所以我无法进行任何交易 因为它需要花费 Gas 费 如何创建具有一些初始余额的帐户 以便我可以测试我的合同 我使用以下命令创建了帐户 gt personal newAccount 假设您正
  • 确保 for 循环中的可观察对象在执行其他代码之前全部完成

    我有一段代码 如下所示 getPersons subscribe persons gt for const person of persons getAddress person id subscribe address gt person
  • Android 11 - 访问Android/data目录

    除了 root 之外 还有什么方法可以访问 Android 11 上的 SD 卡的 android data 目录吗 我的 非 Play 商店 应用程序需要访问另一个应用程序的公共 Android data com appname 文件夹
  • PHP 8.1.1 的 __toString() 方法问题 - 如果在声明类本身之前创建实例,则导致找不到类

    从 PHP 7 3 升级到 8 1 1 后遇到问题 当然还有很多事情要做 但这有点奇怪 这个例子对我不起作用 出现错误致命错误 未捕获错误 找不到类 TestC C xampp81 htdocs helpdesk811 test81 ind
  • 修复了滚动项目时导航抽屉中的导航标题

    当前状态 具有 NavigationHeader 和 NavigationMenu 项的 NavigationDrawer 这些项目数量很大 因此需要滚动才能访问底部的项目 要求 向下滚动到底部时 导航标题应保持固定 这是我的 Activi
  • Flutter:英雄过渡+小部件动画同时进行?

    因此 我对 Flutter 的特定动画案例有一些疑问 基本上 我想做的是同时运行用于路线更改的英雄过渡和相邻小部件上的自定义动画 具体来说 我的根目录中有一个自定义的 InheritedWidget 它从 StatefulWidget 父级
  • 获取 XMPP 聊天历史记录 OpenFire

    我正在尝试使用 iOS 中的 XMPPFramework 和 OpenFire 服务器来实现聊天应用程序 我的聊天工作正常 我正在尝试从服务器检索聊天历史记录 当然 我已经在服务器上启用了邮件存档 这是我发送的请求
  • 如何在 Objective-C 中保持会话?

    所以我遇到了以下问题 我有一个登录视图控制器和一个表单视图控制器 在登录视图控制器上 我向 PHP 脚本发送 POST 请求 该脚本验证用户是否具有访问权限 该脚本仅返回 1 或 0 因此我可以选择关闭或维护视图控制器 当凭据正确传递时 用
  • C# 中的对象指针(object*)

    我想要做的是 我想传递一个指向函数的指针 该函数可以是任何类型的变量 int long string 甚至是一个类 我的意思是我应该能够传递任何变量的指针 我就是这样做的 unsafe class whatever whatever obj
  • 声明原子指针与原子指针

    据我所知 以下声明创建了一个值数组 每个值都是原子的 Atomic int x 10 但是 我不清楚这是否 Atomic int x x calloc 10 sizeof int 创建一个包含 10 个原子整数的数组 或者是指向非原子整数数
  • 计算文本的正确宽度

    我需要阅读由 AutoCAD 导出为 PDF 的计划 并使用 PDFBox 在其上放置一些带有文本的标记 除了计算写在标记旁边的文本宽度之外 一切正常 我浏览了整个 PDF 规范并详细阅读了涉及图形和文本的部分 但无济于事 据我了解 字形坐
  • Mac OS 10.16 链接 Homebrew 安装的库

    我已经使用自制程序很长时间了 从未遇到过这个奇怪的问题 由于某种原因 我不会在这里解释我使用的是 MacOS 10 16 Big Sur 这是最新 MacOS 的 Beta 版本 并且已经使用自制软件安装了库 其中一个图书馆是zlib 但是
  • XPath max 函数和括号的使用

    假设我们有以下 XML
  • 无法找出注册表中的 ActiveRecord::SubclassNotFound#edit?

    当处于 编辑 或 显示 状态时 会出现以下情况 ActiveRecord SubclassNotFound 在注册表中 edit 单表继承机制无法定位子类 Plane 出现此错误是因为列 type 被保留用于在继承时存储类 如果您不希望这样
  • 为什么他们在 Mongoose Population 示例中使用 ObjectId 和 Number?

    In this例如 他们创建personSchema using ObjectId来参考Story我明白这一点 但随后在storySchema他们为什么不做同样的事情来引用这个人呢 或者反过来 为什么在 Person 中使用 ObjectI
  • 获取表的列名并将它们存储在字符串或var中c#asp.net

    我想知道如何获取数据库表的列并将它们存储在字符串或字符串数 组中 我有以下代码 但我相信它不起作用 我正在使用 asp net 中给出的默认表 我已经能够毫无问题地写入该表 但我不知道如何从中选择并保存检索到的值 这是我后面的代码中的内容
  • 传递类方法而不是 std::sort 中的函数

    在一个类中 我试图通过传递同一类的方法来对向量进行排序 但是编译的时候会报错 谁能告诉我问题是什么吗 谢谢你 它给出以下错误 类型参数bool Sorter D D does not match书 排序器 D D c 我也尝试过使用sort
  • tao SimpleOpenGlControl 错误

    我正在创建一个包含 Tao Platform Windows SimpleOpenGlControl 的用户控件 在我的控件的构造函数中 我有 InitializeComponent simpleOpenGlControl1 Initial
  • 将 javascript 变量发送到经典 asp

    我有一个基于 jQuery 的成本计算器 我希望网页能够通过电子邮件发送计算 器值的摘要 服务器在经典 ASP 上运行 如何使用 ASP 检索 javascript 变量 据我了解 ASP 代码在页面加载之前运行 而 javascript
  • Python Opencv 和 Sockets - 以 h264 编码的流视频

    所以我正在尝试制作一个流媒体 将视频从局域网上的一台计算机流式传输到另一台计算机 或目前同一台计算机 我需要它使用尽可能少的带宽 所以我尝试用 h264 进行编码 我在做这件事时遇到了困难 我真的不知道从哪里开始 现在它是用jpg编码的 并