GStreamer学习笔记(一)

本文介绍如何使用GStreamer框架创建一个简单的MP3播放器。文章详细解释了所需组件的作用及如何通过管道连接这些组件来实现播放功能。

本文介绍如何使用GStreamer 编写一个简单的MP3播放器。

1,需要使用mad解码插件,因此需要先安装gstreamer0.10-plugins-ugly

2,编写mp3播放器

下面来看看如何利用GStreamer框架提供的组件,来实现一个简单的MP3播放器。数据源元件负责从磁盘上读取数据,过滤器元件负责对数据进行解码,而接受器元件则负责将解码后的数据写入声卡。

如果想要在程序中应用GStreamer提供的各种功能,首先必须在主函数中调用gst_init()来完成相应的初始化工作,以便将用户从命令行输入的参数传递给GStreamer函数库。一个典型的GStreamer应用程序的初始化如下所示:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<gst/gst.h>
intmain(intargc,char*argv[])
{
gst_init(
&argc,&argv);
/**/
}

接下去需要创建三个元件并连接成管道,由于所有GStreamer元件都具有相同的基类GstElement,因此能够采用如下方式进行定义:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->GstElement*pipeline,*filesrc,*decoder,*audiosink;

管道在GStreamer框架中是用来容纳和管理元件的,下面的代码将创建一条名为pipeline的新管道:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*创建用来容纳元件的新管道*/
pipeline
=gst_pipeline_new("pipeline");

数据源元件负责从磁盘文件中读取数据,它具有名为location的属性,用来指明文件在磁盘上的位置。使用标准的GObject属性机制可以为元件设置相应的属性:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*创建数据源元件*/
filesrc
=gst_element_factory_make("filesrc","disk_source");
g_object_set(G_OBJECT(filesrc),
"location",argv[1],NULL);

过滤器元件负责完成对MP3格式的数据进行解码,最简单的办法是安装mad这一插件,借助它来完成相应的解码工作:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*创建过滤器元件*/
decoder
=gst_element_factory_make("mad","decoder");

接收器元件负责将解码后的数据利用声卡播放出来:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*创建接收器元件*/
audiosink
=gst_element_factory_make("audiosink","play_audio")

已经创建好的三个元件需要全部添加到管道中,并按顺序连接起来:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*添加元件到管道中*/
gst_bin_add_many(GST_BIN(pipeline),filesrc,decoder,audiosink,NULL);
/*通过衬垫连接元件*/
gst_element_link_many(filesrc,decoder,audiosink,NULL);

所有准备工作都做好之后,就可以通过将管道的状态切换到PLAYING状态,来启动整个管道的数据处理流程:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*启动管道*/
gst_element_set_state(pipeline,GST_STATE_PLAYING);

这里加入一个消息处理函数bus_call来监视产生的消息

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*终止管道*/
gst_element_set_state(pipeline,GST_STATE_NULL);
/*释放资源*/
gst_object_unref(GST_OBJECT(pipeline));

3,完整的源代码如下所示:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<gst/gst.h>
#include
<glib.h>
//定义消息处理函数,
staticgbooleanbus_call(GstBus*bus,GstMessage*msg,gpointerdata)
{
GMainLoop
*loop=(GMainLoop*)data;//这个是主循环的指针,在接受EOS消息时退出循环
switch(GST_MESSAGE_TYPE(msg))
{
caseGST_MESSAGE_EOS:
g_print(
"Endofstream/n");
g_main_loop_quit(loop);
break;
caseGST_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;
}
returnTRUE;
}

intmain(intargc,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<mp3filename>/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(
"Oneelementcouldnotbecreated.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,stoppingplayback/n");
gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
return0;
}

4,编译运行

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->gcc-Wall$(pkg-config--cflags--libsgstreamer-0.10)-gtest2.c-otest2
./test2/home/phinecos/test.mp3

好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解些相关的知识,下面是学习笔记: 1. gstreamer个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输的效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值