gstreamer基础教程2-GStreamer concepts

【GStreamer】gst_element_factory_make函数 gst_element_factory_make()主要的功能是创建了一个工厂类型,并且在这个工厂类型中查找一个元素,返回这个元素。这包括了两个步骤:(1)创建工厂类型;(2)在工厂类型中查找属性。 实际上,上面2个步骤分别对应着2个独立的函数:(1)创建工厂类型:gst_element_factory_find();(2)在工厂类型中查找属性:gst_element_factory_create();不同的是,在这里需要处理的是批量属性,需要用到va_list。 阅读详情

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84621238

Goal

之前学习了自动拼接组件,本章学习手动拼接组件。

主要涉及:

1,什么是组件(element),如何创建组件。2,组件之间如何关联。3,如何组织组件的行为。4,如何监听总线获取消息。

主要涉及函数包括:

gst_element_factory_make()(创建组件)gst_pipeline_new()(创建管道)gst_bin_add_many()[添加组件到管道(管道是特殊的bin)]

gst_element_link()[组件之间的连接(同一个bin中的element才能连接)]

The previous tutorial showed how to build a pipeline automatically. Now we are going to build a pipeline manually by instantiating each element and linking them all together. In the process, we will learn:

  • What is a GStreamer element and how to create one.

  • How to connect elements to each other.

  • How to customize an element's behavior.

  • How to watch the bus for error conditions and extract information from GStreamer messages.

Manual Hello World手动版的Hello World

Copy this code into a text file named basic-tutorial-2.c (or find it in your GStreamer installation).

basic-tutorial-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;
}

Walkthrough

The elements are GStreamer's basic construction blocks. They process the data as it flows downstream from the source elements (data producers) to the sink elements (data consumers), passing through filter elements.

Figure 1. Example pipeline

Element creation

创建组件,参数一:插件名称,系统提供或自创建插件。参数二:组件名称(意义不大,调试使用)。

We will skip GStreamer initialization, since it is the same as the previous tutorial:

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

As seen in this code, new elements can be created with gst_element_factory_make(). The first parameter is the type of element to create (Basic tutorial 14: Handy elements shows a few common types, and Basic tutorial 10: GStreamer tools shows how to obtain the list of all available types). The second parameter is the name we want to give to this particular instance. Naming your elements is useful to retrieve them later if you didn't keep a pointer (and for more meaningful debug output). If you pass NULL for the name, however, GStreamer will provide a unique name for you.

For this tutorial we create two elements: a videotestsrc and an autovideosink.

videotestsrc is a source element (it produces data), which creates a test video pattern. This element is useful for debugging purposes (and tutorials) and is not usually found in real applications.

autovideosink is a sink element (it consumes data), which displays on a window the images it receives. There exist several video sinks, depending on the operating system, with a varying range of capabilities. autovideosink automatically selects and instantiates the best one, so you do not have to worry with the details, and your code is more platform-independent.

Pipeline creation

管道(pipeline)是包含组件(element)的容器,组件必须放在管道里,管道负责时钟、消息的传递。

/* Create the empty pipeline */
pipeline = gst_pipeline_new ("test-pipeline");

All elements in GStreamer must typically be contained inside a pipeline before they can be used, because it takes care of some clocking and messaging functions. We create the pipeline with gst_pipeline_new().

