sdl播放pcm文件
来源:互联网 发布:离散数学教材推荐 知乎 编辑:程序博客网 时间:2024/06/02 05:30
参考:最简单的视音频播放示例9:SDL2播放PCM
用到的数据结构和函数
1. SDL_Init
int SDLCALL SDL_Init(Uint32 flags)
初始化SDL,播放音频时flags为SDL_INIT_AUDIO | SDL_INIT_TIMER;
2. SDL_AudioSpec
其中回调函数的格式如下所示:
void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, int len);
其中userdata为SDL_OpenAudio参数desired中的值;stream为填充缓冲器的地址;len为缓冲区长度;
3. SDL_OpenAudio
int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained)
desired:期望的音频参数;obtained:实际音频设备的参数;
4. SDL_PauseAudio
void SDL_PauseAudio(int pause_on);
pause_on为0表示播放,非0表示暂停;
5. SDL_Delay
void SDL_Delay(Uint32 ms);
等待ms毫秒。
6. SDL_MixAudio
void SDL_MixAudio(Uint8* dst, const Uint8* src, Uint32 len, int volume);
音频混音函数,如果需要同时播放多段音频,只需回调函数中依次调用SDL_MixAudio即可。
步骤
- 初始化sdl;
- 填充SDL_AudioSpec结构体, 并调用SDL_OpenAudio函数;
- 开始播放,调用SDL_PauseAudio;
- 等待播放完成;
测试demo
#include <iostream>#include "SDL/SDL.h"typedef struct AudioInfoContext{ FILE *fd; char buffer[4096]; bool isFileReadEnd;}AudioInfoContext;void readAudioData(void *userdata, Uint8 * stream, int len){ AudioInfoContext *pAudioCtx = (AudioInfoContext*)userdata; memset(stream, 0, len); if(len > 4096) { len = 4096; } int ret = fread(pAudioCtx->buffer, 1, len, pAudioCtx->fd); if(ret < len){ pAudioCtx->isFileReadEnd = true; } len = len > ret ? ret:len; SDL_MixAudio(stream,(uint8_t*)pAudioCtx->buffer,len,SDL_MIX_MAXVOLUME);}#undef mainint main() { if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_TIMER)) { std::cout << "Could not initialize SDL , msg:" << SDL_GetError() << std::endl; return -1; } std::string pcmFile = "/Users/skl/Downloads/pcm16k.pcm"; AudioInfoContext audioCtx; audioCtx.fd = fopen(pcmFile.c_str(), "rb"); if(!audioCtx.fd) { std::cout << "open pcm file fail" << std::endl; return -1; } audioCtx.isFileReadEnd = false; SDL_AudioSpec audioSpec; audioSpec.freq = 16000; audioSpec.format = AUDIO_S16SYS; audioSpec.channels = 1; audioSpec.silence = 0; audioSpec.samples = 1024; audioSpec.callback = readAudioData; audioSpec.userdata = (void*)&audioCtx; if(SDL_OpenAudio(&audioSpec, NULL) < 0) { std::cout << "can't open audio, msg:" << SDL_GetError() << std::endl; return -1; } SDL_PauseAudio(0); while(1){ if(!audioCtx.isFileReadEnd) SDL_Delay(1); else break; } fclose(audioCtx.fd); std::cout << "play end" << std::endl; return 0;}
0 0
- sdl播放pcm文件
- 使用SDL播放PCM音频裸流
- FFMPEG学习----使用SDL播放PCM数据
- PCM文件播放器
- PCM文件播放器
- waveout播放pcm文件总结
- 使用directsound播放pcm流文件.txt
- 音频队列Audioqueue播放pcm文件
- 播放PCM
- SDL实现简单h264文件的播放
- 使用AudioTrack和AudioRecord录制和播放PCM wave文件
- 非阻塞式播放pcm和mp3文件类
- 使用AudioTrack和AudioRecord录制和播放PCM wave文件
- 使用AudioTrack和AudioRecord录制和播放PCM wave文件
- 一个简单的使用SDL播放YUV文件的示例
- 一个简单的使用SDL播放YUV文件的示例
- WaveOutXX 播放PCM流
- ios播放PCM数据
- poj 2420 A Star not a Tree? (模拟退火)
- 从PSD到HTML
- 【腾讯校招】随机音乐播放
- 太用力的人跑不远
- 一些话
- sdl播放pcm文件
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 希尔排序
- Scout YYF I 概率dp + 矩阵快速幂
- 416. Partition Equal Subset Sum子数组和问题
- redhat 7的 yum 安装,使用的centos镜像
- 高斯模糊算法的全面优化过程分享。
- 写给VC++ Windows开发的初学者 一片不错的博文
- java拷贝机制详解