当前位置: 首页 > article >正文

GStreamer —— 2.2、Windows下Qt加载GStreamer库后运行 - “教程2:GStreamer 概念“(附:完整源码)

运行效果

在这里插入图片描述

简介

     上一个教程演示了如何自动构建管道。现在 我们将通过实例化每个元素来手动构建管道 并将它们全部链接在一起。在此过程中,我们将学习:

          • 什么是 GStreamer 元素以及如何创建一个。

          • 如何将元素相互连接。

          • 如何自定义元素的行为。

          • 如何观察总线的错误条件并提取信息 来自 GStreamer 消息。


     这些元素是 GStreamer 的基本构造块。他们处理 数据从源元素(数据生产者)流向下游 传递给 sink 元素(数据使用者),通过 filter 元素。
在这里插入图片描述

GStreamer相关运行库
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0/gst
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/glib-2.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0/include

LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gstreamer-1.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gobject-2.0.lib

完整源码
#include <QCoreApplication>
#include <QDebug>

#include "gst.h"

int tutorial_main()
{
    GstBus *bus;
    GstMessage *msg;
    GstStateChangeReturn ret;

    /* 初始化GStreamer */
    gst_init (nullptr,nullptr);

    /* 创建元素 */
    GstElement *source = gst_element_factory_make ("videotestsrc", "source");       // 元素输出
    GstElement *sink = gst_element_factory_make ("autovideosink", "sink");          // 元素输入

    /* 创建空管道 */
    GstElement *pipeline = gst_pipeline_new ("test-pipeline");
    if (!pipeline || !source || !sink) {g_printerr ("Not all elements could be created.\n");return -1;}

    /* 构建管道 */
    gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
    if (gst_element_link (source, sink) != TRUE)
    {
        g_printerr ("无法链接元素.\n");
        gst_object_unref (pipeline); return -1;
    }

    /* 修改元素的属性 */
    g_object_set (source, "pattern", 1, NULL);

    /* 开始播放 */
    ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE)
    {
        g_printerr ("无法将管道设置为播放状态.\n");
        gst_object_unref (pipeline); return -1;
    }

     /* 用于获取与特定元素相关联的消息总线(message bus)函数。
     * 消息总线是用于在管道的不同部分之间传递消息的机制,例如错误、警告、EOS(End Of Stream)事件等。 */
    bus = gst_element_get_bus (pipeline);
    /* 等待错误或流结束,获取并解析消息 */
    msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
    if (msg != NULL)
    {
        GError *err;
        gchar *debug_info;

        switch (GST_MESSAGE_TYPE (msg))
        {
        case GST_MESSAGE_ERROR:
            gst_message_parse_error (msg, &err, &debug_info);
            g_printerr ("从元素接收到错误 %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
            g_printerr ("调试信息: %s\n", debug_info ? debug_info : "none");
            g_clear_error (&err);
            g_free (debug_info);
            break;
        case GST_MESSAGE_EOS: g_print ("流已结束.\n"); break;
        default:
            /* 不应该到达这里,因为我们只要求错误和EOS */
            g_printerr ("收到意外消息.\n"); break;
        }
        gst_message_unref (msg);
    }

    /* 释放资源 */
    gst_object_unref (bus);
    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);
    return 0;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

#if 1
    tutorial_main();
#else
    gst_init(nullptr,nullptr);

    const gchar *nano_str;
    guint major,minor, micro,nano;
    gst_version(&major, &minor, &micro,&nano);

    qDebug() << major << " " << minor << " " << micro << " " << nano;
#endif

    return a.exec();
}

关注

笔者 - jxd


http://www.kler.cn/a/576334.html

相关文章:

  • Swift系列02-Swift 数据类型系统与内存模型
  • 智慧风电赋能绿色能源的新篇章
  • IDEA Generate POJOs.groovy 踩坑小计 | 生成实体 |groovy报错
  • WPF在特定领域的应用:打造一款专业的图像编辑工具
  • Maven 使用指南:基础 + 进阶 + 高级用法
  • 【JavaWeb】Web基础概念
  • 嵌入式中Type-C 与快充相关知识详解
  • let、const和var的区别是什么?
  • Unity自定义区域UI滑动事件
  • 【第19节】C++设计模式(行为模式)-Command(命令)模式
  • ECharts中yAxisIndex的作用
  • Java面试第十山!《Mybatis框架》
  • 鸿蒙应用开发深度解析:API 14核心特性与实战指南
  • 低空经济快速发展,无人机人才培养及校企实验室共建技术详解
  • Java UDP 通信:实现简单的 Echo 服务器与客户端
  • c#结合IL(中间语言)分析Try-Catch的内部机制及其对性能的影响
  • 信奥赛CSP-J复赛集训(模拟算法专题)(4):P1046 [NOIP 2005 普及组] 陶陶摘苹果
  • 小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡
  • 物联网 铁路“一杆一档”管理模式
  • v-code-diff 配置