ubuntu libasound2 播放wav
#include <iostream>
#include <alsa/asoundlib.h>
void play_wav(const char* filename) {
int err;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
// 打开 PCM 设备
if ((err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
std::cerr << "Error opening PCM device: " << snd_strerror(err) << std::endl;
return;
}
// 分配硬件参数对象
snd_pcm_hw_params_alloca(¶ms);
// 初始化硬件参数
if ((err = snd_pcm_hw_params_any(handle, params)) < 0) {
std::cerr << "Error initializing hardware parameters: " << snd_strerror(err) << std::endl;
return;
}
// 设置采样率和通道数
//unsigned int rate = 44100; // 采样率
unsigned int rate = 16000; // 采样率
int channels = 1; // 通道数
// int channels = 2; // 通道数
// 设置硬件参数
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_S16_LE,
SND_PCM_ACCESS_RW_INTERLEAVED,
channels,
rate,
1, // 使用短延迟
500000)) < 0) { // 最小延迟为500毫秒
std::cerr << "Error setting hardware parameters: " << snd_strerror(err) << std::endl;
return;
}
FILE* fp = fopen(filename, "rb");
if (!fp) {
std::cerr << "Could not open file: " << filename << std::endl;
return;
}
fseek(fp, 352, SEEK_SET);
short buffer[16000 * channels]; // 缓冲区,用于存储音频数据
while (true) {
size_t bytesRead = fread(buffer, sizeof(short), sizeof(buffer)/sizeof(short), fp);
if (bytesRead == 0)
break;
err = snd_pcm_writei(handle, buffer, bytesRead / channels);
if (err < 0)
snd_pcm_prepare(handle);
}
fclose(fp);
snd_pcm_drain(handle);
snd_pcm_close(handle);
}
int main(int argc,char** argv) {
if(argc<2){
fprintf(stderr,"method:%s path\n",argv[0]);
return -1;
}
play_wav(argv[1]);
// play_wav("out.wav"); // 替换为你的WAV文件路径
return 0;
}
wav格式有头部 44字节的头部信息,要偏移352位
安装库文件
sudo apt install libasound2-dev
编译:gcc -o main main.o -lasound
参考:https://avmedia.0voice.com/?id=62407
https://www.cnblogs.com/ynxf/p/6283142.html
浙公网安备 33010602011771号