SDL2.0播放PCM

说明

  1. 需要知道PCM的参数:采样率、采样格式、一帧采样个数、声道数。
    对于ffplay需要知道 采样率、采样格式、声道数三个就行了。

  2. 提取PCM

ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le -ar 48000 -ac 1 output.pcm
  1. 播放PCM
ffplay -f s16le -ar 48000 -ac 1  output.pcm

SDL播放PCM的原理

  SDL播放音频数据时会提供一个buf和len,前者是需要填充PCM数据的区域,len则是需要填充的长度,所以打开设备(SDL_OpenAudio)和准备播放后(SDL_PauseAudio),就需要一直给buf喂数据了。不过这个喂数据的过程是被动的,也就是给SDL提供一个喂PCM数据函数。SDL想要数据了自己调就行了。

实现步骤

  1. 编写喂数据函数,核心是给buf填充len长度的数据。
  2. 初始化SDL
  3. 打开音频设备
  4. 开始播放

示例代码

FILE *pPCMFile = NULL;
void  fill_audio(void *udata, Uint8 *stream, int len) {    
    SDL_memset(stream, 0, len);    
    fread(stream, 1, len, pPCMFile);
}
//SDL初始化 
ret = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER); 
if (ret) {  
    printf("SDL init error\n");  return -1; 
}

SDL_AudioSpec wanted_spec; 
//设置已知音频的参数 采样率、采样格式、帧采样数目等 

wanted_spec.freq = 44100; 
wanted_spec.format = AUDIO_S16SYS; 
wanted_spec.channels = 1; 
wanted_spec.silence = 0; 
wanted_spec.samples = 1024; 
wanted_spec.callback = fill_audio; 
//打开SDL
if (SDL_OpenAudio(&wanted_spec, NULL) < 0) {
  printf("open audio failed\n");  
  return -1; 
}

pPCMFile = fopen(PCM_PATH,"rb"); 

//开始播放
SDL_PauseAudio(0);
SDL_Delay(60000);

代码下载


基于SDL2.0.8的播放PCM的程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值