在Python中将gstreamer管道转换为opencv

2023-12-12

我使用以下 gstreamer 命令创建了一个网络流:

sender:

gst-launch-1.0 -v videotestsrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=X.X.X.X port=5000

接收者:

gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink

这很好用。我现在想将接收端的流包含在 python 脚本中。在脚本中我想用opencv做一些视频处理。

有谁知道如何转换所描述的管道,以便它可以与opencv一起使用?

Thanks!

edit1:

发现这应该有效:

cap = cv2.VideoCapture("udpsrc port=5000 ! application/x- rtp,media=video,payload=26,clock-rate=90000,encoding-name=H264, payload=96 ! rtph264depay ! decodebin ! videoconvert ! appsink", cv2.CAP_GSTREAMER)

我收到以下错误:

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/nvidia/build-opencv/opencv/modules/highgui/src/window.cpp, line 331 Traceback (most recent call last): File "launchstream_ip.py", line 13, in <module> cv2.imshow('frame', frame) cv2.error: /home/nvidia/build-opencv/opencv/modules/highgui/src/window.cpp:331: error: (-215) size.width>0 && size.height>0 in function imshow

import numpy as np
import cv2
from multiprocessing import Process

def send():
    cap_send = cv2.VideoCapture('videotestsrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! appsink', cv2.CAP_GSTREAMER)
    out_send = cv2.VideoWriter('appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000',cv2.CAP_GSTREAMER,0, 20, (320,240), True)

    if not cap_send.isOpened() or not out_send.isOpened():
        print('VideoCapture or VideoWriter not opened')
        exit(0)

    while True:
        ret,frame = cap_send.read()

        if not ret:
            print('empty frame')
            break

        out_send.write(frame)

        cv2.imshow('send', frame)
        if cv2.waitKey(1)&0xFF == ord('q'):
            break

    cap_send.release()
    out_send.release()

def receive():
    cap_receive = cv2.VideoCapture('udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! appsink', cv2.CAP_GSTREAMER)

    if not cap_receive.isOpened():
        print('VideoCapture not opened')
        exit(0)

    while True:
        ret,frame = cap_receive.read()

        if not ret:
            print('empty frame')
            break

        cv2.imshow('receive', frame)
        if cv2.waitKey(1)&0xFF == ord('q'):
            break

    cap_receive.release()

if __name__ == '__main__':
    s = Process(target=send)
    r = Process(target=receive)
    s.start()
    r.start()
    s.join()
    r.join()

    cv2.destroyAllWindows()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中将gstreamer管道转换为opencv 的相关文章

