基于SDL的mp3播放器
基于SDL的mp3播放器
SDL虽然本身提供播放音乐都功能但是不好用,SDL_mixer为SDL提供了快捷的音乐播放功能。但是SDL_mixer本身只能播放wav格式的音乐,并不能播放mp3,为了能完美支持mp3,需要为SDL_mixer提供mp3的解码库,
Mp3的解码库有很多中,可以用smpeg,libmad,用播放音乐的效果上来说本文注重讲解libmad。
首先为SDL_mixer安装libmad解码库,下载好libmad后直接./configure make make install,然后配置SDL_mixer的Makefile文件,要去掉默认的smpeg,换成libmad,可以用如下命令设置
./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no
然后 make make install .
SDL_mixer的libmad解码库就安装成功了。
下面是mp3播放器的源代码
/*
这是一个mp3播放器的源码,是基于SDL图形库,SDL_gfx,SDL_mixer以及libmad解码库,
linux 编译方法 gcc player.c -o player -I/SDL头文件所在的目录 -L/SDL的图形库所在的目录
-lSDL -lSDL_gfx -lSDL_mixer
write by douyuan888 2013-7-5
*/
#include "SDL/SDL.h"
#include "SDL/SDL_mixer.h"
#include "math.h"
#include "string.h"
#include "SDL/SDL_gfxPrimitives.h"
void Init()//初始化音视频
{
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)== -1)
{
printf("SDL_INIT fault !\n");
exit(-1);
}
}
SDL_Surface *Creat_Screen(int w,int h)//创建一个屏幕
{
return SDL_SetVideoMode(w ,h , 0 ,SDL_SWSURFACE );
}
void Free_Image(SDL_Surface * image)//释放SDL_Surface所申请的空间
{
SDL_FreeSurface(image);
}
void Open_Audio()//打开音频驱动 设置比特率 和 采样率,
{
int audio_rate = 22050;
Uint16 audio_format = MIX_DEFAULT_FORMAT;
int audio_channel = 2;
int audio_buffer = 1024;
if (Mix_OpenAudio(audio_rate, audio_format, audio_channel, audio_buffer) != 0)
{
fprintf(stderr, "Unable to initialize audio: %s\n", Mix_GetError());
exit(1);
}
}
void Close_Audio()//关闭音频驱动
{
Mix_CloseAudio();
}
Mix_Music * Load_Musci(char *filename)//加载音乐 filename是音乐的绝对路径
//至于支持什么格式与解码库有关系。libmad 几乎支持所有的常见格式
{
Mix_Music *music = NULL;
music = Mix_LoadMUS(filename);
if (music == NULL)
{
fprintf(stderr, "Unable to load mp3 file: %s\n", Mix_GetError());
}
return music ;
}
int Start_Play(Mix_Music * music)//播放音乐
{
if (Mix_PlayMusic(music, 0) == -1)
{
fprintf(stderr, "Unable to play mp3 file: %s\n", Mix_GetError());
return -1;
}
else
return 0 ;
}
void Music_Pause()//暂停音乐
{
Mix_PauseMusic();
}
void Music_Resume()//取消暂停 状态
{
Mix_ResumeMusic();
}
void Halt_Music()//停止
{
Mix_HaltMusic();
}
int Event()//事件循环
{
int flag = 1 ;
SDL_Event event ;
while (flag == 1 )
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
flag = 0;
}
}
}
int main(int argc ,char **argv)
{
Init();
SDL_Surface *screen = NULL ;
Mix_Music * music = NULL ;
screen = Creat_Screen(320,240);//创建一个 320*240的屏幕
boxColor(screen,0, 0, 320, 240, 0xff00ffff);//填充颜色
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
Open_Audio();
music = Load_Musci("./test.mp3") ;//在之处可以加载许多中格式的音乐
Start_Play(music);
Event();
Close_Audio();
Free_Image(screen) ;
}
基于SDL的mp3播放器相关推荐
- 基于QT实现Mp3播放器(代码部分)
前言 最近有一个课程实验,利用window上的API接口实现MP3播放器. 突发奇想,在linux下用相关接口做一个MP3播放器.最先的打算是完全使用纯C写的,但后来感觉编写调试实在费劲.于是 ...
- 基于QT实现Mp3播放器(理论论述部分)
前言 最近有一个课程实验,利用window上的API接口实现MP3播放器. 突发奇想,在linux下用相关接口做一个MP3播放器.最先的打算是完全使用纯C写的,但后来感觉编写调试实在费劲.于是 ...
- 基于Stm32的MP3播放器设计与实现
原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...
- C语言头文件下载迅雷,[C语言] 基于GStreamer编写Mp3播放器
#include #include //消息处理函数 static gboolean bus_call(GstBus * bus, GstMessage *msg, gpointer data) { ...
- 基于QT的mp3播放器设计
1.首先在ui中画出两个新建项,分别命名为OpenAction和DeleteAction,并拖到头部. 2. 选择转到槽. 3.选择table weight 4.选择转到槽里的double 5.mai ...
- 远程WEB控制MP3播放器设计(基于mini2440)
网上有很多 基于mini2440的MP3播放器设计的资料,多是按键控制,这里博主做了些轻微改动,利用远程WEB来控制MP3播放,具体怎么实现,下面会给出,大家先看看效果: WEB界面: 后台运行: 因 ...
- 基于嵌入式ARM的mp3播放器的设计
一. 设计题目:基于ARM的mp3播放器的设计 二. 课程设计教学目的: 1.了解并掌握系统电路的一般设计方法,具备初步的独立设计能力: 2.掌握Unix/Linux系统原理: ...
- SigmaTel使出专利杀手锏,中国MP3播放器产业链均受影响
作者:李明骏 在不久的将来,任何一家生产MP3播放器的制造商如果要在市场上销售,都可能会因为使用了SigmaTel公司拥有的专利而需要向该公司支付专利使用费.这是笔者在不久前召开的中国集成电路研讨会暨 ...
- 最简单的基于FFMPEG+SDL的音频播放器
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
最新文章
- MIT Graph实践概述
- maven 创建module失败 ,异常Unable to read parent POM
- 【Nvivo教程】使用Nvivo构建计算的本体
- 中国功率半导体产业销售规模与投资策略研究报告2022版
- JS面向对象,创建,继承
- LeetCode Algorithm 451. 根据字符出现频率排序
- Windows Embedded CE 6.0开发初体验(五)构建CE平台
- MVC简单介绍(转)
- PG: Setting up streaming log replication (Hot Standby )
- python 内置浏览器robobrowser_Python RoboBrowser – 如何从此页面获取内容
- leetcode - Anagrams
- 优秀的CSS框架---bootstrap
- DPDK Release 21.05
- 批量修改图幅lisp_【CAD应用技巧】批量自动修改图形文件的程序
- Android应用上架国内各大应用市场对应用Logo、应用截图要求整理
- vue 多个页面调同一个接口,传不同的参数,使用 Vuex 来实现传不同参数调统一接口
- 初窥门径——字典的更好使用方式
- PIP更新问题丨You should consider upgrading via the 'python -m pip install —upgrade pip' command.
- 定理在数学中的简写形式_高中数学联赛常用定理
- 科大讯飞Windows麦克风监听语音唤醒+语音识别demo