Videomixer 在源上失败,而不是在 Videotestsrc 上失败

2024-02-02

我想在一个视频文件中同时播放两个不同的本地视频文件 窗户。下面的代码在没有解复用器和解码器的情况下工作正常。

    static void play_video(){

    GMainLoop *loop;
    GstElement *pipeline,*videomixer;
    GstElement *src,*sink,*filter,*csp,*videobox;
    GstElement *src1,*filter1,*csp1,*videobox1;
    GstElement *srcb,*filterb,*cspb,*videoboxb;
    GstCaps *filtercaps,*filtercaps1,*filtercapsb;
    GstPad *pad,*pad1;

    const char pattern = "snow";

    loop = g_main_loop_new(NULL, FALSE);

    pipeline = gst_pipeline_new("my-pipeline");

    src = gst_element_factory_make ("videotestsrc","src");
    src1 = gst_element_factory_make ("videotestsrc","src1");

    g_object_set (G_OBJECT (src), "pattern", 10, NULL);

    filter = gst_element_factory_make("capsfilter","filter");
    filter1 = gst_element_factory_make("capsfilter","filter1");

    csp = gst_element_factory_make("ffmpegcolorspace","csp");
    csp1 = gst_element_factory_make("ffmpegcolorspace","csp1");

    /**/

    videobox=gst_element_factory_make("videobox","videobox");
    g_object_set(videobox,"top",0,"bottom",0,"left",0,"right",0,NULL);
    videobox1=gst_element_factory_make("videobox","videobox1");
    g_object_set(videobox1,"top",-20,"bottom",0,"left",0,"right",0,NULL);

    videomixer=gst_element_factory_make("videomixer","videomixer");



      /**/
      sink = gst_element_factory_make("xvimagesink","sink");
       if(sink == NULL)
       sink = gst_element_factory_make("ximagesink","sink");
       if(sink == NULL)
       g_error("'ximagesink' yaratılamadı.");




    gst_bin_add_many(GST_BIN(pipeline),src,filter,videobox,videomixer,csp,sink,
                src1,filter1,videobox1,csp1,NULL);



    gst_element_link_many(src,filter,csp,videobox,videomixer,NULL);
    gst_element_link_many(src1,filter1,csp1,videobox1,videomixer,NULL);



     /*
     videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=1/1, width=350,
height=250 ! \
     textoverlay font-desc="Sans 24" text="CAM2" valign=top halign=left
shaded-background=true ! \
     videobox border-alpha=0 top=-200 left=-450 ! mix. \


    */


     gst_element_link_many(videomixer,sink,NULL);

     filtercaps = gst_caps_new_simple ("video/x-raw-rgb",
          "width", G_TYPE_INT, 1024,
          "height", G_TYPE_INT, 768,
          "framerate", GST_TYPE_FRACTION, 25, 1,
          "bpp", G_TYPE_INT, 16,
          "depth", G_TYPE_INT, 16,
          "endianness", G_TYPE_INT, G_BYTE_ORDER,
          NULL);

     filtercaps1 = gst_caps_new_simple ("video/x-raw-rgb",
          "width", G_TYPE_INT, 200,
          "height", G_TYPE_INT, 500,
          "framerate", GST_TYPE_FRACTION, 25, 1,
          "bpp", G_TYPE_INT, 16,
          "depth", G_TYPE_INT, 16,
          "endianness", G_TYPE_INT, G_BYTE_ORDER,
          NULL);

      g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
      gst_caps_unref (filtercaps);

      g_object_set (G_OBJECT (filter1), "caps", filtercaps1, NULL);
      gst_caps_unref (filtercaps1);

      /*pad = gst_element_get_pad (src, "src");
      pad1 = gst_element_get_pad (src1, "src1");

      //gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL);
      //gst_pad_add_buffer_probe (pad1, G_CALLBACK (cb_have_data), NULL);
      //gst_object_unref (pad);
      //gst_object_unref (pad1);*/

      /* run */
      gst_element_set_state (pipeline, GST_STATE_PLAYING);

      /* wait until it's up and running or failed */
       if (gst_element_get_state (pipeline, NULL, NULL, -1) ==
       GST_STATE_CHANGE_FAILURE) {
       g_error ("Failed to go into PLAYING state");
      }

      g_print ("Running ...\n");
      g_main_loop_run (loop);

     /* exit */
     gst_element_set_state (pipeline, GST_STATE_NULL);
     gst_object_unref (pipeline);
     }