随机推荐

  • 如何在javafx中创建动态可调整大小的形状?

    我有三个问题 我想创建带有框边界的可调整大小的形状 我还想知道如何在窗格中选择子项 我正在一个窗格上创建多个形状 我想改变该形状的一些属性 比如填充 我该怎么做 Thanx 下一个例子将回答您的问题 对于 1 它使用绑定 将窗格大小与矩形大
  • 通过邮件发送用户选择的附件

    问题 我希望用户可以向我发送带有附件的邮件 他们可以使用 html 中的输入文件按钮选择文件 问题是找不到该文件 无需附件即可正常工作 我收到这个错误 文件 C 程序文件 x 86 ExpressGIPENGLISH pptx 找不到 II
  • ISO 8601 测试用例的 ECMAScript 5 Date.parse 结果

    以下测试用例的正确结果是什么 Chrome 19 Opera 12 Firefox 11 IE 9 Safari 5 1 1 console log Date parse 2012 11 31T23 59 59 000Z 135440639
  • ArUco 位姿估计中的不稳定值

    我正在尝试使用 Aruco 标记找到相机的方向 从旋转矩阵中提取的欧拉角在超过某一点时不稳定 随着相机与标记的距离增加 相机的偏航角值不稳定 标记上的 Z 轴翻转 欧拉角不稳定 每帧都不相同 需要时间才能稳定 如何获得相机和标记之间的偏航角
  • HTML/CSS 中带 div 的水平(内联)列表

    我正在尝试构建一个简单的水平列表 其中每个列表项都是一个 div 我希望它们全部坐在一起 当我尝试使用下面的代码时 div 最终会出现在不同的行上 这是我所得到的 HTML ul li div div li li div div li li
  • 为Android开发创建库?

    我对 Android 开发还很陌生 但我对 Java 和 Eclipse 有一些经验 我正在寻找创建可重用库 控件 帮助程序 标准 活动等 的方法 这些库可以在我自己的项目中使用 但也可以在不公开源代码的情况下分发给其他开发人员 通常 我会
  • 将十进制小时转换为 HH:MM:SS

    我正在寻找一种将十进制小时转换为 HH MM SS 的方法 例如 作为输入 4 927778 hours 期望的输出 04 55 40 你可以尝试下面的方法 dh lt 4 927778 strftime as POSIXct dh 60
  • 如何删除空格并检查字符串是否是回文?

    我试图弄清楚如何删除空格 然后检查删除空格的字符串是否是回文 我已经分别尝试了这两件事 但我无法让它们一起工作 int check palindrome char int main char s1 20 printf Enter the s
  • QPixmap 保持纵横比

    我正在编写一个程序 允许我通过他们的 API 将照片上传到 TUMBLR 我已经可以正常上传了 谢谢你们 我在 GUI 的一侧放置了一个 queueBox 它显示图像名称 并且它们存储在 QListWidget 中 我已将其放入主类的构造函
  • 错误:无法使用 Spark-submit 加载类 main

    我的代码如下 import org apache spark SparkContext import org apache spark SparkConf object WordCounter def main args Array Str
  • WCF/.NET 中的 C# UTC 日期时间查询

    这是一个非常简单 希望如此 的问题 我刚开始在 NET 中使用日期时间转换 我有一个 WCF 服务 它有一个 DateTime 属性 称之为 BookingDate 有人以以下格式将其传递给我的 WCF 服务
  • 如何将 jar 中的域类导入 Micronaut 项目?

    我有一个配置为使用 GORM 和 Groovy 1 的 Micronaut 项目 该项目包含许多运行良好的域类 按预期将数据保存在 MySQL 数据库中 现在我希望使这个域类对于另一个 Micronaut 项目 2 是通用的 我尝试构建一个
  • babel-node es6“REPL 不支持模块”

    babel preset es2015已安装 并且可以使用 es6 功能 如下所示let a 2 但无法使用 es6 模块功能import fs from fs 如下 babel node presets es2015 gt let a 2
  • 机器人框架从 JSON 列表获取

    我有这样的数据 embedded attr name attr value 1 attr name attr name 2 我想获得第一个属性attr value 1 你知道如何在机器人框架中做到这一点的好方法吗 就像是Get JSON e
  • 将值分配给 Pandas 数据框中的行子集

    我想根据 Pandas DataFrame 中索引的条件分配值 class test def init self self l 1396633637830123000 self dfa pd DataFrame np arange 20 r
  • 将事件附加到 DataGridView 单元格底层的 TextBox

    有没有办法获得 DataGridView 单元格的底层控制 我想附加普通的文本框事件来捕获击键并捕获更改的值 所以我有 4 列 每一列都包含多个单元格 一行中的所有单元格应根据其类型以不同的方式处理 基本上我需要仅在编辑单元格时触发我的事件
  • 为什么特定站点上的 HTTP/2 在 FF 中有效,但在同一台 Windows 10 计算机上的 Chrome、IE 和 Edge 中不起作用?

    我有一个网站 在 Ubuntu 16 04 服务器 OpenSSL 1 0 2h 上的 Nginx 1 10 0 上运行 我想通过 HTTP 2 为该网站提供服务 因此我相应地配置了 Nginx listen 443 ssl http2 d
  • 我的代码如何判断它是在 Google 服务器上运行还是在我的本地开发服务器上运行? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Python 中 如何测试我是否在 Google App Engine SDK 中 是否有一个环境标志可以告诉我的代码是在生产服务器上运行还是在开发服务器上运行 我希望能够使用 if 语句根据此标
  • $a = $(Read-Host) 和 $a = (Read-Host) 有什么区别?

    我必须查看我的前同事留下的一些脚本 我很好奇他为什么使用 a Read Host Prompt Write something 在参数部分而不是 a Read Host Prompt Write something 我已经在单个脚本中对其进
  • 在Python中将gstreamer管道转换为opencv

    我使用以下 gstreamer 命令创建了一个网络流 sender gst launch 1 0 v videotestsrc video x raw framerate 20 1 videoscale videoconvert x264e