使用SDL播放PCM音频裸流

在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 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值