使用SDL播放PCM音频裸流
2013-04-14 23:19
453 查看
在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编码音频裸流文件。
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 480 FILE *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; }
相关文章推荐
- 使用AudioTrack播放PCM音频数据(android)
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
- 最简单的视音频播放示例9:SDL2播放PCM
- 最简单的视音频播放示例9:SDL2播放PCM
- FFMPEG学习----使用SDL播放PCM数据
- 最简单的视音频播放示例9:SDL2播放PCM
- Android开发:使用AudioTrack播放PCM音频数据【附源码】
- 使用C语言实现pcm格式音频文件播放速度的改变
- 最简单的视音频播放示例9:SDL2播放PCM
- 使用AudioTrack播放PCM音频数据
- MFC中使用SDL播放音频没有声音的解决方法
- Qt播放PCM音频(裸流)文件的两种方法
- 使用WindowsAPI播放PCM音频
- 使用AudioTrack播放PCM音频数据(android)
- MFC中使用SDL播放音频没有声音的解决方法
- 使用AudioTrack播放PCM音频数据(android)
- 使用WindowsAPI实现播放PCM音频的方法
- MFC中使用SDL播放音频没有声音的解决方法
- ffmpeg+SDL的使用之使用SDL播放音频流
- [AudioTrack]使用AudioTrack播放PCM音频数据