SDL音频 播放库 函数介绍

Dir:
参考了各种文章,先存储,随需随查。目前包含以下内容:
SDL_OpenAudio
SDL_PauseAudio
PCM
SDL_mixAudio
SDL_CreateThread


1.SDL_OpenAudio

这个函数很关键,这个函数将获取你设备的Audio并将其打开,无论你在当前的软件中的哪一个进程,都可以访问到这个设备,并对设备进行操作(列如:SDL_PauseAudioSDL_CloseAudio)

值得注意的是,设备Audio只能打开一次,我曾经尝试多线程打开多个Audio设备,最后都失败了,返回ErrorAudio已经打开,那一瞬间我懵了,既然不能用多线程,如何播放多个音频呢?别急,奥秘在SDL_mixAudio里面,稍后我回提。

2.SDL_PauseAudio

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

3.PCM

什么是PCM?可以自习搜索PCM看详细的介绍。简单的来说,音频文件解压后的文件格式就是PCM,而SDL仅提供播放PCMWAV(都是未压缩的文件格式)的播放方法。简单来说,要想播放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);
}

这就是把streamaudio_pos两个buffer叠加到stream当中,其中的使用方式大家多试一试吧。

来自 <http://blog.csdn.net/tropicofcancer9/article/details/53996980>

 

当我们开始播放音频时,SDL将持续的调用回调函数,且用一些字节来填充声音buffer

freq: 采样率

format:这告诉SDL我们将使用什么格式。S16SYS中的第一个S表示“signed"(有符号),16表示每个采样有16位,SYS表示大小端顺序依赖系统。这就是avcodec_decode_audio2告诉我们进来的音频的格式。

channels: 音频通道的数量

silence:这是表示是否静音。因为音频是signed,0就是默认值。

samples:这个表示当SDL需要更多音频时,我们要SDL分配的buffer的大小。一个比较好的值是512和8192之间的值。ffplay用1024.

callback这里我们传递真正的回调函数。下面再详细讨论。

userdata:SDL给我们的回调函数一个纸箱userdata的void指针,这个数据时我们的回调函数需要的。我们要让它知道我们的codeccontext;

 

来自 <http://blog.csdn.net/gengxt2003/article/details/51494653>

 

SDL_OpenAudio函数:

用此函数来打开音响设备。

int SDL_OpenAudio(SDL_AudioSpec* desired,
                 
SDL_AudioSpec*obtained)

例子:

[cpp]view plaincopyprint?

1.  SDL_AudioSpec want, have;  

2.    

3.  SDL_memset(&want, 0, sizeof(want)); /* or SDL_zero(want) */  

4.  want.freq = 48000;  

5.  want.format = AUDIO_F32;  

6.  want.channels = 2;  

7.  want.samples = 4096;  

8.  want.callback = MyAudioCallback; /* you wrote this function elsewhere. */  

9.    

1        ifif(SDL_OpenAudio(&want, &have) < 0) {  

11.    SDL_Log("Failed to open audio: %s", SDL_GetError());  

12.}else{  

13.    if (have.format != want.format) {  

14.        SDL_Log("We didn't get Float32 audio format.");  

15.    }  

16.    SDL_PauseAudio(0); /* start audio playing. */  

17.    SDL_Delay(5000); /* let the audio callback play some sound for 5 seconds. */  

18.    SDL_CloseAudio();  

19.}  

 

来自 <http://blog.csdn.net/caimouse/article/details/53508316>

 

 

SDL_MixAudio函数

SDL_MixAudio函数:

对音乐数据进行混音。

void SDL_MixAudio(Uint8*       dst,
                  const Uint8*src,
                 
Uint32       len,
                  int          volume)

例子:

[cpp]view plaincopyprint?

1.  SDL_MixAudio(stream, gSndPlayer.pos[i], len, SDL_MIX_MAXVOLUME);  

 

[cpp]view plaincopyprint?

1. vvoid fill_audio(void *udata, Uint8 *stream, int len)  

2.  {  

3.  ifif (audio_len == 0)  

4.  {  

5.     printf("audio_len=0\n");  

6.     return;  

7.  }  

8.  len = (len>audio_len?audio_len:len);  

9.  SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);//对音频数据进行混音  

10.audio_pos+=len;//更新播放位置  

11.audio_len-=len;//更新数据长度  

12.}  

 

来自 <http://blog.csdn.net/caimouse/article/details/53502024>

 

 

SDL_CreateThread

1.    /**

2.    Create a thread.

3.    */

4.    externDECLSPEC SDL_Thread *SDLCALL

5.    SDL_CreateThread(SDL_ThreadFunctionfn, const char *name, void *data,

6.    pfnSDL_CurrentBeginThreadpfnBeginThread,

7.    pfnSDL_CurrentEndThreadpfnEndThread);


来自 <https://www.cnblogs.com/findman/p/6050589.html>

ID

参数

说明

1

SDL_ThreadFunction fn

线程所调用的函数

2

const char *name 

线程的名称

3

void *data 

线程所传入的数据

4

pfnSDL_CurrentBeginThread pfnBeginThread 

开始线程

5

pfnSDL_CurrentEndThread pfnEndThread 

结束线程

 

来自 <https://www.cnblogs.com/findman/p/6050589.html>

 

 

猜你喜欢

转载自blog.csdn.net/qq_30042269/article/details/80537955