问题是当我用 filesrc 替换 videotestsrc 时它失败并且 我收到的唯一错误消息是“无法在信号销毁时查找对象 NULL” 对象窗口”。我不是 gstreamer 专家,我的观点是我是 设置解复用器和解码器失败。

static void play_video5(){


       GMainLoop *loop;
   GstElement *pipeline,*videomixer;
   GstElement *src,*sink,*filter,*csp,*videobox;
   GstElement *src1,*filter1,*csp1,*videobox1;
   GstElement *srcb,*filterb,*cspb,*videoboxb;
   GstCaps *filtercaps,*filtercaps1,*filtercapsb;
   GstPad *pad,*pad1;

       GstElement *demux,*decoder;

   const char pattern = "snow";

   loop = g_main_loop_new(NULL, FALSE);

   pipeline = gst_pipeline_new("my-pipeline");


       //Source
   src = gst_element_factory_make ("videotestsrc","src");

       src1 = gst_element_factory_make ("filesrc","src1");
       g_object_set (G_OBJECT (src1), "location", "file:///root/yu.mp4", NULL);

       //Demux

       demux = gst_element_factory_make ("mpegdemux", "demux");

       //Decoder
       decoder = gst_element_factory_make ("decodebin", "decoder");
//      decoder = gst_element_factory_make ("ffdec_mpeg4","mpeg4-decoder");

       //Filter
   filter = gst_element_factory_make("capsfilter","filter");
   filter1 = gst_element_factory_make("capsfilter","filter1");

       //Colorspace
   csp = gst_element_factory_make("ffmpegcolorspace","csp");
   csp1 = gst_element_factory_make("ffmpegcolorspace","csp1");


       //Videobox
   videobox=gst_element_factory_make("videobox","videobox");
   g_object_set(videobox,"top",0,"bottom",0,"left",0,"right",0,NULL);
   videobox1=gst_element_factory_make("videobox","videobox1");
   g_object_set(videobox1,"top",-20,"bottom",0,"left",0,"right",0,NULL);

       //videomixer
   videomixer=gst_element_factory_make("videomixer","videomixer");

       //Sink
   sink = gst_element_factory_make("xvimagesink","sink");
   if(sink == NULL)
       sink = gst_element_factory_make("ximagesink","sink");
       if(sink == NULL)
       g_error("'ximagesink' yaratılamadı.");


       //Add to Bin
   gst_bin_add_many(GST_BIN(pipeline),src,filter,videobox,videomixer,csp,
                src1,decoder,filter1,videobox1,csp1,sink,NULL);

       //Link Elements
       gst_element_link(src,filter);
       gst_element_link(filter,csp);
       gst_element_link(csp,videobox);
       gst_element_link(videobox, videomixer);

       gst_element_link(src1,decoder);
       gst_element_link(decoder,filter1);
//      gst_element_link(decoder,csp1);
       gst_element_link(filter1,csp1);
       gst_element_link(csp1,videobox1);
       gst_element_link(videobox1, videomixer);

       gst_element_link(videomixer,sink);



       //Cap definition
   filtercaps = gst_caps_new_simple ("video/x-raw-rgb",
          "width", G_TYPE_INT, 1024,
          "height", G_TYPE_INT, 768,
          "framerate", GST_TYPE_FRACTION, 25, 1,
          "bpp", G_TYPE_INT, 16,
          "depth", G_TYPE_INT, 16,
          "endianness", G_TYPE_INT, G_BYTE_ORDER,
          NULL);

   filtercaps1 = gst_caps_new_simple ("video/x-raw-yuv",
          "width", G_TYPE_INT, 640,
          "height", G_TYPE_INT, 480,
          "framerate", GST_TYPE_FRACTION, 25, 1,
          /*"bpp", G_TYPE_INT, 16,
          "depth", G_TYPE_INT, 16,
          "endianness", G_TYPE_INT, G_BYTE_ORDER,*/
          NULL);

       //Cap to Filter
   g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
   gst_caps_unref (filtercaps);

   g_object_set (G_OBJECT (filter1), "caps", filtercaps1, NULL);
   gst_caps_unref (filtercaps1);


   /* run */
   gst_element_set_state (pipeline, GST_STATE_PLAYING);

   /* wait until it's up and running or failed */
   if (gst_element_get_state (pipeline, NULL, NULL, -1) ==
GST_STATE_CHANGE_FAILURE) {
       g_error ("Failed to go into PLAYING state");
   }

   g_print ("Running ...\n");
   g_main_loop_run (loop);

   /* exit */
   gst_element_set_state (pipeline, GST_STATE_NULL);
   gst_object_unref (pipeline);
}