/* 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;
}

管道是一个特殊的箱柜(bin),所有bin的方法,管道都适用。通过gst_bin_add_many方法,将组件添加到管道中,此方法参数不定,最后参数必须是NULL。

A pipeline is a particular type of bin, which is the element used to contain other elements. Therefore all methods which apply to bins also apply to pipelines. In our case, we call gst_bin_add_many() to add the elements to the pipeline (mind the cast). This function accepts a list of elements to be added, ending with NULL. Individual elements can be added with gst_bin_add().

同一管道中的组件,必须连接之后,才可以进行数据的传输。通过函数gst_element_link可以连接同一管道中的组件。二个参数:第一个是数据源头,第二个是数据目的地。

These elements, however, are not linked with each other yet. For this, we need to use gst_element_link(). Its first parameter is the source, and the second one the destination. The order counts, because links must be established following the data flow (this is, from source elements to sink elements). Keep in mind that only elements residing in the same bin can be linked together, so remember to add them to the pipeline before trying to link them!

Properties

每一个组件都有一组属性值,属性以name:value的形式成对出现。通过 g_object_get()和 g_object_set()来获取和设置属性值,这二个函数可以同时对多组属性进行获取和设置,参数可变,最后以NULL结尾。具体每个组件有什么属相,可以使用功能根据gst_inspect_1.0获取。

/* Modify the source's properties */
g_object_set (source, "pattern", 0, NULL);

Most GStreamer elements have customizable properties: named attributes that can be modified to change the element's behavior (writable properties) or inquired to find out about the element's internal state (readable properties).

Properties are read from with g_object_get() and written to with g_object_set().

g_object_set() accepts a NULL-terminated list of property-name, property-value pairs, so multiple properties can be changed in one go.

GStreamer elements are all a particular kind of GObject, which is the entity offering property facilities. This is why the property handling methods have the g_ prefix.

The line of code above changes the “pattern” property of videotestsrc, which controls the type of test video the element outputs. Try different values!

The names and possible values of all the properties an element exposes can be found using the gst-inspect-1.0 tool described in Basic tutorial 10: GStreamer tools.

Error checking

设置状态,可以获取返回值,判断是否失败。

At this point, we have the whole pipeline built and setup, and the rest of the tutorial is very similar to the previous one, but we are going to add more error checking:

/* 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;
}

We call gst_element_set_state(), but this time we check its return value for errors. Changing states is a delicate process and a few more details are given in Basic tutorial 3: Dynamic pipelines.

/* 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_filtered() waits for execution to end and returns with a GstMessage which we previously ignored. We asked gst_bus_timed_pop_filtered() to return when GStreamer encountered either an error condition or an EOS, so we need to check which one happened, and print a message on screen (Your application will probably want to undertake more complex actions).

GstMessage is a very versatile structure which can deliver virtually any kind of information. Fortunately(幸运的), GStreamer provides a series of parsing functions for each kind of message.

In this case, once we know the message contains an error (by using the GST_MESSAGE_TYPE() macro), we can use gst_message_parse_error() which returns a GLib GError error structure and a string useful for debugging. Examine the code to see how these are used and freed afterward.

The GStreamer bus(总线)

总线是传递由GstMessage产生的消息给组件。消息检测和组件是二个不同的线程,组件可以同步的监听消息,也可以异步的监听消息。

At this point it is worth introducing the GStreamer bus a bit more formally(正式). It is the object responsible for delivering to the application the GstMessages generated by the elements, in order and to the application thread. This last point is important, because the actual streaming of media is done in another thread than the application.

Messages can be extracted from the bus synchronously with gst_bus_timed_pop_filtered() and its siblings, or asynchronously, using signals (shown in the next tutorial). Your application should always keep an eye on the bus to be notified of errors and other playback-related issues.

The rest of the code is the cleanup sequence, which is the same as in Basic tutorial 1: Hello world!.

Exercise(练习)

If you feel like practicing, try this exercise: Add a video filter element in between the source and the sink of this pipeline. Use vertigotv for a nice effect. You will need to create it, add it to the pipeline, and link it with the other elements.

Depending on your platform and available plugins, you might get a “negotiation” error, because the sink does not understand what the filter is producing (more about negotiation in Basic tutorial 6: Media formats and Pad Capabilities). In this case, try to add an element called videoconvert after the filter (this is, build a pipeline of 4 elements. More on videoconvert in Basic tutorial 14: Handy elements).

Conclusion(结论)

This tutorial showed:

  • How to create elements with gst_element_factory_make()

  • How to create an empty pipeline with gst_pipeline_new()

  • How to add elements to the pipeline with gst_bin_add_many()

  • How to link the elements with each other with gst_element_link()

This concludes the first of the two tutorials devoted to basic GStreamer concepts. The second one comes next.

Remember that attached to this page you should find the complete source code of the tutorial and any accessory files needed to build it.

It has been a pleasure having you here, and see you soon!

视频编码原理及Gstreamer 硬编码代码实现 阅读详情

相关推荐

Gstreamer 硬解码Rtsp流及代码实现

Gstreamer 硬解码Rtsp流及代码实现

weixin_46935110的博客 8269

编写一个GStreamer应用

上一节简单介绍了一下GStreamer,并浏览一个官方,本篇主要介绍一下怎么写一个GStreamer应用,在编码之前我们先一起详细了解编写应用的一些基本组件和概念。 当我们基于GStreamer开发一个应用程序时,使用gst/gst.h即可访问库文件,除此之外,还需要初始化GStreamer library,我们使用 初始化,它的主要功能如下在不需要gst_init处理命令行参数时,我们可以讲NULL作为其参数,例如:gst_init(NULL, NULL);下面是一个简单的demo, 你

我的专栏 2972

基于ANSYS的电磁兼容仿真教程

最近,在做某系统的EMC仿真,使用ANSYS套件,对仿真学习做简要记录。本书简介与目录如下:本书配套有:视频教程+工程源文件+彩色仿真图片,下载链接如下:(审核中)第1章 基础知识1.1 电磁兼容基础​​​MS2、EMC三要素:3、 国际无线电干扰特别委员会标准:CISPR标准4、电磁兼容测试认证:传导发射(CE)、传导敏感度(CS)、辐射发射(RE)和辐射敏感度(RS)测试。

weixin_42508010的博客 2051

Gstreamer应用开发实战指南(四)

一、GStreamer中的元素 二、GStreamer中的Bins 三、GStreamer中总线

程序猿老樊的博客 2284

librealsense2 camera.so: undefined symbol:ZN2cV3MatC1EV解决笔记记录

先参考的这个兄弟的办法虽然没解决但是提供了大方向感谢; realsenseD400系列相机报错:undefined symbol: _ZN2cv3MatC1EiiiRKNS_7Scalar_IdEE解决方案 后解决办法参考 No GPU usage on jetson xavier NX · Issue #2326 · IntelRealSense/realsense-ros · GitHubOpenCV_DIR" to a directory containing one of the above f

梁俊星的博客 3516

第2.0章 机器人C++学习开篇(一):SLAM为什么使用C++语言及学习路线资料推荐

ROS(机器人操作系统):机器人领域的“操作系统”,提供节点通信、参数管理、工具链支持,是SLAM算法在机器人上部署的核心框架。PCL(点云库):处理三维点云数据的利器,包含滤波、分割、配准等算法,是激光SLAM的核心依赖。Eigen(矩阵运算库):高效的矩阵与线性代数运算库,SLAM中的位姿变换、优化求解都依赖它。Ceres/G2O(优化库):SLAM后端优化的“王牌”,Ceres擅长通用非线性优化,G2O则专为图优化设计,二者是BA( bundle adjustment)等算法的实现基础。

行知SLAM 1242

GStreamer——教程——基础教程2:GStreamer concepts

本教程展示了:如何使用() 创建element如何使用()创建一个空的pipeline。如何使用()向pipeline中添加element。如何使用()连接element。

FREEDOM_X的专栏 1065

【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

【WorkBuddy专栏57】你的左侧空间不是「日任务清单」——工作空间才是 WB 变聪明的核心秘密

AI人人懂 678

GStreamer开发实例2: GStreamer concepts

这篇教程展示了:如何使用创建element。如何使用创建一个空的pipeline。如何使用向pipeline中添加element。如何使用连接element。总计有两篇教程介绍GStreamer的基本概念,这是第一篇,下一篇是第二篇。

浩瀚之水的专栏 360

基于STM32F1XX 、HAL库的LTR-303ALS-01 环境光传感器驱动应用C语言程序设计

printf("制造商ID: 0x%02X\r\n", LTR303_ReadManufacID());printf("器件ID: 0x%02X\r\n", LTR303_ReadPartID());LTR-303ALS-01是一款数字环境光传感器(ALS),由Lite-On公司生产。printf("LTR-303ALS初始化失败!printf("LTR-303ALS初始化成功!printf("数据无效\r\n");* @param mode: 0-待机, 1-激活。

PP_Cottage的博客 1033

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉冲宽度或者产生特定频率的脉冲、PWM波等。可用于自动化控制、电源等领域。 输入捕获是通用定时器功能之一,一般用于测量频率和测量脉冲宽度。本文将详细介绍如何通用定时器的输入捕获功能。

视觉与物联智能 2814

【GStreamer 】Basic tutorials-Basic tutorial 2: GStreamer concepts

第一个参数是要创建的元素的类型(基础教程 14:方便的元素展示了一些常见类型,基础教程 10:GStreamer 工具展示了如何获取所有可用类型的列表)。我们要求 Gst.Bus.timed_pop_filtered() 在 GStreamer 遇到错误条件或 Gst.MessageType.EOS 时返回,因此我们需要检查发生了哪种情况,并在屏幕上打印一条消息(您的应用程序可能需要执行更复杂的操作)。注意:在设置属性的所有三种方法中,如果将字符串作为要设置的值传递,则它必须是标志或值的序列化版本(使用。

qq_43298381的博客 543

OData Request:Create Entity 在 ABAP OData Client Proxy 中的工程化实践

文章摘要 本文针对具备 SAP Gateway 与 ABAP 开发经验的读者,详细讲解如何通过 ABAP OData Client Proxy 实现 OData 服务的 Create 操作。首先对比了 OData V2 与 V4 的 Create 规范差异,强调键、集合 URL 和请求体的标准化要求。随后介绍了 ABAP Client Proxy 的编程模型,包括 Client Proxy、Entity List Resource 和 Create Request/Response 三个核心对象,并提供了完

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 247

GStreamer官方教程系列——Basic tutorial 2: GStreamer concepts

GStreamer官方教程系列 Basic tutorial 2: GStreamer concepts 原文:https://gstreamer.freedesktop.org/documentation/tutorials/basic/concepts.html?gi-language=c 目标   上一个教程展示了如何自动构建一个管道。而本教程我们将会手动构建管道,实例化每个元件并且将它们链接在一起。在这个过程中,我们会学习到: 什么是GStreamer元件以及如何创建它。 怎么链接元件。 怎么自定

SaberZXL520的博客 324

python乘法运算 信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

本文解析了全国青少年信息素养大赛Python编程挑战赛的乘法运算题目。题目要求通过递归算法实现两个自然数的乘法运算,并输出算式。算法分析指出可将乘法转化为累加,使用递归函数实现。程序代码展示了一个自定义函数add(),通过递归调用完成累加运算。文章还分析了考点,包括递归函数、输入处理、分支语句等编程基础知识的应用。最后强调解题方法的多样性,重点在于理解递归原理和实现题目要求。该题目难度适中,主要考查选手对递归算法的理解和编程基础能力。

青少年编程学习指导 789

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

GStreamer笔记 -- 2.GStreamer concepts

GStreamer conceptsGoalManual Hello World编译Walkthrough创建元素创建管道设置属性Error checkingThe GStreamer bus Goal 在上一个教程,我们已经知道了怎么自动创建一个pipline。现在我们将要手动实例化一些元素,并且把它们连接到一起,形成一个pipeline,我们将要学到如下 什么是gstream 的元素并且怎么创建一个元素 怎么将创建的元素连接起来 怎么定制元素的属性 怎么监视总线(bus)的错误信息,并提取出gstre

xf1234的博客 507

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

GStreamer 基础教程学习 2 - GStreamer概念 (Basic tutorial 2: GStreamer concepts)

https://gstreamer.freedesktop.org/documentation/tutorials/basic/concepts.html?gi-language=c 上一节教程介绍了一个playbin,这一节具体介绍整个管道是如何构建的。 1. Element Creation 元素的创建 /* Create the elements */ source = gst_e...

