这个函数很关键,这个函数将获取你设备的Audio并将其打开,无论你在当前的软件中的哪一个进程,都可以访问到这个设备,并对设备进行操作(列如:SDL_PauseAudio,SDL_CloseAudio)。
2.SDL_PauseAudio
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当中,其中的使用方式大家多试一试吧。
来自 <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>