gpt4 book ai didi

c++ 和 portaudio,可怕的扭曲输出

转载 作者:行者123 更新时间:2023-11-28 00:31:04 24 4
gpt4 key购买 nike

我写了一小段代码,打算读取一个 wav 文件并通过 portaudio 播放它。

我限制自己使用一些特定的 wav 文件:线性 pcm(无压缩),不超过 2 个 channel 。如我所见,wav 文件解码工作正常,我相信我稍后通过 portaudio 播放时遇到麻烦。

对于我的测试,我选择了一个过于简单的 wav 文件(简短:8 位位深度、11025 采样率、单声道和大约 3 秒长)。

因此,一旦我准备好所有样本,我就将它们交给了 portaudio(将它们缩放到 -1.0f 和 1.0f 之间,如教程示例中所示),我可以识别声音,但它严重失真。 ..

我认为这可能是因为采样率(虽然 11025 hz 是相当标准的)并重新采样到 Pa_getDeviceInfo->getDefaultSampleRate (44100hz) 给定的速率。

但我得到的结果是一样的。我也尝试选择另一台设备,但它仍然没有好转。

我在 Bjorn Roche (http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html) 的一些幻灯片中读到,我的扩展方法并不好,但我没有找到替代方法。

会不会是配置问题?还是我错过了有关采样和音频播放的重要信息? (这是我第一次尝试音频编程)

顺便说一句,我在 portaudio 中使用 linux 和 alsa,在初始化 portaudio 时收到这些错误消息:

    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)

我定义了我的回调函数如下:(只播放这个特定的文件)

    unsigned int actualSample;        

static int patestCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
/* Cast data passed through stream to my wav file. */
WavSound *data = (WavSound*)userData;
float *out = (float*)outputBuffer;
unsigned int i;
(void) inputBuffer; /* Prevent unused variable warning. */

for( i=0; i<framesPerBuffer; i++ )
{
*out++ = (float) ((data->getSample(::actualSample)-127)/128);
::actualSample = ::actualSample + 1;
if(::actualSample >= data->getSamplesSize())
::actualSample = 0;
}
return 0;
}

感谢阅读!

最佳答案

声音失真的原因如下:样本以无符号 8 位格式存储,但静音被定义为样本值 beign 255,因为我认为它是 0。整个缩放顺序是相反的。

我改了行:

*out++ = (float) ((data->getSample(::actualSample)-127)/128);

*out++ = (float) (((-1)*data->getSample(::actualSample)+127)/128);

一切都很顺利。

以防万一它可以帮助某人。

关于c++ 和 portaudio,可怕的扭曲输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915199/

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