GStreamer基础教程02——GStreamer概念

article/2025/11/7 23:52:01

      上一个教程演示了如何自动生成一个pipeline。这次我们打算用一个个element来手动搭建一个pipeline。我们这个教程会演示:

1. 什么是GStreamer的element以及如何建立一个element

2. 如何在element直接建立连接

3. 如何客制化element的行为

4. 如何监视总线上的错误并获得相关的信息


      手动建立Hello World

把下面的代码copy到basic-turtorial-2.c文件

#include <gst/gst.h>int main(int argc, char *argv[]) {GstElement *pipeline, *source, *sink;GstBus *bus;GstMessage *msg;GstStateChangeReturn ret;/* Initialize GStreamer */gst_init (&argc, &argv);/* Create the elements */source = gst_element_factory_make ("videotestsrc", "source");sink = gst_element_factory_make ("autovideosink", "sink");/* Create the empty pipeline */pipeline = gst_pipeline_new ("test-pipeline");if (!pipeline || !source || !sink) {g_printerr ("Not all elements could be created.\n");return -1;}/* Build the pipeline */gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);if (gst_element_link (source, sink) != TRUE) {g_printerr ("Elements could not be linked.\n");gst_object_unref (pipeline);return -1;}/* Modify the source's properties */g_object_set (source, "pattern", 0, NULL);/* Start playing */ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE) {g_printerr ("Unable to set the pipeline to the playing state.\n");gst_object_unref (pipeline);return -1;}/* Wait until error or EOS */bus = gst_element_get_bus (pipeline);msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);/* Parse message */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 ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");g_clear_error (&err);g_free (debug_info);break;case GST_MESSAGE_EOS:g_print ("End-Of-Stream reached.\n");break;default:/* We should not reach here because we only asked for ERRORs and EOS */g_printerr ("Unexpected message received.\n");break;}gst_message_unref (msg);}/* Free resources */gst_object_unref (bus);gst_element_set_state (pipeline, GST_STATE_NULL);gst_object_unref (pipeline);return 0;
}


      工作流程

      GStreamer的基本组成是elements,这些elements把数据从source经过filter传到sink。


      建立element

      因为上一篇教程以及介绍过了初始化这段内容,所以我们这次略过这一段。

  /* Create the elements */source = gst_element_factory_make ("videotestsrc", "source");sink = gst_element_factory_make ("autovideosink", "sink");

      新的element的建立可以使用gst_element_factory_make()。这个API的第一个参数是要创建的element的类型(后面第14讲会介绍一些常见的类型,第10讲会介绍如何获得可用的类型列表),第二个参数是我们想创建的element的名字,这个名字并非是必须的,但在调试中会非常有用,如果你传入的时NULL,那么GStreamer会自动创建一个名字。

      在本教程内我们创建了2个elements:videotestsrc和autovideosink.

      vieotestsrc是一个source element(生产数据),会创建一个video模式。这个element常用在调试中,很少用于实际的应用。

      autovideosink是一个sink element(消费数据),会在一个窗口显示收到的图像。在不同的操作系统中,会存在多个的video sink,autovideosink会自动选择一个最合适的,所以你不需要关心更多的细节,代码也会有更好的移植性。


      建立pipeline

  /* Create the empty pipeline */pipeline = gst_pipeline_new ("test-pipeline");
      因为要统一处理时钟和一些信息,GStreamer中的所有elements都必须在使用之前包含到pipeline中。我们用gst_pipeline_new()来创建pipeline。

  /* Build the pipeline */gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);if (gst_element_link (source, sink) != TRUE) {g_printerr ("Elements could not be linked.\n");gst_object_unref (pipeline);return -1;}

      一个pipeline就是一个特定类型的可以包含其他element的bin,而且所以可以用在bin上的方法也都可以用在pipeline上。在这个例子中,我们调用了gst_bin_add_many()方法在pipeline中加入element。这个方法会接受一系列的element作为输入参数,最后由NULL来终止。增加单个element的方法是gst_bin_add()。

      这个时候,这些刚增加的elements还没有互相连接起来。我们用gst_element_link()方法来把element连接起来,这个方法的第一个参数是源,第二个参数是目标,这个顺序不能搞错,因为这确定了数据的流向。记住只有在同一个bin里面的element才能连接起来,所以一定要把element在连接之前加入到pipeline中。


      属性

  /* Modify the source's properties */g_object_set (source, "pattern", 0, NULL);
      绝大部分的GStreamer elements有可以定制化的属性:只读的属性会显示element的内部状态,可写的属性会影响element的行为。我们用g_object_get()方法来获得属性,用g_object_set()方法来设置属性。

      g_object_set()方法接受一个用NULL结束的属性名称/属性值的组成的对,所以可以一次同时修改多项属性。

      上面的代码修改了videotestsrc的“pattern”属性,这个属性控制了视频的输出,大家可以试试不同的值看一下效果。

      关于一个element的名字和取值范围,使用gst-inspect工具可以查询到。


      错误检查

      在这一点上,本系列的教程内容都比较相似,和第一讲没什么不同,只是我们监测更多的错误罢了。

  /* Start playing */ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE) {g_printerr ("Unable to set the pipeline to the playing state.\n");gst_object_unref (pipeline);return -1;}
      我们调用gst_element_set_state()方法,但这次我们检查它的返回值。状态转换是一个很微妙的过程,在下一篇教程中我们会有更多的一些细节。

  /* Wait until error or EOS */bus = gst_element_get_bus (pipeline);msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);/* Parse message */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 ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");g_clear_error (&err);g_free (debug_info);break;case GST_MESSAGE_EOS:g_print ("End-Of-Stream reached.\n");break;default:/* We should not reach here because we only asked for ERRORs and EOS */g_printerr ("Unexpected message received.\n");break;}gst_message_unref (msg);}
      gst_bus_timed_pop_filted()会一直等到运行结束,然后返回一个GstMessage参数。我们让gst_bus_timed_pop_filtered()方法仅在收到错误或者播放结束的消息时才返回。所以我们需要检查是哪个消息并打印出来。

      GstMessage是一个非常通用的结构,它可以传递很多信息。幸好GStreamer提供了一系列的解析函数,在本教程里面,我们一旦知道message里面包含一个错误(通过使用GST_MESSAGE_TYPE宏),我们可以使用gst_message_parse_error()方法,这个方法会返回一个GLib的GError结构。


      GStreamer总线

      这里稍微介绍一下GStreamer总线。GStreamer总线本身也是一个对象,是创建来传递elements生成的GstMessage的对象。消息可以在总线上用gst_bus_timed_pop_filtered()方法抓出来,你的应用需要随时注意出错的信息和播放相关的其他问题。

      其他的代码是释放内存的,和上一篇教程是一样的。


