C ++和PortAudio,可怕的失真输出
c++ and portaudio, horribly distorted output
我写了一小段代码,旨在读取wav文件并通过portaudio播放。
我限制自己使用一些特定的 wav 文件:线性 pcm(无压缩),不超过 2 个通道。如我所见,wav 文件解码工作得很好,我相信我以后通过 portaudio 播放时遇到了麻烦。
对于我的测试,我选择了一个过于简单的wav文件(短:8位位深度,11025采样率,单声道和大约3秒长)。
所以,一旦我准备好了所有的样本,我就把它们交给了portaudio(调用它们,所以它们在-1.0f和1.0f之间,如教程示例中所示),我可以识别声音,但它被严重扭曲了......
我认为这可能是因为采样率(虽然 11025 Hz 是相当标准的),并将其重新采样为 Pa_getDeviceInfo->getDefaultSampleRate (44100hz) 给出的速率。
但我只是得到相同的结果。我还尝试选择另一个设备bt,但它并没有变得更好。
我在 Bjorn Roche (http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html) 的一些幻灯片中读到我的扩展方法不好,但我找不到其他选择。
可能是配置问题吗?还是我错过了一些关于采样和音频播放的重要内容?(这是我第一次尝试音频编程)
顺便说一下,我将 linux 和 alsa 与 portaudio 一起使用,在初始化 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 位格式存储,但静音定义为样本值 255,因为我认为它是 0。 整个缩放顺序相反。
我更改了行:
*out++ = (float) ((data->getSample(::actualSample)-127)/128);
跟
*out++ = (float) (((-1)*data->getSample(::actualSample)+127)/128);
一切都很顺利。
以防万一它可以帮助某人。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 处理文件期间输出失真.wav
- C ++和PortAudio,可怕的失真输出