在 gstreamer 中动态添加和删除 tee 队列

2024-04-11

我编写了gstreamer代码,用于同时进行摄像头直播和录制。

我的管道看起来像这样:

                 /  [ queue1 | videosink ]           
v4l2src | tee         
                 \  [ queue2 | filesink ]        

目前直播和文件录制正在协同工作。

现在我需要启动只有一个队列的管道,即队列1(实时流媒体队列),过了一会儿我需要添加录制队列并动态删除它。

我的工作代码如下:

    pipeline = gst_pipeline_new ("rv_camera");

    /*Create source element. We use mfw_v4lsrc from Freescale as source */

    source= gst_element_factory_make (GSTREAMER_SOURCE,"camera-source");
    g_object_set(G_OBJECT(source),"device",camDeviceName, (char *)0);

    /*Set default properties of mfw_v4lsrc */
    g_object_set(G_OBJECT(source),"capture-width", CAMERA_CAPTURE_WIDTH,
                                  "capture-height", CAMERA_CAPTURE_HEIGHT,
                                  "sensor-width", CAMERA_SENSOR_WIDTH,
                                  "sensor-height", CAMERA_SENSOR_HEIGHT,
                                  "preview", CAMERA_PREVIEW_DISPLAY,
                                  "preview-width",CAMERA_PREVIEW_WIDTH,
                                  "preview-height",CAMERA_PREVIEW_HEIGHT,
                                  "fps-n",CAMERA_FRAMERATE,
                                  "rotate",mirror_effect,
                                  (char *)0);


    /* Tee that copies the stream to multiple outputs */
        tee = gst_element_factory_make("tee", "tee");

        /* Queue creates new thread for the stream */
        screen_queue = gst_element_factory_make("queue", "screen_queue");

    /*Create sink element. We use mfw_v4lsink from Freescale as sink. fbdevsink is not used as
      it directly writes into framebuffer which is not desired*/
    sink= gst_element_factory_make (GSTREAMER_SINK,"video-output");

    capture_queue = gst_element_factory_make("queue", "capture_queue");

    encoder = gst_element_factory_make("mfw_vpuencoder", "encoder");
    g_object_set(G_OBJECT(encoder),"codec-type",0,
                                   "mirror-direction",0,
                                    (char *)0);

    clockoverlay = gst_element_factory_make("clockoverlay", "Timestamp");
    g_object_set(G_OBJECT(clockoverlay),"time-format","%R %d-%b-%Y", (char *)0);

    avimux = gst_element_factory_make("avimux", "avimux");

    filesink = gst_element_factory_make("filesink", "file-output");
    g_object_set(G_OBJECT(filesink),"location","/KPIT/OBITS/Blackbox/OBITS-SCNLog.avi", (char *)0);



    /* Check if all elements are created or not*/
    if (!pipeline || !source || !tee || !screen_queue || !sink || !capture_queue || !clockoverlay || !encoder || !avimux || !filesink) {
        LOGERR((TEXT("GstreamerStream :: camInit: 1 One or more element(s) could not be created .... logerr\n")));
        return CAM_STATUS_INIT_FAIL;
    }

    /* we add all elements into the pipeline */
    gst_bin_add_many (GST_BIN (pipeline),source,tee,screen_queue, sink, capture_queue,clockoverlay,encoder,avimux,filesink, (char *)0);

    /* we link the elements together */
   if( gst_element_link_many( source, tee, NULL ) &&  gst_element_link_many( tee,screen_queue,sink, NULL ) &&
           gst_element_link_many( tee,capture_queue,clockoverlay,encoder,avimux,filesink, NULL ))
   {
         bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));

        /*Add watch to look for error events */
        gst_bus_add_watch(bus, process_events, this);

        gst_object_unref(bus);

        }
        gst_element_set_state (pipeline, GST_STATE_PLAYING);

请让我知道如何动态添加或删除任何队列。

如果有人可以提供与此相关的示例代码,我将不胜感激。


将 T 形件保留在管道中,您可以在播放期间随时从 T 形件请求/释放打击垫。请求打击垫并将新元素添加到管道中,链接它们,并将它们设置为播放。完成后,取消链接该分支并记住向其发送 EOS 以正确完成录制。从文件接收器收到 EOS 消息后,您可以关闭、删除和取消引用您取消链接的分支。

如果您使用的是 0.10(不要使用它,请移至 1.0),那么在添加新分支后,您可能需要将分段事件发送到新分支。

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

在 gstreamer 中动态添加和删除 tee 队列 的相关文章

