- 外文名
- gstreamer
- 领 域
- 计算机技术
- 技 术
- 解码和过滤技术
- 属 性
- 开源的多媒体框架库
- 桌面环境
- GNOME
-
gstreamer
2020-12-31 00:09:33<div><p>I would like to try gstreamer-1.0 to stream from the camera. It has a very nice client for android. I have problems with RTSP and VLC on Android. <p>Can you please include it or point me to ... -
GStreamer
2018-06-20 18:40:55本文介绍如何使用GStreamer 编写一个简单的MP3播放器。1,需要使用mad解码插件,因此需要先安装gstreamer0.10-plugins-ugly2,编写mp3播放器下面来看看如何利用GStreamer框架提供的组件,来实现一个简单的MP3播放器。...本文介绍如何使用GStreamer 编写一个简单的MP3播放器。
1,需要使用mad解码插件,因此需要先安装gstreamer0.10-plugins-ugly
2,编写mp3播放器
下面来看看如何利用GStreamer框架提供的组件,来实现一个简单的MP3播放器。数据源元件负责从磁盘上读取数据,过滤器元件负责对数据进行解码,而接受器元件则负责将解码后的数据写入声卡。
如果想要在程序中应用GStreamer提供的各种功能,首先必须在主函数中调用gst_init()来完成相应的初始化工作,以便将用户从命令行输入的参数传递给GStreamer函数库。一个典型的GStreamer应用程序的初始化如下所示:
#include <gst/gst.h>
int main (int argc, char *argv[])
{
gst_init (&argc, &argv);
/**/
}接下去需要创建三个元件并连接成管道,由于所有GStreamer元件都具有相同的基类GstElement,因此能够采用如下方式进行定义:
GstElement *pipeline, *filesrc, *decoder, *audiosink;管道在GStreamer框架中是用来容纳和管理元件的,下面的代码将创建一条名为pipeline的新管道:
/* 创建用来容纳元件的新管道 */
pipeline = gst_pipeline_new ("pipeline");数据源元件负责从磁盘文件中读取数据,它具有名为location的属性,用来指明文件在磁盘上的位置。使用标准的GObject属性机制可以为元件设置相应的属性:
/* 创建数据源元件 */
filesrc = gst_element_factory_make ("filesrc", "disk_source");
g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);过滤器元件负责完成对MP3格式的数据进行解码,最简单的办法是安装mad这一插件,借助它来完成相应的解码工作:
/* 创建过滤器元件 */
decoder = gst_element_factory_make ("mad", "decoder");接收器元件负责将解码后的数据利用声卡播放出来:
/* 创建接收器元件 */
audiosink = gst_element_factory_make ("audiosink", "play_audio")已经创建好的三个元件需要全部添加到管道中,并按顺序连接起来:
/* 添加元件到管道中 */
gst_bin_add_many (GST_BIN (pipeline), filesrc, decoder, audiosink, NULL);
/* 通过衬垫连接元件 */
gst_element_link_many (filesrc, decoder, audiosink, NULL);所有准备工作都做好之后,就可以通过将管道的状态切换到PLAYING状态,来启动整个管道的数据处理流程:
/* 启动管道 */
gst_element_set_state (pipeline, GST_STATE_PLAYING);这里加入一个消息处理函数bus_call来监视产生的消息
/* 终止管道 */
gst_element_set_state (pipeline, GST_STATE_NULL);
/* 释放资源 */
gst_object_unref (GST_OBJECT (pipeline));3,完整的源代码如下所示:
#include <gst/gst.h>
#include <glib.h>
//定义消息处理函数,
static gboolean bus_call(GstBus *bus,GstMessage *msg,gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;//这个是主循环的指针,在接受EOS消息时退出循环
switch (GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_EOS:
g_print("End of stream\n");
g_main_loop_quit(loop);
break;
case GST_MESSAGE_ERROR:
{
gchar *debug;
GError *error;
gst_message_parse_error(msg,&error,&debug);
g_free(debug);
g_printerr("ERROR:%s\n",error->message);
g_error_free(error);
g_main_loop_quit(loop);
break;
}
default:
break;
}
return TRUE;
}
int main(int argc,char *argv[])
{
GMainLoop *loop;
GstElement *pipeline,*source,*decoder,*sink;//定义组件
GstBus *bus;
gst_init(&argc,&argv);
loop = g_main_loop_new(NULL,FALSE);//创建主循环,在执行 g_main_loop_run后正式开始循环
if(argc != 2)
{
g_printerr("Usage:%s <mp3 filename>\n",argv[0]);
return -1;
}
//创建管道和组件
pipeline = gst_pipeline_new("audio-player");
source = gst_element_factory_make("filesrc","file-source");
decoder = gst_element_factory_make("mad","mad-decoder");
sink = gst_element_factory_make("autoaudiosink","audio-output");
if(!pipeline||!source||!decoder||!sink){
g_printerr("One element could not be created.Exiting.\n");
return -1;
}
//设置 source的location 参数。即 文件地址.
g_object_set(G_OBJECT(source),"location",argv[1],NULL);
//得到 管道的消息总线
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
//添加消息监视器
gst_bus_add_watch(bus,bus_call,loop);
gst_object_unref(bus);
//把组件添加到管道中.管道是一个特殊的组件,可以更好的让数据流动
gst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULL);
//依次连接组件
gst_element_link_many(source,decoder,sink,NULL);
//开始播放
gst_element_set_state(pipeline,GST_STATE_PLAYING);
g_print("Running\n");
//开始循环
g_main_loop_run(loop);
g_print("Returned,stopping playback\n");
gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
return 0;
}4,编译运行
gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10) -g test2.c -o test2
./test2 /home/phinecos/test.mp3 -
Gstreamer
2012-01-04 23:00:50GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的多媒体框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据...GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的多媒体框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据。
-
gstreamer源码
2019-01-16 10:32:34This is GStreamer Version 0.10.19 on S60 platform. WHAT S60 PLATFORMS GSTREAMER SUPPORTS Currently GStreamer is supported on S60 3.2 and 5.0 SDK's. WHAT GSTREAMER SUPPORTS ON SYMBIAN PLATFORM -
gstreamer:GStreamer开源多媒体框架核心库-源码
2021-02-07 23:39:32gstreamer:GStreamer开源多媒体框架核心库 -
gstreamer-test
2020-12-24 11:51:23gstreamer-test -
GStreamer讲解
2018-06-14 20:49:56GStreamer 资料分享,C/C++音视频调试方法及策略。。。。。 -
gstreamer stalling?
2020-12-09 12:38:23[gstreamer] gstreamer changed state from NULL to READY ==> mysink [gstreamer] gstreamer changed state from NULL to READY ==> videorate3 [gstreamer] gstreamer changed state from ... -
gstreamer plugin
2020-12-27 13:19:01But I see that gstreamer code doesn't use gptp or mrp functionality of AVB. May I know if there were any limitations for mrp and gptp ? I want to incorporate gptp and mrp into gstreamer. Please ... -
GStreamer讲解.pptx
2020-12-24 14:17:54GStreamer讲解 -
Gstreamer应用开发手册1:关于Gstreamer
2020-04-28 11:58:50在之前的Gstreamer基础教程中,介绍了gstreamer基础相关的知识,目的是起到入门的作用。接下来在应用开发手册系列教程中,将更多的从技术角度,介绍更多的概念和功能,起到更好的学习效果。 1 什么是gstreamer ...在之前的Gstreamer基础教程中,介绍了gstreamer基础相关的知识,目的是起到入门的作用。接下来在应用开发手册系列教程中,将更多的从技术角度,介绍更多的概念和功能,起到更好的学习效果。
1 什么是gstreamer
GStreamer 是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了 DirectShow 的设计思想。
GStreamer 的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。在编写处理音频、视频或者两者皆有的应用程序时, GStreamer 可以让你的工作变得简单。 GStreamer 并不受限于音频和视频处理, 它能够处理任意类型的数据流。管道设计的方法对于实际应用的滤波器几乎没有负荷, 它甚至可以用来设计出对延时有很高要求的高端音频应用程序。
GStreamer 最显著的用途是在构建一个播放器上。 GStreamer 已经支持很多格式的文件了, 包括:MP3、 Ogg/Vorbis、 MPEG-1/2、 AVI、 Quicktime、 mod 等等。从这个角度看,GStreamer 更象是一个播放器。但是它主要的优点却是在于: 它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用 GStreamer 编写一个万能的可编辑音视频应用程序成为可能。
GStreamer 框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。 GStreamer 的管道能够被 GUI 编辑器编辑, 能够以 XML 文件来保存。这样的设计使得管道程序库的消耗变得非常少。
GStreamer 核心库函数是一个处理插件、数据流和媒体操作的框架。 GStreamer 核心库还提供了一个 API, 这个 API 是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它。特别地,gstreamer提供:
- 多媒体应用API
- 插件架构
- 管道架构
- 媒体类型处理/协商机制
- 同步机制
- 超过1000个element、250个插件
- 一系列工具
gstreamer的插件主要分为
- protocols handling
- sources: for audio and video (involves protocol plugins)
- formats: parsers, formaters, muxers, demuxers, metadata, subtitles
- codecs: coders and decoders
- filters: converters, mixers, effects, ...
- sinks: for audio and video (involves protocol plugins)
gstreamer库主要包含
- gstreamer: the core package
- gst-plugins-base: an essential exemplary set of elements
- gst-plugins-good: a set of good-quality plug-ins under LGPL
- gst-plugins-ugly: a set of good-quality plug-ins that might pose distribution problems
- gst-plugins-bad: a set of plug-ins that need more quality
- gst-libav: a set of plug-ins that wrap libav for decoding and encoding
- a few others packages
2 设计原则
结构清晰且威力强大
GStreamer 提供一套清晰的接口给以下一些开发人员:
- 希望构建媒体管道的应用程序员。程序员可以使用一系列强有利的工具来创建媒体管道,而不用去写一行代码,从而使得复杂的媒体控制变得非常简单。
- 插件程序员。 GStreamer 向插件程序员提供了简洁而简单的 API 来创建 self-plugin(自包含)插件,同时还集成了大量的调试和跟踪机制和工具。 GStreamer 也提供了一系列现实例子。
面向对象的编程思想
GStreamer 是依附于 GLib 2.0 对象模型的,熟悉 GLib 或者旧版本的 GTK+的程序员对 GStreamer将会驾轻就熟。GStreamer 采用了信号与对象属性的机制。所有对象的属性和功能都能在运行态被查询。GStreamer 与 GTK+的编程方法非常相似,需要对象模型,对象所有(ownership of objects),参考计算(reference counting) ...
灵活的可扩展性能
所有的 GStreamer 对象都可以采用 GObject 继承的方法进行扩展。所有的插件都可以被动态装载,可以独立的扩展或升级。
支持插件以二进制形式发布
作为共享库发布的插件能够在运行态直接加载,插件的所有属性可以由 GObject 属性来设置,而无需(事实上决不)去安装插件的头文件。我们更多的关注在插件能够独立化,运行的时候还需要很多与插件相关的因素。
高性能
高性能主要体现在:
- 使用 GLib 的 g_mem_chunk 和非模块化分配算法使得内存分配尽可能最小。
- 插件之间的连接非常轻型(light-weight)。数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。
- 提供了一套对目标内存直接进行操作的机制。例如,插件可以向 X server 共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。
- refcounting和写拷贝将 memcpy减少到最低。子缓冲区有效地将缓冲区分离为易于管理的块。
- 使用线程联合(cothreads)减少线程消耗。线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗 600 个 cpu 周期的标准。
- 使用特殊的插件从而支持硬件加速。
- 采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。
- 所有的判断数据都不用互斥锁。
核心库与插件(core/plugins)分离
GStreamer 内核的本质是 media-agnostic,我们了解的仅仅是字节和块,以及包含基本的元件,GStreamer 内核的强大功能甚至能够实现底层系统工具,像 cp。所有的媒体处理功能都是由插件从外部提供给内核的,并告诉内核如何去处理特定的媒体类型。
为多媒体数字信号编解码实验提供一个框架
GStreamer 成为一个简单的框架,编解码器的开发人员可以试验各种不同的算法,提高开源多媒体编解码器开发的速度,如 Theora and Vorbis。
3 基本概念
元件(element)
元件(element)是 GStreamer 中最重要的概念。你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传输。每个元件(Elements)都有一个特殊的函数接口,对于有些元件(Elements)的函数接口它们是用于能够读取文件的数据,解码文件数据的。而有些元件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如,声卡设备)。你可以将若干个元件(Elements)连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,例如,媒体播放或者录音。 GStreamer 已经默认安装了很多有用的元件(Elements),通过使用这些元件(Elements)你能够构建一个具有多种功能的应用程序。当然,如果你需要的话,你可以自己编写一个新的元件(Elements)。对于如何编写元件(Elements)的话题在 GStreamer Plugin Writer's Guide 中有详细的说明。
衬垫(pads)
衬垫(Pads)在 GStreamer 中被用于多个元件的链接,从而让数据流能在这样的链接中流动。 一个衬垫(Pads)可以被看作是一个元件(element)插座或者端口,元件(element)之间的链接就是依靠着衬垫(Pads)。 衬垫(Pads)有处理特殊数据的能力:一个衬垫(Pads)能够限制数据流类型的通过。链接成功的条件是:只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立。数据类型的设定使用了一个叫做 caps negotiation 的方法。数据类型被为一个 GstCaps 变量所描述。
下面的这个比喻可能对你理解衬垫(Pads)有所帮助。一个衬垫(Pads)很象一个物理设备上的插头。例如一个家庭影院系统。一个家庭影院系统由一个功放(amplifier),一个 DVD 机,还有一个无声的视频投影组成。 我们需要连接 DVD 机到功放(amplifier),因为两个设备都有音频插口;我们还需要连接投影机到 DVD 机上,因为 两个设备都有视频处理插口。但我们很难将投影机与功放(amplifier)连接起来,因为他们之间处理的是不同的 插口。 GStreamer 衬垫(Pads)的作用跟家庭影院系统中的插口是一样的。
对于大部分情况,所有的数据流都是在链接好的元素之间流动。数据向元件(element)以外流出可以通过一个或者多个 source 衬垫(Pads),元件(element)接受数据是通过一个或者多个 sink 衬垫(Pads)来完成的。 Source 元件(element)和 sink 元件(element)分别有且仅有一个 sink 衬垫(Pads)或者 source 衬垫(Pads)。数据在这里代表的是缓冲区(buffers) (GstBuffer对象描述了数据的缓冲区(buffers)的信息)和事件(events) (GstEvent 对象描述了数据的事件(events)信息)
箱柜(Bins)和管道(pipelines)
箱柜(Bins)是一个可以装载元件(element)的容器。管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins), 通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态。箱柜(Bins)可以发送总线消息(bus messages)给它的子集元件(element)(这些消息包括:错误消息(error messages),标签消息(tag messages),EOS 消息(EOS messages))。
管道(pipeline)是高级的箱柜(Bins)。当你设定管道的暂停或者播放状态的时候,数据流将开始流动,并且媒体数据处理也开始处理。一旦开始,管道将在一个 单独的线程中运行,直到被停止或者数据流播放完毕。
通讯
GStreamer提供了几种在应用程序和管道之间进行通信和数据交换的机制。
- 缓冲区(buffers)是用于在管道中的元件之间传递流数据的对象,缓冲区始终从source流动到sink(下游)。
- 事件(events)是在元件之间或从应用程序发送到元件的对象。事件可以在上游和下游传播。下游事件可以同步到数据流。
- 消息(messages)是由管道的消息总线上的元件发布的对象,这些元件将在其中保留以供应用程序收集。可以从发布消息的元件的流线程上下文中同步拦截消息,但是通常由应用程序从应用程序的主线程异步处理消息。消息用于以线程安全的方式从元件到应用程序传输信息,例如错误,标签,状态更改,缓冲状态,重定向等。
- 查询(queries)允许应用程序从管道中请求信息,例如持续时间或当前播放位置。查询总是同步回答。元件还可以使用查询从其对等元件请求信息(例如文件大小或持续时间)。可以在管道中同时使用它们,但是上游查询更为常见。
-
Gstreamer Pipeline
2020-12-29 16:35:33<div><p>Instead of encoding with ffmpeg, does anyone have an example for a gstreamer pipeline, preferably using webM instead of H.264?</p><p>该提问来源于开源项目:vbence/stream-m</p></div>