gstreamer-1.0安装

apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

概念

GStreamer应用开发手册学习笔记之一
GStreamer应用开发手册学习笔记之二

官网例程

Basic tutorial

例程源码

git clone https://gitlab.freedesktop.org/gstreamer/gst-docs

例1

GStreamer-1.0的使用–基础教程(1):Hello world! C语言

例2

GStreamer-1.0的使用–基础教程(2):GStreamer的概念 C语言

例3

目标:
本教程介绍了使用GStreamer所需的其余基本概念,它允许在信息可用时“动态”构建管道,而不是在应用程序开始时定义单一管道。
完成本教程后,您将具备开始播放教程所需的知识。此处审查的要点包括:
如何在链接元素时实现更精细的控制。
如何得知有趣的事件,以便及时做出反应。
一个元素可以处于的各种状态。
介绍:
正如您即将看到的,本教程中的管道在设置为播放状态之前尚未完全构建。这没关系。如果我们不采取进一步的行动,数据将到达管道的末端,管道将产生错误消息并停止。但我们将采取进一步行动。。。
在本例中,我们打开一个multiplexed (or muxed)多路复用(或多路复用)的文件,即音频和视频一起存储在一个容器文件中。负责打开此类容器的元素称为demuxers解复用器,容器格式的一些示例有Matroska(MKV)、Quick Time(QT、MOV)、Ogg或Advanced Systems Format(ASF、WMV、WMA)。
如果容器嵌入多个流(例如,一个视频和两个音频曲目),demuxer解复用器将分离它们并通过不同的输出端口公开它们。通过这种方式,可以在管道中创建不同的分支,处理不同类型的数据。
GStreamer元素相互通信的端口称为pads(GstPad)。存在数据进入元素的sink pads接收器焊盘和数据退出元素的source pads源焊盘。很自然地,source elements源元素仅包含源焊盘,sink elements汇元素仅包含汇焊盘,而filter elements过滤器元素同时包含这两者
demuxer:

代码解释

/* Create the elements */
data.source = gst_element_factory_make ("uridecodebin", "source");
data.convert = gst_element_factory_make ("audioconvert", "convert");
data.resample = gst_element_factory_make ("audioresample", "resample");
data.sink = gst_element_factory_make ("autoaudiosink", "sink");

我们像往常一样创建元素。uridecodebin将在内部实例化所有必要的元素(源、解复用器和解码器),以将URI转换为原始音频和/或视频流。它完成了playbin一半的工作。由于它包含解复用器,它的源焊盘最初不可用,我们需要动态链接到它们。
audioconvert对于在不同的音频格式之间进行转换非常有用,因为音频解码器生成的格式可能与音频接收器期望的格式不同,因此,请确保此示例在任何平台上都能正常工作。
audioresample对于在不同的音频采样率之间进行转换非常有用,同样,可以确保此示例在任何平台上都能工作,因为音频解码器产生的音频采样率可能不是音频接收器支持的。
对于音频,autoaudiosink与上一教程中的autovideosink等效。它将向声卡呈现音频流。

if (!gst_element_link_many (data.convert, data.resample, data.sink, NULL)) {g_printerr ("Elements could not be linked.\n");gst_object_unref (data.pipeline);return -1;
}

在这里,我们链接元素转换器、重采样和接收器,但我们不将它们与源链接,因为此时它不包含源焊盘。我们只是让这个分支(转换器+接收器)保持未链接状态,直到稍后。

/* Connect to the pad-added signal */
g_signal_connect (data.source, "pad-added", G_CALLBACK (pad_added_handler), &data);

GST信号是GStreamer中的一个关键点。它们允许在发生有趣的事情时通知您(通过回调)。信号由名称标识,每个GObject都有自己的信号。
在这一行中,我们附加到源的“pad added”信号(一个uridecodebin元素)。为此,我们使用g_signal_connect()并提供要使用的回调函数(pad_added_handler)和数据指针。GStreamer对这个数据指针不做任何处理,它只是将它转发给回调,以便我们可以与它共享信息。在本例中,我们将传递一个指针,指向为此专门构建的CustomData结构。
GstElement生成的信号可以在其文档中找到,也可以使用gst-inspect-1.0工具,如基础教程10:GStreamer工具中所述。
我们现在准备出发了!只需将管道设置为播放状态,并开始收听总线上有趣的消息(如错误或EOS),就像前面的教程一样。

回调函数解析:

static void pad_added_handler (GstElement *src, GstPad *new_pad, CustomData *data)