随机推荐

  • 支持 DB2 和 IBM Cloud php 应用程序的 github php buildpack

    我们在 IBM Cloud 上有一个连接到 DB2 实例 也在 IBM Cloud 上 的 PHP 应用程序 该应用程序已经完美运行了 2 年 截至 9 月 16 日 我们使用构建包 https github com ibmdb php b
  • RevealViewController() 总是返回 nil

    我遇到了一些麻烦revealViewController在 Xcode 7 2 和 iOS 9 2 中 我的应用程序从嵌入导航控制器中的视图控制器开始 以执行登录 登录后 或者如果存在登录令牌 我会使用以下代码跳转到嵌入导航控制器中的另一个
  • 有哪些不同类型的封装?

    有哪些不同类型的封装 我是否认为这基本上指的是核心面向对象概念 例如抽象 多态性和继承 我对封装的理解是 它是一种隐藏数据 功能的方法 但我从未真正考虑过多态性或继承是封装的一种形式 尽管我可以看到多态性如何被视为封装 因为它可以隐藏您的对
  • 如何在 protobuf-csharp-port 和 protobuf-net 之间进行选择

    我最近不得不寻找最初由 Google 开发的 Protocol Buffers 库的 C 移植 你猜怎么着 我在这里发现了两个由两个非常知名的人拥有的项目 protobuf csharp 端口 http code google com p
  • 比较两个数据库的结构?

    我想问是否可以比较两个巨大数据库的完整数据库结构 我们有两个数据库 一个是开发数据库 另一个是生产数据库 有时我会忘记在发布部分代码之前对生产数据库进行更改 这会导致生产数据库不具有相同的结构 因此如果我们发布某些内容 就会出现一些错误 有
  • 如何将我的 React-App 部署到 github 用户页面

    我一整天都在努力将我的 React 应用程序部署到 Github 用户页面 例如https mygitname github io http 而不是 Github 页面 例如https mygitname github com mysite
  • 从动态复选框列表中获取值

    See my html
  • 错误 TypeError:无法读取 Angular 7 拖放中未定义的属性“长度”

    我只是想在 Angular 7 的帮助下创建拖放组件DragDropModule from angular cdk drag drop 但我总是收到如下错误 HomeComponent html 14 ERROR TypeError Can
  • 如何创建带有括号和参数的自定义 jquery 函数

    我知道我的问题需要更多澄清 所以让我解释一下 当我访问 fn extend 的 jquery api 文档时 我个人对创建如下所示的自定义 jquery 函数是多么容易感到震惊 input type checkbox check 链接在这里
  • 如何使用react.js上传Excel工作表文件并将数据显示到表格

    我是 React JS 的新手 我正在尝试使用react js上传Excel工作表文件并将数据显示到表格中 我有 链接中的部分参考 但并不完整 请帮忙解决一下 从 Excel 导入数据并在 React 组件中显示 https stackov
  • MVC 3 应用程序中的自定义 Http 处理程序

    我正在使用 Http 处理程序来本地化应用程序中使用的 javascript 文件 看 在 ASP NET 中本地化 JavaScript 文件中的文本 http madskristensen net post Localize text
  • Gulp - 处理多个主题和文件夹

    我正在努力创造一个终极gulpfile我们可以在我们的大型网站之一上使用它 一个具有多个主题 具体取决于您所在网站的部分 我试图让它只运行它需要运行的进程 而不是重新编译所有内容 让我准确地布局我想要实现的目标 文件夹结构 src mast
  • C# 反射:获取解决方案中的“所有”活动程序集?

    这是我的问题 我有 2 个项目 一个 常见 项目 其行为类似于具有各种支持代码的库 以及在许多调用中使用所述项目的实际程序 我们将这些项目称为 Common 和 Program 它们都在同一个解决方案中 在 Common 中 我有一个用于常
  • 使用我自己的 Laravel API 时如何遵循“不重复”原则?

    我正在开发一个 Laravel 4 应用程序 它将通过 JSON REST API 和 Web UI 对我的数据集提供相同的 CRUD 操作 看来 为了防止违反 DRY 原则 我的 UI 应该通过将所有请求从 UI 路由回 API 来使用我
  • 将 Rails/Unicorn/Nginx 容器连接到 MySQL 容器

    相关this https stackoverflow com questions 31735529 docker image from existing rails unicorn mysql app线程 我正在尝试创建 2 个容器 1 个
  • Service Fabric:找不到 EntryPoint Blah.exe

    我进行了一些项目重命名并更改了文件夹结构 现在我无法将服务结构应用程序部署到本地服务结构集群 Register ServiceFabricApplicationType 找不到 EntryPoint IdentityService exe
  • Selenium 代码不会终止

    以下代码不会终止 原因可能是什么 from selenium import webdriver from selenium webdriver common keys import Keys driver webdriver Firefox
  • Mod_Rewrite 规则冲突让我发疯

    我有一个 htaccess 如下 有些规则是冲突的 我需要以某种方式制定一个条件 这样他们就不会 RewriteEngine On RewriteRule search results template php L RewriteRule
  • 使用 Composer 安装 PEAR 扩展 HTTP_Request2

    我有一个composer json file name vendor Project description description text repositories type pear url http pear php net req
  • 在 gstreamer 中动态添加和删除 tee 队列

    我编写了gstreamer代码 用于同时进行摄像头直播和录制 我的管道看起来像这样 queue1 videosink v4l2src tee queue2 filesink 目前直播和文件录制正在协同工作 现在我需要启动只有一个队列的管道