当前位置: 首页 > 面试题库 >

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

裴成文
2023-03-14
问题内容

我正在寻找一种轻巧的方法来使我的程序(用C语言编写)能够在Windows或Linux上播放音频文件。我目前正在使用Windows本机调用,这实际上只是传递文件名的单个调用。我想要在Linux上也可以使用的类似软​​件。

音频文件是Microsoft PCM,单通道,22Khz

有什么建议么?


问题答案:

由于我也在寻找问题的答案,因此我做了一些研究,但没有找到播放音频文件的任何简单(类似于调用一个函数的简单方法)。但是使用一些代码行,甚至可以使用已经提到的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 i.e. 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后端则支持。我不知道Windows上的情况如何。由于所有输入文件都是相同的类型,因此您可以自己将它们混合使用,这会使代码更加复杂,但同时您还支持OSS。如果您还有不同的采样率或通道数,则将变得非常困难。

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



 类似资料:
  • 本文向大家介绍PHP语言的一大优势是跨平台,什么是跨平台?相关面试题,主要包含被问及PHP语言的一大优势是跨平台,什么是跨平台?时的应答技巧和注意事项,需要的朋友参考一下 PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台

  • 我通过谷歌阅读about.wav文件格式,我所能想到的是帧是由样本(一些定义的位深度)组成的,而wav立体声文件有多个叫做通道的东西......混乱的是一个通道是否由帧组成?当我播放一些音频文件时,所有通道都一起播放吗?如果一个通道由帧组成,所有通道的长度是否相等(位明智)?如果有人可以,请回答,当以波形播放wav文件时,我必须分别显示每个通道

  • 多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。

  • 问题内容: 我想开发一个跨平台的应用程序。 Java是跨平台的吗?我的意思是,我可以在Windows中开发Java应用程序并在Mac OS X和Linux中使用它吗? 如果是,怎么办? 我发现用Java编写的应用程序有两个安装文件,一个用于Windows,另一个用于Mac。 这使我感到困惑。 任何插图或建议将不胜感激。 问题答案: Java是跨平台的吗? 从某种意义上说,Java是跨平台的, 即已

  • 问题内容: 我正在用Java 做辫子。如果倒带时间,声音会向后播放。如何向后播放WAV文件?也许有像这样的流?在Braid网站上,您可以看到我的意思。 更新: _ 解决! 看到我自己的帖子。_ 问题答案: !!!!!! 我自己解决了这个问题(14岁!!), 我写了这个课: 然后:

  • 问题内容: 我正在编写一个dhtml应用程序,该应用程序创建系统的交互式仿真。用于模拟的数据是从另一个工具生成的,并且已经有大量的旧数据。 模拟中的某些步骤要求我们播放音频的“浊音”片段。我一直找不到在多个浏览器上完成此操作的简便方法。 Soundmanager2几乎可以满足我的需要,但它只能播放mp3文件,并且旧数据也可能包含一些.wav文件。 有没有其他图书馆可能会帮助您? 问题答案: 您将必