SDL 与 FFMPEG 音乐播放器开发(1)

来源:互联网 发布:淘宝app免费下载 编辑:程序博客网 时间:2024/05/16 00:38

首先我要感慨一下国内学习代码的局限,局限太大了,火起来了的库或软件教程,一搜一大把,根本不懂如何挑选才能选到适合自己的。没火起来的?来来去去就是那几篇文章,我决定多写一篇,希望下一个学习SDL的人可以从我的文章中获得帮助,就算不能,看到百度搜出来的文章多一些,也总算平添一些信心吧。


首先,跟学习任何东西一样,官方的资料永远是最应该看的。传送门:sdl官方网站 http://www.libsdl.org/
好在org后缀的外网还能够上,SDL是开源的,包括源代码在内,都可以从官网上下载到。SDL并不能算作是音频库,更不是解码库,Simple DirectMedia Layer 从名字上来看就可以归结为一个媒体库(囊括了输入、输出、Video、Audio、Opengl、DX相关的多个方法)。

SDL的动态链接库体积不大,如果要求不高,大可直接使用,如果要求高的,也可以从官网下载源代码,剔除自己不需要的部分,并重新编译(我就进行了重新编译,虽然SDL开发团队代码写得很规范,但我还是删得非常的辛苦)。这一篇我打算不说这些,因为一来我自己也不太熟SDL源代码,二来这不是一个技术活,是一个累活,只要有毅力好吧。

废话说了很多,我开始说关于音乐播放器的开发,首先还是感谢我百度来来去去只搜索到的那几篇文章,如果只是想简单的播放PCM文件,我推荐大家看http://blog.csdn.net/leixiaohua1020/article/details/40544521 中国传媒大学 雷霄骅 老师写的博客,我也是研究他写的代码,一步步进行开发的。

几个地方我想要提一下:

1.SDL_OpenAudio

这个函数很关键,这个函数将获取你设备的Audio并将其打开,无论你在当前的软件中的哪一个进程,都可以访问到这个设备,并对设备进行操作(列如:SDL_PauseAudio,SDL_CloseAudio)。
值得注意的是,设备Audio只能打开一次,我曾经尝试多线程打开多个Audio设备,最后都失败了,返回Error说Audio已经打开,那一瞬间我懵了,既然不能用多线程,如何播放多个音频呢?别急,奥秘在SDL_mixAudio里面,稍后我回提。

2.SDL_PauseAudio

每次调用这个函数,设备都将回调你在打开Audio时预设的回调函数(也就是SDL_AudioSpec.callback)。这样的回调允许你一次次的将PCM buffer填入Audio预设的steam中,使得设备顺利的播放音频文件。而如何将buffer填入steam中呢?则需要使用SDL_mixAudio。

3.PCM
什么是PCM?可以自习搜索PCM看详细的介绍。简单的来说,音频文件解压后的文件格式就是PCM,而SDL仅提供播放PCM和WAV(都是未压缩的文件格式)的播放方法。简单来说,要想播放MP3等通用格式,必须先解码成音频格式文件,再进行播放,当然也可以一边解压一边播放,只是需要使用多线程罢了。使用SDL_Thread来创建并管理线程,蛮方便的。(线程我以后再总结)

4.SDL_mixAudio
我最想说的就是这个,因为我苦苦寻求了半天的“同时播放多个音频文件”,奥秘就在SDL_mixAudio。这个函数其实很傻很简单,无非是把两个buffer内容叠加起来。于是你只需要把希望播放的音频buffer叠加在一起,就可以成功的播放多个音频文件。官方给的例子是这样的
void audio_callback(void *udata, Uint8 *stream, int len){    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);}
这就是把stream与audio_pos两个buffer叠加到stream当中,其中的使用方式大家多试一试吧。



还有很多没说的地方,我决定之后几天慢慢说,毕竟一次说完的东西估计大家都看不下去
以及大家可以联系我125650971@qq.com


3 0
原创粉丝点击