GStreamer —— 2.2、Windows下Qt加载GStreamer库后运行 - “教程2:GStream ...

打印 上一主题 下一主题

主题 916|帖子 916|积分 2748

运行结果



简介

     上一个教程演示了如何自动构建管道。如今 我们将通过实例化每个元素来手动构建管道 并将它们全部链接在一起。在此过程中,我们将学习:
          • 什么是 GStreamer 元素以及如何创建一个。
          • 如何将元素相互连接。
          • 如何自定义元素的举动。
          • 如何观察总线的错误条件并提取信息 来自 GStreamer 消息。

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


GStreamer相干运行库

  1. INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0/gst
  2. INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include
  3. INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0
  4. INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/glib-2.0
  5. INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0/include
  6. LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gstreamer-1.0.lib
  7. LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0.lib
  8. LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gobject-2.0.lib
复制代码

完备源码

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include "gst.h"
  4. int tutorial_main()
  5. {
  6.     GstBus *bus;
  7.     GstMessage *msg;
  8.     GstStateChangeReturn ret;
  9.     /* 初始化GStreamer */
  10.     gst_init (nullptr,nullptr);
  11.     /* 创建元素 */
  12.     GstElement *source = gst_element_factory_make ("videotestsrc", "source");       // 元素输出
  13.     GstElement *sink = gst_element_factory_make ("autovideosink", "sink");          // 元素输入
  14.     /* 创建空管道 */
  15.     GstElement *pipeline = gst_pipeline_new ("test-pipeline");
  16.     if (!pipeline || !source || !sink) {g_printerr ("Not all elements could be created.\n");return -1;}
  17.     /* 构建管道 */
  18.     gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
  19.     if (gst_element_link (source, sink) != TRUE)
  20.     {
  21.         g_printerr ("无法链接元素.\n");
  22.         gst_object_unref (pipeline); return -1;
  23.     }
  24.     /* 修改元素的属性 */
  25.     g_object_set (source, "pattern", 1, NULL);
  26.     /* 开始播放 */
  27.     ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
  28.     if (ret == GST_STATE_CHANGE_FAILURE)
  29.     {
  30.         g_printerr ("无法将管道设置为播放状态.\n");
  31.         gst_object_unref (pipeline); return -1;
  32.     }
  33.      /* 用于获取与特定元素相关联的消息总线(message bus)函数。
  34.      * 消息总线是用于在管道的不同部分之间传递消息的机制,例如错误、警告、EOS(End Of Stream)事件等。 */
  35.     bus = gst_element_get_bus (pipeline);
  36.     /* 等待错误或流结束,获取并解析消息 */
  37.     msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
  38.     if (msg != NULL)
  39.     {
  40.         GError *err;
  41.         gchar *debug_info;
  42.         switch (GST_MESSAGE_TYPE (msg))
  43.         {
  44.         case GST_MESSAGE_ERROR:
  45.             gst_message_parse_error (msg, &err, &debug_info);
  46.             g_printerr ("从元素接收到错误 %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
  47.             g_printerr ("调试信息: %s\n", debug_info ? debug_info : "none");
  48.             g_clear_error (&err);
  49.             g_free (debug_info);
  50.             break;
  51.         case GST_MESSAGE_EOS: g_print ("流已结束.\n"); break;
  52.         default:
  53.             /* 不应该到达这里,因为我们只要求错误和EOS */
  54.             g_printerr ("收到意外消息.\n"); break;
  55.         }
  56.         gst_message_unref (msg);
  57.     }
  58.     /* 释放资源 */
  59.     gst_object_unref (bus);
  60.     gst_element_set_state (pipeline, GST_STATE_NULL);
  61.     gst_object_unref (pipeline);
  62.     return 0;
  63. }
  64. int main(int argc, char *argv[])
  65. {
  66.     QCoreApplication a(argc, argv);
  67. #if 1
  68.     tutorial_main();
  69. #else
  70.     gst_init(nullptr,nullptr);
  71.     const gchar *nano_str;
  72.     guint major,minor, micro,nano;
  73.     gst_version(&major, &minor, &micro,&nano);
  74.     qDebug() << major << " " << minor << " " << micro << " " << nano;
  75. #endif
  76.     return a.exec();
  77. }
复制代码

关注

   笔者 - jxd

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表