http://chatgpt.dhexx.cn/article/ZN5gErLJ.shtml

相关文章

GStreamer功能详解

参考&#xff1a;https://blog.csdn.net/tx3344/article/details/7497434 参考&#xff1a;https://thebigdoc.readthedocs.io/en/latest/gstreamer/gst-concept.html 参考&#xff1a;https://blog.csdn.net/sdjhs/article/details/51444934 什么是GStreamer&#xff1f; …

基于gstreamer的rtsp推送和转发

基于gstreamer的rtsp推送和转发 一、配置gstreamer环境二、安装gstreamer-rtsp-server三、读取usb摄像头并推rtsp流四、转发rtsp 前段时间因为实验室项目要求&#xff0c;需要读取摄像头并推rtsp流&#xff0c;由于我们实验室不是做与之相关的工作&#xff0c;所以并没有什么参…

深入浅出gstreamer开发

Gstreamer解决什么问题&#xff1f; — 上层接口和应用方式的 相对稳定 与底层接口、平台环境的 多样化 。例如&#xff1a; codec 不同种类不同实现&#xff0c;音视频处理不同&#xff0c;硬件输入、输出、采集播放不同&#xff0c;芯片不同&#xff0c;操作系统不同。 — 通…

【GStreamer 】3-1 gstreamer插件之 videotestsrc 介绍

目录 ​编辑 1、简介 2、videotestsrc 3、videotestsrc 不同pattern参数测试罗列 3.1 (0): smpte - SMPTE 100% color bars 3.2 (1): snow - Random (television snow) 3.3 (2): black - 100% Black ​编辑 3.4 checkers 方块 ​编辑 3.5 几何图形 4、videotestsrc…

Gstreamer概述

1、什么是GStreamer GStreamer 是用来构建流媒体应用的开源多媒体框架(framework)&#xff0c;其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。其目标是要简化音/视频应用程序的开发&#xff0c;已经能够被用来处理像 M…

gstreamer简介

常用 gchar * caps_string gst_caps_to_string (new_selected_caps); g_free (caps_string); 需要弄懂的问题 tunnel tee queue 最后列一下Gstreamer中常见的时间宏&#xff0c;注意Gstreamer中的时间单位是&#xff1a;纳秒 #define G_USEC_PER_SEC 1000000 #define GST_S…

Gstreamer基础知识介绍

由于deepstream是基于gstreamer的&#xff0c;所以要想在deepstream上做拓展&#xff0c;需要对gstreamer有一定的认识。以下主要介绍Gstreamer整体框架和Gstreamer基础概念。 一、Gstreamer整体框架 gstreamer是一个用于开发流式多媒体应用的开源框架。本身这个框架是为了更…

【GStreamer 】1-扫盲介绍

从历史的角度来看&#xff0c;Linux 在多媒体方面已经远远落后于其它的操作系统。微软的Windows和苹果的MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。另一方面&#xff0c;Linux对多媒体应用的综合贡献比较少&#xff0c;这也使得Linux很难在…

详细的GStreamer开发教程

