如何使用 VideoWriter 从 OpenCV 打开 GStreamer 管道

2024-01-27

我正在使用 OpenCV VideoCapture 捕获视频帧。捕获工作正常,因为我可以使用这样的框架:

cv::VideoCapture cap("v4l2src device=/dev/video1 ! videoscale ! videorate ! video/x-raw, width=640, height=360, framerate=30/1 ! videoconvert ! appsink");
cv::imshow("feed", frame);

我还想通过网络发送流,这就是我陷入困境的地方。不知怎的,我在 appsrc 管道部分失败了。我想将流编码为 jpeg 并通过 udp 发送。这就是我得到的:

cv::VideoWriter writer
writer.open("appsrc ! videoconvert ! jpegenc ! jpegparse ! rtpjpegpay pt=96 ! udpsink host=192.168.1.25 port=5000", 0, (double)30, cv::Size(640, 360), true);

看起来上面的行没有做任何事情。这writer << frame不执行任何操作。此外,此 gstreamer 命令不显示任何内容:

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

我不知道我哪里失败了writer.open部分。如果我像下面这样运行 gstreamer 命令,它们就会工作:

gst-launch-1.0 v4l2src device=/dev/video1 ! videoscale ! videorate ! video/x-raw, width=640, height=360, framerate=30/1 ! jpegenc ! jpegparse ! rtpjpegpay pt=96 ! udpsink host=192.168.1.25 port=5000
gst-launch-1.0 udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)96" ! rtpjpegdepay ! jpegdec ! decodebin ! videoconvert ! autovideosink

在使用 OpenCV 的 Gstreamer API 之前,我们需要一个使用 Gstreamer 命令行工具的工作管道。

Sender:OP 使用 JPEG 编码,因此该管道将使用相同的编码。

gst-launch-1.0 -v v4l2src \
! video/x-raw,format=YUY2,width=640,height=480 \
! jpegenc \
! rtpjpegpay \
! udpsink host=127.0.0.1 port=5000

接收者:水槽caps for rtpjpegdepay需要匹配srccaps of the rtpjpegpay发送者管道。

gst-launch-1.0 -v udpsrc port=5000 \
! application/x-rtp, media=video, clock-rate=90000, encoding-name=JPEG, payload=26 \
! rtpjpegdepay \
! jpegdec \
! xvimagesink sync=0

现在我们已经有了发送器和接收器的工作管道,我们可以将它们移植到 OpenCV。

Sender:

void sender()
{
    // VideoCapture: Getting frames using 'v4l2src' plugin, format is 'BGR' because
    // the VideoWriter class expects a 3 channel image since we are sending colored images.
    // Both 'YUY2' and 'I420' are single channel images. 
    VideoCapture cap("v4l2src ! video/x-raw,format=BGR,width=640,height=480,framerate=30/1 ! appsink",CAP_GSTREAMER);

    // VideoWriter: 'videoconvert' converts the 'BGR' images into 'YUY2' raw frames to be fed to
    // 'jpegenc' encoder since 'jpegenc' does not accept 'BGR' images. The 'videoconvert' is not
    // in the original pipeline, because in there we are reading frames in 'YUY2' format from 'v4l2src'
    VideoWriter out("appsrc ! videoconvert ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! jpegenc ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000",CAP_GSTREAMER,0,30,Size(640,480),true);

    if(!cap.isOpened() || !out.isOpened())
    {
        cout<<"VideoCapture or VideoWriter not opened"<<endl;
        exit(-1);
    }

    Mat frame;

    while(true) {

        cap.read(frame);

        if(frame.empty())
            break;

        out.write(frame);

        imshow("Sender", frame);
        if(waitKey(1) == 's')
            break;
    }
    destroyWindow("Sender");
}

接收者:

void receiver()
{    
    // The sink caps for the 'rtpjpegdepay' need to match the src caps of the 'rtpjpegpay' of the sender pipeline
    // Added 'videoconvert' at the end to convert the images into proper format for appsink, without
    // 'videoconvert' the receiver will not read the frames, even though 'videoconvert' is not present
    // in the original working pipeline
    VideoCapture cap("udpsrc port=5000 ! application/x-rtp,media=video,payload=26,clock-rate=90000,encoding-name=JPEG,framerate=30/1 ! rtpjpegdepay ! jpegdec ! videoconvert ! appsink",CAP_GSTREAMER);

    if(!cap.isOpened())
    {
        cout<<"VideoCapture not opened"<<endl;
        exit(-1);
    }

    Mat frame;

    while(true) {

        cap.read(frame);

        if(frame.empty())
            break;

        imshow("Receiver", frame);
        if(waitKey(1) == 'r')
            break;
    }
    destroyWindow("Receiver");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 VideoWriter 从 OpenCV 打开 GStreamer 管道 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 在工具栏右侧添加自定义视图

    我正在努力实现这一目标 计时器toolbar红色背景 I am trying to add customView in toolbar It always end s up being on extreme left just beside
  • Android重复资源错误

    我的项目编译得很好 直到我删除了一些 png 可绘制对象 并通过导航到将它们替换为矢量可绘制对象新增 gt 矢量资源 我现在得到了重复资源错误 这是我的 res 文件夹 以下是 Gradle 控制台中的错误消息 Execution fail
  • Environment.MachineName 被裁剪为 15 个字符 [重复]

    这个问题在这里已经有答案了 NET System Environment MachineName 中有一个属性 它读取由于与 Windows 98 兼容而被裁剪为 15 个字符的计算机名称 我如何获得完整 未裁剪 的姓名 我建议使用inte
  • MySQL存储引擎的困境

    我想在我的应用程序中使用两个 MySQL 数据库功能 第一个是全文搜索和交易 现在 这里的困境是我无法在一个存储引擎中获得此功能 我要么使用 MyIsam 具有全文搜索功能 要么使用 InnoDB 支持 TRANSACTION 功能 我不能
  • 能否让Unity始终不抛出Synchronization LockException?

    Unity 依赖注入容器存在一个众所周知的问题 即 SynchronizedLifetimeManager 通常会导致 Monitor Exit 方法抛出 SynchronizationLockException 然后该异常会被捕获并忽略
  • LINQ 查询的返回类型是什么?

    Is it IEnumerable
  • NetStream http 视频无法在 IOS 设备上播放

    我正在尝试在 iPad 上播放视频 我的代码如下 public function init RTMP void videoURL http rest iphone high mp4 vid new Video nc new NetConne
  • 如何将 Flutter 与 Genymotion 连接?

    我在使用 Genymotion 在 Android 模拟器上运行 Flutter 应用程序时遇到问题 启动模拟器后 我尝试过 flutter run 但没有成功 控制台显示 没有连接的设备 那么如何将 flutter 与 Genymotio
  • WPF UserControl 设计时间大小

    在 WPF 中创建 UserControl 时 我发现给它一些任意的高度和宽度值很方便 以便我可以在 Visual Studio 设计器中查看我的更改 但是 当我运行该控件时 我希望未定义高度和宽度 以便控件将展开以填充我放置它的任何容器
  • Google.com 和其他流量大的网站可以使用 Google 的 PSI API 获得“快速”排名吗?

    谷歌改变了它的PSI https developers google com speed pagespeed insights 的定义快速排名FCP低于 1000 毫秒从 90 到 75 来自 PSI 文档 为什么v4和v5中的FCP值不同
  • MRE 和 MDK 安装程序之间的区别

    关于Mono Mac安装程序 有MRE安装程序和MDK安装程序 http www go mono com mono downloads download html http www go mono com mono downloads do
  • 如何在python中读取json对象[重复]

    这个问题在这里已经有答案了 我有名为 panamaleaks50k json 的 json 文件 我想从 json 文件获取 text 字段 但它显示以下错误 JSON 对象必须是 str bytes 或 bytearray 而不是 Tex
  • Angular 2通过插值为ngClass添加值

    假设我在数组中有一些对象 让我们称该数组为 items 例如 title Title value true 我使用 ngFor 来显示它们 如下所示 h1 item title h1 现在假设我想根据 item value 是 true 还
  • Flutter无法运行,get_navigation & 主题错误

    我实际上正在尝试运行我的应用程序 但我遇到了这个错误 Running flutter pub get in riverpod stacked app Launching lib main dart on sdk gphone x86 arm
  • 如果 npm 测试失败,npm posttest 不会触发

    有没有办法在测试失败时触发 npm 的后测试 如果 package json 包含 scripts pretest echo pretest test some failed test or error posttest echo post
  • 如何使用cascade =“all,delete-orphan”制作hibernate集合的副本

    我正在尝试复制一个休眠实体 A 如下所示 A a A session get A class id session evict a a setId null session save a 然而这不起作用 我得到以下异常 org hibern
  • 条件表连接

    我的雄辩模型中有以下范围 我想为其添加两个条件 我需要帮助才能做到这一点 public function scopeImages query query gt join images as i function join join gt o
  • 关于测试驱动开发的哲学问题

    我一直对测试驱动开发很感兴趣 但当我在实际项目中尝试时 我永远无法坚持下去 当我尝试时 我不断出现几个哲学问题 你如何应对巨大的变化 当涉及到测试单一功能 一些参数 结果值 少量 副作用 时 TDD 是理所当然的 但是 当您需要彻底检修大型
  • 查找图像中的图像

    我正在寻找检测另一图像中的图像的最佳方法 我有一个小图像 想找到它在较大图像中出现的位置 这实际上是屏幕截图 从概念上讲 它就像 沃尔多在哪里 在更大的图像中进行搜索 有没有有效 快速的方法来实现这一点 速度比记忆更重要 Edit 内部 图
  • 如何使用 VideoWriter 从 OpenCV 打开 GStreamer 管道

    我正在使用 OpenCV VideoCapture 捕获视频帧 捕获工作正常 因为我可以使用这样的框架 cv VideoCapture cap v4l2src device dev video1 videoscale videorate v