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

运行效果

简介

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

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

          • 如何将元素相互连接。

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

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

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

GStreamer相关运行库
cpp 复制代码
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

完整源码
cpp 复制代码
#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

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能14 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G14 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt