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(&params);

    // 初始化硬件参数
    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

posted on 2025-12-16 22:13  少杨  阅读(6)  评论(0)    收藏  举报