欢迎任何想法或更正。


几个问题:

  • filesrc 不采用 uri,而是采用文件路径
  • /* 等到它启动并运行或失败 */ + 下面的代码不是必需的,最好在总线上监听错误和警告消息
  • “在对象窗口信号销毁时无法查找对象 NULL”与 gstreamer 无关
  • 不需要整个 videobox 业务,因为 videomixer 的 pad 具有 xpos、ypos 和 zorder 属性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Videomixer 在源上失败,而不是在 Videotestsrc 上失败 的相关文章

  • gstreamer appsrc 适用于 xvimagesink 但不适用于 theoraenc !奥格多路复用器

    我正在尝试使用 gstreamer 和icecast 流式传输计算机生成的视频 但我无法让 gstreamer appsrc 工作 如果我使用 xvimagesink 作为接收器 我的应用程序将按预期工作 请参阅下面的注释代码 但是一旦我将
  • 如何将 gst-rtsp-server 与自己的管道一起使用?

    我正在编写 gstreamer 应用程序 需要通过 rtsp 传输输出音频 视频流 但在gst rtsp server我建立的例子factory创作仅由gst launch syntax factory gst rtsp media fac
  • GStreamer gst_element_factory_make 失败

    我正在尝试 GStreamer 测试应用程序 但在运行时以下行失败 demuxer gst element factory make oggdemux ogg demuxer returns NULL 我使用 MacOSX 并通过 MacP
  • 如何正确安装 PyGObject? (操作系统)

    我想运行现有的简单示例并使用 GStreamer 编写一些简单的代码 具体来说 使用其 Python 绑定 我想安装软件包等来启用它 这是一个例子 http brettviren github io pygst tutorial org p
  • gstreamer flvmux 和 rtmp 错误

    我尝试从 rasberrypi 流式传输 rtmp 顺便说一句 omx 硬件编码器工作得非常好 所以我正在运行 gst launch 1 0 v4l2src video x raw width 640 height 480 framerat
  • 在哪里可以获得实时视频流示例(GStreamer)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 gstreamer 将 YUVj420p 像素格式转换为 RGB888

    我使用 gstreamer 1 2 将帧从我的 IP 摄像头馈送到 opencv 程序 流是 640 368 YUVj420p 我想将其转换为RBG888以便能够在我的opencv程序中使用它 那么有没有办法使用 gstreamer 来进行
  • WebRTC 连接在本地网络之外无法工作

    我们对 webrtc 双向视频和音频流进行了以下设置 Mobile Android应用程序使用谷歌网络RTC https webrtc org 实现java包装器 测试了这两个库 implementation org webrtc goog
  • 从 Android 上的 IP 摄像机接收视频流

    我有一个 IP 摄像机 它以 MJPEG 格式传输视频 现在我的目标是接收它并在我自己的自定义 Android 应用程序中显示它 为此 我在 Android 平台上提供了三种编程替代方案 使用内置的 Android MediaPlayer
  • 将多个视频合并为一个

    我有三个视频 用摄像机拍摄的讲座 讲座中使用的计算机的桌面捕获视频 和白板的视频 我想创建一个最终视频 其中这三个组件占据屏幕的特定区域 是否有开源软件可以让我做到这一点 mencoder ffmpeg virtualdub 你推荐哪一个
  • 如何使用 gstreamer 在两个不同的显示器上同时播放两个不同的视频

    我在用 Raspberry Pi 4 B 型 有 2 个 HDMI 端口 Gstreamer 1 0 我有两个视频保存在存储卡中 我想将两个视频驱动到两个不同的 HDMI 端口 并同时在两个不同的显示器上播放视频 我想知道 Gstreame
  • Videomixer 在源上失败,而不是在 Videotestsrc 上失败

    我想在一个视频文件中同时播放两个不同的本地视频文件 窗户 下面的代码在没有解复用器和解码器的情况下工作正常 static void play video GMainLoop loop GstElement pipeline videomix
  • GStreamer 如何从流中提取视频帧?

    这是用于从服务器捕获流视频的 python 代码 但我需要编写一个函数来从流中提取一帧 这将是一个按钮 单击它将显示当前帧 我没有想法 谁能帮我这个 self player gst Pipeline player self source g
  • 使用 gstreamer 进行低延迟音频捕获

    我需要在 Linux 上进行 几乎 实时音频捕获gstreamer 我的问题是我无法将延迟降低到约 210 毫秒以下 我尝试了从麦克风到耳机的简单环回 gst launch 1 0 pulsesrc alsasink gst launch
  • 使用 GStreamer 将视频转换为 WebM

    文档用于GStreamer令人困惑 这仍然不是诉诸的借口StackOverflow com 但仍然 是什么GStreamer命令行将任何视频文件 任何格式 转换为 WebM WebM 音频 这是我能找到的唯一带有示例的文档 http gst
  • 构建 Gstreamer 编辑服务失败

    I run autogen sh在克隆的存储库中 它无法显示以下内容 configure No package gstreamer plugins base 1 0 found configure error no gstreamer pl
  • 如何更改 Gstreamer 插件的等级?

    我已经下载并编译了 vaapi 插件集 对于某些特定情况它工作得很好 但它也破坏了我现有的许多管道 我想先修改 Gstreamer 以使用其他解码器 有没有办法在不修改原始源的情况下改变 Gstreamer 插件的等级 我在 Gstream
  • Gstreamer、rtspsrc 和负载类型

    我在从特定摄像头检索 rtsp 流时遇到困难 因为摄像头提供的 rtp 有效负载类型是 35 未分配 并且该摄像头接受的有效负载类型rtph264德佩插件的范围是 96 127 结果是 gstreamer 显示如下错误
  • Python 使用 Gstreamer 访问 USB 麦克风时遇到问题,以便在 Raspberry Pi 上使用 Pocketsphinx 执行语音识别

    所以Python的表现就好像它根本听不到我的麦克风发出的任何声音 问题就在这里 我有一个Python 2 7 假设使用的脚本Gstreamer通过以下方式访问我的麦克风并为我进行语音识别口袋狮身人面像 我在用着脉冲音频我的设备是树莓派 我的
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始

