一、简介

作者系统为CentOS6,本文在此基础上对Mp3播放器进行开发,需要使用mp3解码库libmad和gstreamer0.10-plugins-ugly,详细步骤如下。

 

二、操作步骤

1)下载

2)安装

  1. yum install gstreamer-devel
  1. rpm -ivh libmad0-0.15.1b-4.el5.x86_64.rpm libmad-0.15.1b-4.el5.x86_64.rpm
  2. rpm -ivh libid3tag-0.15.1b-11.el6.x86_64.rpm libdvdread3-0.9.7-5.el6.x86_64.rpm
  3. rpm -ivh gstreamer0.10-plugins-ugly-0.10.4-1mdv2007.0.x86_64.rpm

 

三、源码

  1. /**
  1. * http://files.cnblogs.com/files/274914765qq/mp3.zip
  1. */
  1.  
  1. #include <gst/gst.h>
  2. #include <glib.h>
  3.  
  4. //消息处理函数
  5. static gboolean bus_call(GstBus * bus, GstMessage * msg, gpointer data)
  6. {
  7. GMainLoop *loop = (GMainLoop *) data;
  8.  
  9. switch (GST_MESSAGE_TYPE(msg))
  10. {
  11.  
  12. case GST_MESSAGE_EOS:
  13. g_print("End of stream\n");
  14. g_main_loop_quit(loop);
  15. break;
  16. case GST_MESSAGE_ERROR:
  17. {
  18. gchar *debug;
  19. GError *error;
  20. gst_message_parse_error(msg, &error, &debug);
  21. g_free(debug);
  22. g_printerr("ERROR:%s\n", error->message);
  23. g_error_free(error);
  24. g_main_loop_quit(loop);
  25. break;
  26. }
  27. default:
  28. break;
  29. }
  30.  
  31. return TRUE;
  32. }
  33.  
  34. int main(int argc, char *argv[])
  35. {
  36. GMainLoop *loop;
  37. GstElement *pipeline, *source, *decoder, *sink; //定义组件
  38. GstBus *bus;
  39.  
  40. gst_init(&argc, &argv);
  41.  
  42. loop = g_main_loop_new(NULL, FALSE); //创建主循环,在执行 g_main_loop_run后正式开始循环
  43. if (argc != 2)
  44. {
  45. g_printerr("Usage:%s \n", argv[0]);
  46. return -1;
  47. }
  48.  
  49. //创建管道和组件
  50. pipeline = gst_pipeline_new("audio-player");
  51. source = gst_element_factory_make("filesrc", "file-source");
  52. decoder = gst_element_factory_make("mad", "mad-decoder");
  53. sink = gst_element_factory_make("autoaudiosink", "audio-output");
  54. if (!pipeline || !source || !decoder || !sink)
  55. {
  56. g_printerr("One element could not be created.Exiting.\n");
  57. return -1;
  58. }
  59.  
  60. //设置source的location参数,即文件地址
  61. g_object_set(G_OBJECT(source), "location", argv[1], NULL);
  62.  
  63. //得到管道的消息总线
  64. bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
  65.  
  66. //添加消息监视器
  67. gst_bus_add_watch(bus, bus_call, loop);
  68. gst_object_unref(bus);
  69.  
  70. //把组件添加到管道中.管道是一个特殊的组件,可以更好的让数据流动
  71. gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL);
  72.  
  73. //依次连接组件
  74. gst_element_link_many(source, decoder, sink, NULL);
  75.  
  76. //开始播放
  77. gst_element_set_state(pipeline, GST_STATE_PLAYING);
  78.  
  79. g_print("Running\n");
  80.  
  81. //开始循环
  82. g_main_loop_run(loop);
  83.  
  84. g_print("Returned,stopping playback\n");
  85. gst_element_set_state(pipeline, GST_STATE_NULL);
  86. gst_object_unref(GST_OBJECT(pipeline));
  87.  
  88. return 0;
  89. }

编译

  1. gcc -Wall -g -o mp3 mp3.c `pkg-config --cflags --libs gstreamer-0.10`

运行

  1. ./mp3 xxx.mp3

 

基于GStreamer编写Mp3播放器的更多相关文章

  1. 基于Stm32的MP3播放器设计与实现

    原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...

  2. 【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

    通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...

  3. 你用java的swing可以做出这么炫的mp3播放器吗?

    这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...

  4. 基于ffmpeg的C++播放器1

    基于ffmpeg的C++播放器 (1) 2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最 ...

  5. MP3播放器团队项目

    一.设计思路 程序要求能播放MP3文件,因此需调用库中的播放方法:右键工具箱选择项,添加com组件,选择window media player后工具箱就会多一个控件,然后拖到窗体中就OK了.另在窗体中 ...

  6. C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.

    使用C#编写媒体播放器时,需要用到Microsoft的Directx提供的DirectShow组件.用该组件前需要先注册程序集QuartzTypeLib.dll. 1.用QuartzTypeLib.d ...

  7. 从零开始学习PYTHON3讲义(十四)写一个mp3播放器

    <从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...

  8. 基于jQuery虾米音乐播放器样式代码

    分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div c ...

  9. 你也可以用java的swing可以做出这么炫的mp3播放器_源码下载

    I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this M ...

随机推荐

  1. android 关于Toast重复显示解决方法

    解决思路:   不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键后立即使Toast不再显示,重 ...

  2. "Cannot declare member function ...to have static linkage"错误

    英文解释: if you declare a method to be static in your .cc file. The reason is that static means somethi ...

  3. Xcode9 修改工程名(含cocopods)

    由于需要现在要更改包名,但是在网上找了N多资料都比较老,16年的资料却是残缺不全,尤其 ios10 出了 .entitlement  的机制 ,很多琐碎的小细节 很容易忘记.所以我自己总结了一篇, 环 ...

  4. 转载:maven依赖范围

    其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath(注意是与classpath)的关系. 主要的是三种依赖关系如下:1.compile: 默认编译依赖范围.对于编译,测试,运行 ...

  5. Redis底层探秘(一):简单动态字符串(SDS)

    redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redi ...

  6. swing之JDialog

    package canying; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java ...

  7. python实现进程的并发

    __author__ = 'luozt' import telnetlib import multiprocessing import random def telnet(ip,hostname): ...

  8. AMD 规范

    AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件. AMD 定义了一套 JavaScript 模块依赖异步加载标准 ...

  9. (1)java8初体验

    很多博客都拿Comparator,我也贴一下吧. java8以前的匿名内部类用来排序. //匿名内部类 @Test public void java8Test() { Person p1 = new ...

  10. HTTP-Runoob:HTTP请求方法

    ylbtech-HTTP-Runoob:HTTP请求方法 1.返回顶部 1. HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, PO ...