当我们的源元素最终有足够的信息开始生成数据时,它将创建源焊盘,并触发“添加焊盘”信号。此时将调用我们的回调函数

GstPad *sink_pad = gst_element_get_static_pad (data->convert, "sink");

新建convert的sink

/* If our converter is already linked, we have nothing to do here */
if (gst_pad_is_linked (sink_pad)) {g_print ("We are already linked. Ignoring.\n");goto exit;
}

检查是否已链接

/* Check the new pad's type */
new_pad_caps = gst_pad_get_current_caps (new_pad, NULL);
new_pad_struct = gst_caps_get_structure (new_pad_caps, 0);
new_pad_type = gst_structure_get_name (new_pad_struct);
if (!g_str_has_prefix (new_pad_type, "audio/x-raw")) {g_print ("It has type '%s' which is not raw audio. Ignoring.\n", new_pad_type);goto exit;
}

检查是否为audio/x-raw

/* Attempt the link */
ret = gst_pad_link (new_pad, sink_pad);
if (GST_PAD_LINK_FAILED (ret)) {g_print ("Type is '%s' but link failed.\n", new_pad_type);
} else {g_print ("Link succeeded (type '%s').\n", new_pad_type);
}

林肯死大头

GStreamer States的四种状态:NULL,READY,PAUSED,PLAYING
你只能在相邻的状态之间移动,也就是说,你不能从空变为播放,你必须经历中间的准备状态和暂停状态。但是,如果将管道设置为播放,GStreamer将为您进行中间转换。

case GST_MESSAGE_STATE_CHANGED:/* We are only interested in state-changed messages from the pipeline */if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) {GstState old_state, new_state, pending_state;gst_message_parse_state_changed (msg, &old_state, &new_state,&pending_state);g_print ("Pipeline state changed from %s to %s:\n",gst_element_state_get_name (old_state),gst_element_state_get_name (new_state));}

我们添加了这段代码,用于侦听有关状态更改的总线消息,并在屏幕上打印这些消息,以帮助您理解转换。每个元素都会将有关其当前状态的消息放在总线上,因此我们会将它们过滤掉,只侦听来自管道的消息。

gstreamer-1.0学习笔记相关推荐

  1. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  4. CCC3.0学习笔记_认证和隐私保护

    CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  7. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  8. Tensorflow2.0学习笔记(二)

    Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...

  9. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

  10. Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲

    Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲 返回目录 这个笔记现在是主要根据北京大学曹健老师的视频写的,这个视频超级棒,非常推荐. 第一讲 常用函数的使用(包含了很多琐碎的函 ...

最新文章

  1. TPOT: 自动化的sklearn
  2. mysql时间戳group by操作,mysql使用FROM_UNIXTIME将时间戳按日期group by
  3. 点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019
  4. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
  5. JavaScript+HTML+CSS 无缝滚动轮播图的两种方式
  6. hive 结构metastone_深入理解hive之事务处理
  7. ArrayList clone()– ArrayList深拷贝和浅拷贝
  8. 锦标赛排序、洪水填充算法、平衡规划
  9. ★LeetCode(669)——修剪二叉搜索树(JavaScript)
  10. isinstance / issubclass / type, 方法和函数, 反射
  11. Q137:PBRT-V3,各种采样(Sampling)之间的逻辑
  12. wap绿色传奇搭建(纯净版)
  13. Storm 的一个案例
  14. 全国计算机软考机试试题,软考机试试题.doc
  15. 阿里云商标注册流程步骤-阿里云商标自助注册申请步骤
  16. 计算机表格两行互换步骤,excel怎么让两行互换位置,EXCEL里两个格的内容怎么互换?...
  17. Windows 开机自动拨号上网
  18. 自定义View - 仿QQ运动步数效果
  19. STM32探索之路——使用JLink仿真器烧写固件的原理
  20. excel操作系列之中文姓名转英文姓名

热门文章

  1. python和百度地图API实现数据地图标注
  2. 微信小程序第三次培训笔记
  3. java中easyUI开发环境搭建
  4. 前端开发工作提炼亮点
  5. 浅谈量子密钥分配技术
  6. 自动售货机驱动板与android,一种自动售货机的逻辑驱动板的制作方法
  7. 《华林科纳-半导体工艺》单晶圆清洁工艺
  8. 西北农林科技大学与陕西师范大学计算机,陕西师大比较稳定!如何看待陕西19校在四大排行榜上的综合排名!...
  9. int *p和int **p
  10. python爬虫租房信息在地图上显示