详细的GStreamer开发教程 文章目录 详细的GStreamer开发教程1. 什么是GStreamer&#xff1f;2. GStreamer架构2.1 Media Applications2.2 Core Framework2.3 Plugins 3. GStreamer组件3.1 Element创建一个 GstElement 3.2 箱柜&#xff08;bin&#xff09;元件的状态 3.3 衬垫&…

gstreamer(一)入门和概述

一&#xff0e;概述 在音视频领域接触最多实现的方案通常是通过ffmpeg&#xff08;PC和sever端居多&#xff09;或者硬件厂家的的SDK实现特定硬件的编解码功能&#xff08;机顶盒&#xff0c;电视等嵌入式设备&#xff09;。这里我们介绍一个在国内不太常用的解决方案----gstr…

二、什么是GStreamer

GStreamer是一个用于创建流媒体应用程序的框架。基本的设计来自俄勒冈研究生院的视频管道&#xff0c;还有一些来自DirectShow的想法。 GStreamer的开发框架使编写任何类型的流媒体应用程序成为可能。GStreamer框架旨在使编写处理音频或视频或两者同时处理的应用程序变得容易。…

Gstreamer 应用开发:1-基础介绍

我们之前的系列&#xff0c;正式的介绍了Gstreamer&#xff0c;并且围绕如何使用USB相机推流实现RTSP服务器来做了介绍&#xff0c;并在Jeston TX1 平台上做了优化急速的一些探索。 今天我们开始围绕如何用命令实现一个音视频混合&#xff0c;或者单独的音频&#xff0c;和单独…

【gstreamer】入门介绍

概述 GStreamer是一个基于流媒体的框架&#xff0c;是一个开放源代码的多媒体框架&#xff0c;用于创建音频和视频处理应用程序。它是一个运行在多个操作系统上的跨平台框架&#xff0c;支持多种不同的多媒体格式。 GStreamer框架的核心是基于插件的体系结构&#xff0c;插件…

Gstreamer基础讲解

Gstreamer讲解 文章目录 Gstreamer讲解基础背景小结 元件&#xff08;Element&#xff09;衬垫(Pads)Gstreamer的面向对象Gstreamer的多线程 实用工具Gstreamer常用插件介绍gstreamer工程记录关于YUV的补充知识 基础 背景 ​ 从历史的角度来看&#xff0c;Linux在多媒体方面已…

Gstreamer 简介

转载自&#xff1a;John.Leng - 博客园http://www.cnblogs.com/xleng/ 什么是Gstreamer&#xff1f; Gstreamer是一个支持Windows&#xff0c;Linux&#xff0c;Android&#xff0c; iOS的跨平台的多媒体框架&#xff0c;应用程序可以通过管道&#xff08;Pipeline&#xff0…

微博视频怎么下载?微博视频下载和保存工具

本文转载自&#xff1a;怎么下载微博视频 ​​​微博视频怎么下载&#xff1f;当你刷微博看到自己特别喜欢的视频时&#xff0c;除了转发该视频到自己的微博外&#xff0c;你可能还想把这个微博视频保存到自己电脑或者手机中&#xff0c;那应该怎么实现weibo视频的下载呢&#…

GitHub 标星 120K+!这些神器仅需一行代码即可下载全网视频!

大家好&#xff0c;我是 JackTian。 今天这篇文章的内容对于经常浏览各大视频网站的同学来说&#xff0c;是一大神器工具。当你看到自己目前所需的视频时想尽各种办法保存至本地&#xff0c;方便后期再次回看。恰巧有些视频可能需要会员才能够下载&#xff0c;有些第三方的视频…

那些你可能不知道的视频下载奇技淫巧

之前已经写过好几篇的奇技淫巧系列了&#xff0c;今天说说怎么快速下载视频。 我平常经常看视频的网站就是爱奇艺&#xff0c;b站&#xff0c;微博&#xff0c;知乎&#xff0c;网易这些。 这里以微博为例&#xff0c;下载周杰伦的《晴天》&#xff0c;微博地址是 https://w…

部分主流视频网站下载方法

如果在微博或其他视频网站上看到非常喜欢的视频&#xff0c;想下载下来&#xff0c;但是又苦于不知如何下载。 这里我推荐一个网站&#xff0c;支持主流的86视频网站&#xff08;发表博客时&#xff09;的视频下载。 主流视频网站(16)&#xff1a; 搜狐视频 乐视网 酷6网 56…

快手火山抖音视频怎么快速去重消重和去水印秒拍视频批量采集下载怎么快速去重消重去水印视频批量采...

快手火山抖音视频怎么快速去重消重和去水印 秒拍视频批量采集下载 怎么快速去重消重去水印 视频批量采集下载软件&#xff0c;怎么找到视频批量采集下载软件 趣头条今日头条等自媒体视频批量采集下载软件有哪些&#xff1f; 大鱼号视频批量采集下载去重消重去水印软件 视频怎么…