随机推荐

  • 将速度记录更改为控制台

    我正在尝试将速度与现有的 log4j xml 配置集成 但遇到了困难 我似乎无法让它使用控制台附加器 无论我尝试什么 它都会不断发送到velocity log
  • 更改Laravel的created_at和updated_at的名称

    我可以从以下位置映射 Laravel 的时间戳吗 created at to post date and post date gmt updated at to post modified and post modified gmt 我正在
  • Eclipse - 如何将“Project Facet”从 Tomcat 6 更改为 Tomcat 5.5?

    日食 3 4 木卫三 我在 Eclipse 中有一个现有的动态 Web 应用程序项目 创建项目时 我在 配置 下拉列表下指定了 Apache Tomcat v6 的默认配置 一两个月后 我现在想将配置更改为 Tomcat v5 5 这将是生
  • 多次部分刷新的运行时错误

    Per 帮助我让一个 XSP partialRefreshGet 开始工作 这对我来说效果很好 不 谢谢 现在我需要多次刷新才能工作 XSP partialRefreshGet txtRateType onComplete function
  • 元素上的 jQuery Change 事件 - 有什么方法可以保留以前的值吗?

    今天早上我一直在搜索 但没有找到任何简单的解决方案 基本上 我想捕获输入元素的变化 但也知道以前的值 这是最简单形式的更改事件和输入元素 显然 我可以使用 elem val 获取新值 但是我是否缺少一种获取先前值的偷偷摸摸的方法 我在 jQ
  • 在.Net Core中创建自定义Sdk

    在 Net core项目中 有一个 csproj文件 其中第一行指定您在该项目中定位的 SDK 类似于
  • 简单检查 Twig 模板中的表单字段是否有错误

    在 Twig 模板中 我检查字段是否有如下错误 if form points get errors is not empty 有没有类似的方法 if form points hasErrors 做起来更简单吗 这没什么大区别 但如果我不能做
  • 根据嵌入式 VB.NET 资源的路径自动添加命名空间

    我习惯于在 C 中嵌入资源 并且喜欢它自动向嵌入资源添加命名空间的方式 这允许我做这样的事情 files version1 config xml files version2 config xml files version2 config
  • 在查询中传递字符串而不使用引号 ''

    我有这个查询代码 conditions array codiceBiblio IN gt tot 其中 tot 是一个字符串 例如 2345 5657 4565 5678 在这种情况下 查询将是 SELECT WHERE codiceBib
  • Django 迁移和可定制的可重用应用程序

    大约三周前 我开始编写我的第一个可重用应用程序 但我在处理迁移方面遇到了麻烦 我希望我的应用程序的某些点是可定制的 因此我有一个conf子模块 https github com Aladom django mailing blob 6260
  • 如何回显 DOMNodeList 对象和 DOMElement 对象?

    我正在使用循环来填充名为 list 的数组 它就像一个魅力 content is a DOMNodeList Object value is a DOMElement Object list array foreach content as
  • 导入 io.restassured.RestAssured 无法解析

    您好 我在使用放心 4 1 1 时无法解决该错误 我的 Eclipse IDE 中的库 我已在 pom xml 文件中添加了放心库 但错误仍未解决 我尝试重新导入放心的库https mvnrepository com artifact io
  • 使用 GNU gfortran 字符串化宏

    如何使用 GNU gfortran 字符串化预处理器宏 我想将宏定义传递给 GNU gfortran 然后将其用作代码中的字符串 实际上我想这样做 program test implicit none character len alloc
  • 在 Java 中如何检查 Socket 当前是否已连接? [复制]

    这个问题在这里已经有答案了 我试图找出 Java TCP 套接字是否是现在已连接 以下内容似乎只是告诉我套接字是否已在某个时刻连接 而不是当前是否仍处于连接状态 socket isConnected 任何帮助表示赞赏 谢谢 假设您对协议有一
  • 使用 Java 8 将 int 数组转换为 long 数组?

    我尝试了几种方法都没有成功 this tileUpdateTimes is long and other tileUpdateTimes is int this tileUpdateTimes Arrays stream other til
  • gem 原生扩展到底是什么?

    我觉得本机扩展就像库一样 您应该在尝试安装这些依赖于本机扩展的 gem 之前将其安装到系统上 像ImageMagic图书馆 那是对的吗 关于本机扩展 我们还应该了解什么吗 gem 本机扩展might链接到需要预安装的单独库 以及RMagic
  • MongoDB C# 驱动程序:查询拦截器?

    MongoDB C 驱动程序是否支持像实体框架这样的查询拦截器 我检查了文档但找不到任何内容 基本上我需要做的是确保对数据库的某些查询 根据上下文 始终应用某些限制 例如 如果我的文档可以被软删除 那么我总是需要确保为 Soft Delet
  • 动态设置每个记录器实例的 Nlog 日志级别 ASP.Net Core 2.x

    客观的 动态选择我想要详细日志记录的 HTTP 请求 不同的日志级别 Overview 我有一个正在运行的 ASP Net core 2 1 Web 服务器 一旦投入生产 如果我需要调试问题 我希望能够更改日志级别 我已经找到了如何全局更改
  • 使用 urllib2 进行代理

    我打开网址 site urllib2 urlopen http google com 我想做的是用代理以相同的方式连接 我有一个地方告诉我 site urllib2 urlopen http google com proxies http
  • Videomixer 在源上失败,而不是在 Videotestsrc 上失败

    我想在一个视频文件中同时播放两个不同的本地视频文件 窗户 下面的代码在没有解复用器和解码器的情况下工作正常 static void play video GMainLoop loop GstElement pipeline videomix