linux音乐播放器界面设置代码,使用GSystem 编写一个最简单的Linux音乐播放器(GTK代码)...

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

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

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

2,编写mp3播放器

下面来看看如何利用GStreamer框架提供的组件,来实现一个简单的MP3播放器。

数据源元件负责从磁盘上读取数据,过滤器元件负责对数据进行解码,而接受器元件则

负责将解码后的数据写入声卡。

如果想要在程序中应用GStreamer提供的各种功能,首先必须在主函数中调用gst_init

()来完成相应的初始化工作,以便将用户从命令行输入的参数传递给GStreamer函数库。

一个典型的GStreamer应用程序的初始化如下所示:

#include

intmain(intargc,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

#include

//定义消息处理函数,

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\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,编译运行

gcc-Wall$(pkg-config--cflags--libsgstreamer-0.10)-gtest2.c-otest2

./test2/home/phinecos/test.mp3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值