什么是轻量级跨平台WAV播放库?

我正在寻找一种轻量级的方法,使我的程序(用C语言编写)能够在Windows或Linux上播放audio文件。 我目前正在使用Windows本地调用,这本质上只是一个传递文件名的单个调用。 我想要类似的东西在Linux上工作。

audio文件是Microsoft PCM,单声道,22Khz

有什么build议么?

由于我也在寻找一个问题的答案,我做了一些研究,我没有找到任何简单的(简单的像调用一个函数)的方式来播放音频文件。 但是用一些代码行,甚至可以使用已经提到的portaudio和libsndfile(LGPL)的便携方式。

这里是我编写的一个小测试用例来测试这两个库:

#include <portaudio.h> #include <sndfile.h> static int output_cb(const void * input, void * output, unsigned long frames_per_buffer, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void * data) { SNDFILE * file = data; /* this should not actually be done inside of the stream callback * but in an own working thread * * Note although I haven't tested it for stereo I think you have * to multiply frames_per_buffer with the channel count ie 2 for * stereo */ sf_read_short(file, output, frames_per_buffer); return paContinue; } static void end_cb(void * data) { printf("end!\n"); } #define error_check(err) \ do {\ if (err) { \ fprintf(stderr, "line %d ", __LINE__); \ fprintf(stderr, "error number: %d\n", err); \ fprintf(stderr, "\n\t%s\n\n", Pa_GetErrorText(err)); \ return err; \ } \ } while (0) int main(int argc, char ** argv) { PaStreamParameters out_param; PaStream * stream; PaError err; SNDFILE * file; SF_INFO sfinfo; if (argc < 2) { fprintf(stderr, "Usage %s \n", argv[0]); return 1; } file = sf_open(argv[1], SFM_READ, &sfinfo); printf("%d frames %d samplerate %d channels\n", (int)sfinfo.frames, sfinfo.samplerate, sfinfo.channels); /* init portaudio */ err = Pa_Initialize(); error_check(err); /* we are using the default device */ out_param.device = Pa_GetDefaultOutputDevice(); if (out_param.device == paNoDevice) { fprintf(stderr, "Haven't found an audio device!\n"); return -1; } /* stero or mono */ out_param.channelCount = sfinfo.channels; out_param.sampleFormat = paInt16; out_param.suggestedLatency = Pa_GetDeviceInfo(out_param.device)->defaultLowOutputLatency; out_param.hostApiSpecificStreamInfo = NULL; err = Pa_OpenStream(&stream, NULL, &out_param, sfinfo.samplerate, paFramesPerBufferUnspecified, paClipOff, output_cb, file); error_check(err); err = Pa_SetStreamFinishedCallback(stream, &end_cb); error_check(err); err = Pa_StartStream(stream); error_check(err); printf("Play for 5 seconds.\n"); Pa_Sleep(5000); err = Pa_StopStream(stream); error_check(err); err = Pa_CloseStream(stream); error_check(err); sf_close(file); Pa_Terminate(); return 0; } 

一些笔记的例子。 在流回调中进行数据加载是不好的做法,但是在自己的加载线程中。 如果您需要播放多个音频文件,则会变得更加困难,因为并非所有portaudio后端都支持一个设备的多个流,例如OSS后端不支持,但是ALSA后端支持。 我不知道窗户上的情况如何。 由于所有的输入文件都是相同类型的,所以你可以自己混合使用,这会使代码更复杂一些,但是你也可以支持OSS。 如果你也有不同的采样率或不同的频道数量,这将变得非常困难。

所以,如果你不想同时播放多个文件,这可能是一个解决方案,或者至少是你的开始。

SDL_Mixer虽然不是很轻,但有一个简单的界面来播放WAV文件。 我相信,就像SDL一样,SDL_Mixer也是LGPL。

OpenAL是另一个更适合3D音频的跨平台音频库。

另一个开源音频库,你可能想要检查它是PortAudio

我已经使用OpenAL在空中交通管制系统中播放wav文件作为警报/警告

我发现的优点是

  1. 它是跨平台的
  2. 与C(和其他人,但你的问题是关于C)
  3. 重量轻
  4. 网上有很好的文档
  5. 该许可证是LGPL,因此您可以调用该API,无许可证问题

你可以试试这个: libao

我喜欢FMOD 。 该许可证是免费供个人使用的,对于小型共享软件或商业项目来说非常合理

你也可以试试Audiere 。 最后一个版本的日期是2006年,但是它是开放源代码的,并根据LGPL授权。

我用irrKlang!

“irrKlang是C ++,C#和所有.NET语言的跨平台声音库”

http://www.ambiera.com/irrklang/