使用SDL播放PCM音频裸流

来源:互联网 发布:陈都灵 章泽天 知乎 编辑:程序博客网 时间:2024/05/18 00:04
在Win下可以使用DirectSound等方法播放PCM裸流,Linux下可以使用操纵DSP设备的方式。这里介绍一种跨平台的方法——使用SDL库。

SDL播放PCM代码很简单,大致需要如下步骤:
1.创建一个回调函数用于混合音频数据,并放入音频流;
2.设置音频参数,调用SDL_OpenAudio,打开音频设备;
3.调用SDL_PauseAudio(0),进行音频回放;
4.回放结束后,调用SDL_CloseAudio() 关闭音频设备。

在VC++6.0环境下编译SDL相关程序有几个注意点:
1.建立工程时一般选择win控制台空项目,不使用MFC;
2.在工程的设置里添加sdl.lib和sdlmain.lib;
3.设置C/C++中的Use run_time library为multithread.dll;
4.运行时要在.exe的目录下放入sdl.dll等库文件。

以下是我写的示例代码,可以播放8KHZ采样,16bit量化,单声道的PCM编码音频裸流文件。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include "SDL.h"#include "SDL_audio.h"#define VOICE_FRAME_SIZE 480FILE *FpRawData=NULL;short RawPCMData[VOICE_FRAME_SIZE];int StopPlayVoice=0;void RecvVoiceData(void *unused, Uint8 *stream, int len){if(fread(RawPCMData, sizeof(short), 480, FpRawData)==480){SDL_memcpy(stream, RawPCMData, 960);  //480*2}else{StopPlayVoice=1;}}/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */static void quit(int rc){SDL_Quit();exit(rc);}int main(int argc, char *argv[]){SDL_AudioSpec fmt;char name[32];//设置16位 单声道 8kHz的音频fmt.freq = 8000;fmt.format = AUDIO_S16;fmt.channels = 1;fmt.samples = 480;fmt.callback = RecvVoiceData;fmt.userdata = NULL;   //可以直接在内部传值给callback函数//打开音频设备,并开始回放if (SDL_OpenAudio(&fmt,NULL)<0){fprintf(stderr, "无法打开音频:%s\n", SDL_GetError());exit(1);}FpRawData=fopen(argv[1], "rb");//回放音频数据SDL_PauseAudio(0);printf("Using audio driver: %s\n", SDL_AudioDriverName(name, 32));while ((StopPlayVoice!=1)&&(SDL_GetAudioStatus()==SDL_AUDIO_PLAYING)){SDL_Delay(1000);}SDL_CloseAudio();SDL_Quit();return 0;}


原创粉丝点击