当前位置: 首页 > 知识库问答 >
问题:

rAudio-播放wav文件中的示例

岳锦
2023-03-14

我目前正在尝试学习音频编程。我的目标是打开一个wav文件,提取所有内容并使用RtAudio播放示例。

我制作了一个WaveLoader类,让我提取样本和元数据。我用这本指南来做这件事,我用010编辑器检查了一切都是正确的。这是010编辑器的快照,显示了结构和数据。

这就是我在WaveLoader类中存储原始样本的方式:

        data = new short[wave_data.payloadSize]; // - Allocates memory size of chunk size

        if (!fread(data, 1, wave_data.payloadSize, sound_file))
        {
            throw ("Could not read wav data");
        }

如果我打印出我得到的每个样本:1, -3, 4, -5...

问题是,我不确定我怎么能打他们。这就是我所做的:

/*
 * Using PortAudio to play samples
 */
bool Player::Play() 
{
    ShowDevices();
    rt.showWarnings(true);

    RtAudio::StreamParameters oParameters; //, iParameters;
    oParameters.deviceId = rt.getDefaultOutputDevice();
    oParameters.firstChannel = 0;
    oParameters.nChannels = mAudio.channels;

    //iParameters.deviceId = rt.getDefaultInputDevice();
    //iParameters.nChannels = 2;

    unsigned int sampleRate = mAudio.sampleRate;

    // Use a buffer of 512, we need to feed callback with 512 bytes everytime!
    unsigned int nBufferFrames = 512;

    RtAudio::StreamOptions options;
    options.flags = RTAUDIO_SCHEDULE_REALTIME;
    options.flags = RTAUDIO_NONINTERLEAVED;

    //&parameters, NULL, RTAUDIO_FLOAT64,sampleRate, &bufferFrames, &mCallback, (void *)&rawData

    try {
        rt.openStream(&oParameters, NULL, RTAUDIO_SINT16, sampleRate, &nBufferFrames, &mCallback, (void*) &mAudio);
        rt.startStream();
    }
    catch (RtAudioError& e) {
        std::cout << e.getMessage() << std::endl;
        return false;
    }
    return true;
}

/*
* RtAudio Callback
*
*/
int mCallback(void * outputBuffer, void * inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void * userData)
{
    unsigned int i = 0;
    short *out = static_cast<short*>(outputBuffer);
    auto *data = static_cast<Player::AUDIO_DATA*>(userData);

    // if i is more than our data size, we are done!
    if (i > data->dataSize) return 1;

    // First time callback is called data->ptr is 0, this means that the offset is 0
    // Second time data->ptr is 1, this means offset = nBufferFrames (512) * 1 = 512
    unsigned int offset = nBufferFrames * data->ptr++;

    printf("Offset: %i\n", offset);
    // First time callback is called offset is 0, we are starting from 0 and looping nBufferFrames (512) times, this gives us 512 bytes
    // Second time, the offset is 1, we are starting from 512 bytes and looping to 512 + 512 = 1024 
    for (i = offset; i < offset + nBufferFrames; ++i)
    {
        short sample = data->rawData[i]; // Get raw sample from our struct
        *out++ = sample;                // Pass to output buffer for playback

        printf("Current sample value: %i\n", sample);       // this is showing 1, -3, 4, -5 check 010 editor
    }

    printf("Current time: %f\n", streamTime);
    return 0;
}

在回调函数中,当我打印出示例值时,我得到的结果与010编辑器完全一样?为什么不是rtdio播放它们。这里有什么问题?我需要将示例值标准化为-1和1之间吗?

编辑:我正在尝试播放的wav文件:

  • 块大小:16

共有1个答案

许寒
2023-03-14

出于某种原因,当我将输入参数传递给openStream()时,它会工作

    RtAudio::StreamParameters oParameters, iParameters;
    oParameters.deviceId = rt.getDefaultOutputDevice();
    oParameters.firstChannel = 0;
    //oParameters.nChannels = mAudio.channels;
    oParameters.nChannels = mAudio.channels;

    iParameters.deviceId = rt.getDefaultInputDevice();
    iParameters.nChannels = 1;

    unsigned int sampleRate = mAudio.sampleRate;

    // Use a buffer of 512, we need to feed callback with 512 bytes everytime!
    unsigned int nBufferFrames = 512;

    RtAudio::StreamOptions options;
    options.flags = RTAUDIO_SCHEDULE_REALTIME;
    options.flags = RTAUDIO_NONINTERLEAVED;

    //&parameters, NULL, RTAUDIO_FLOAT64,sampleRate, &bufferFrames, &mCallback, (void *)&rawData

    try {
        rt.openStream(&oParameters, &iParameters, RTAUDIO_SINT16, sampleRate, &nBufferFrames, &mCallback, (void*) &mAudio);
        rt.startStream();
    }
    catch (RtAudioError& e) {
        std::cout << e.getMessage() << std::endl;
        return false;
    }
    return true;

当我试图播放我的麦克风时,它是如此随机。我留下了输入参数,我的wav文件突然播放。这是一个错误吗?

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

  • 基于StackExchange的代码,我编写了打开wav文件的代码。wav文件本身是一个有效的文件,因为它可以与我的Python程序正常配合使用。但是javascript函数不起作用。声音文件与我的html文件位于同一文件夹中。 任何帮助都将不胜感激。

  • 问题内容: 我尝试pygame播放wav文件,如下所示: 但是它改变了声音,我不知道为什么!我阅读了此链接解决方案,但无法解决播放wave文件的问题! 对于此解决方案,我不知道应该导入什么? 对于这个解决方案/ dev / dsp在新版本的linux中不存在: 而当我尝试pyglet它给我这个错误: 问题答案: 您可以使用PyAudio。我的Linux上的一个示例可以正常工作:

  • 问题内容: 我试图互相播放一些WAV文件。我尝试了这种方法: 但这同时发挥了所有作用。所以我需要一个看起来像这样的函数: 向量包含文件,例如:, 我已经寻找了四个多小时,但似乎找不到有效的解决方案:( 我还尝试将WAV文件连接到一个AudioInputStream。它不会产生任何编译器错误,但是声音完全混乱了。码: 编辑 即使我尝试将前两个文件放在一起,也会失败: 问题答案: 这段代码有点底层,但

  • 我正在使用Jplayer插件来播放音频文件。它可以播放mp3文件,但不支持wav音频文件。我搜索了原因,知道wav音频文件应该是特定的格式,可以用flash或HTML5播放。但是我的wav文件的比特率是64kbps。如何播放这种格式的wav音频文件,例如将wav转换为合适的格式并播放该文件。是否有任何插件可以播放任何格式的wav文件,或者有插件可以将wav转换为合适的格式,以便能够播放文件或任何其

  • 问题内容: } 我不知道如何在Java中从计算机(而不是从URL)播放wav文件。我确定将其放置在SRC的正确区域中(以防万一,我也将其放置在其他所有空间中……)。 第一次尝试是从http://www.cs.cmu.edu/~illah/CLASSDOCS/javasound.pdf 获得的。 第二次尝试是将我录制的.wav文件放到mediafire上。但是,那没有用。“线程“主”中的异常java