gpt4 book ai didi

c++ - RtAudio-播放wav文件中的样本

转载 作者:行者123 更新时间:2023-12-02 23:40:17 27 4
gpt4 key购买 nike

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

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

010 Editor

这就是我将原始样本存储在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编辑器吗?为什么不是rtaudio播放它们。怎么了我是否需要将样本值标准化为-1和1之间?

编辑:
我正在尝试播放的wav文件:
  • 块大小:16
  • 格式:1
  • channel :1
  • SampleRate:48000
  • ByteRate:96000
  • BlockAlign:2个
  • BitPerSample:16
  • 原始样本大小总计:2217044字节
  • 最佳答案

    由于某些原因,当我将输入参数传递给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文件突然播放了。这是一个错误吗?

    关于c++ - RtAudio-播放wav文件中的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641818/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com