gsymichael的专栏 539

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

GStreamer Tutorial 中文翻译:Basic tutorial 2: GStreamer concepts

GStreamer Tutorial 2中文翻译 文章目录GStreamer Tutorial 2中文翻译前言[Basic tutorial 2: GStreamer concepts](https://gstreamer.freedesktop.org/documentation/tutorials/basic/concepts.html?gi-language=c)目的Hello world代码走读`gst_parse_launch``playbin`清理工作结论 前言 由于工作原因,用的GStre

wuchangwen0216的博客 278

Gstreamer官方教程汇总2---GStreamer concepts

https://my.oschina.net/u/735973/blog/202314 摘要: 将gstreamer的官方教程做了一下整理,分享给需要的人们。 Manual Hello World 将下面代码copy到一个命名为basic-tutorial-1.c的文件中。 #include     int main(int argc, char *argv[]) 

STN_LCD的专栏 773

gstreamer插件编写教程2-Advanced Concepts

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84621238 文档教程:https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/index.html   目录 Advanced Concepts Request and Somet...

knowledgebao的博客 2244

Gstreamer插件教程3.2—高级概念(Advanced Concepts):Cap协商(Caps negotiation)

cap协商是找到一种两个element都能够处理的媒体格式(即GstCaps)的一种行为。Gstreamer中的这种处理,对于整个pipeline,大多数情况下都可以找到最优的解决方案。在这个章节,我们解释了它是怎样工作的。 Caps negotiation basics 在Gstreamer中,媒体格式的协商总是遵循如下的简单规则: 一个下游的element在它的sinkpad上建

hwmstudent的博客 1799

Gstreamer插件教程3.2—高级概念(Advanced Concepts):不同的调度模式(Different scheduling modes)

一个pad的调度模式定义了数据是如何从source pad中接收及发送至sink pad。Gstreamer能够运行两种调度模式,分别称为push和pull模式。Gstreamer支持element能够拥有可以任何方式调度的pad,一个element中的pads并不需要以相同的调度模式运行。 目前为止,我们只讨论了_chain()函数运行element,如,在sink pad上设置了chain函数的element将push数据到它的source pad中。我们称这种模式为push模式,因为一个同级的elem

hwmstudent的博客 1165

Advanced GStreamer concepts

In this part we will cover the more advanced features of GStreamer.With the basics you learned in theprevious part you should be able to create a simple application. However, GStreamer provides much

shenbin1430的专栏 2045

多媒体框架 FFmpeg 和 GStreamer

多媒体框架是一种软件框架,它在电脑上处理媒体数据并通过网络进行传播。一个良好的多媒体框架提供了直观的API和模块化的架构,这使得它易于添加对新的音频、视频和容器格式以及传输协议的支持。

wei_Embedded_z的博客 391

Gstreamer插件教程3.1—高级概念(Advanced Concepts):需求pads和间或pads(Request and Sometimes pads)

到目前为止,你应该能够创建可以接收和发送数据的filter element。这是Gstreamer所支持的简单模型。但Gstreamer还可以做更多的事!在这接下来的章节,我们将讨论多个高级主题,如时间安排、特殊的pad类型、时钟、事件、接口和标签等更多。这些主题使得应用中使用Gstreamer更简单。 直到目前为止,我们只处理了那些一直存在的pads,然而,还有许多pads是只有在某些时候或只有应用程序要求时才被创建的。第一个被称为sometimes pad,第二个被称为request pad。pad的可

hwmstudent的博客 1257
上一篇: gstreamer基础教程1-Hello world
下一篇: gstreamer基础教程3-Dynamic pipelines
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值