我编写了一小段代码,用于读取wav文件并通过portaudio播放。
我限制自己使用某些特定的wav文件:线性pcm(无压缩),不超过2个通道。正如我所看到的,wav文件解码工作得很好,我相信以后通过portaudio播放时会遇到麻烦。
对于我的测试,我选择了一个过于简单的wav文件(简短:8位bit深度,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)的一些幻灯片中读到我的缩放方法并不好但我找不到其他选择。
可能是配置问题吗?还是我错过了关于采样和音频播放的重要事项? (这是我在音频节目中的第一次拍摄)
顺便说一句,我正在使用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;
}
感谢阅读!
答案 0 :(得分:3)
声音失真的原因如下:样本以无符号8位格式存储,但是静音定义为样本值beign 255,因为我认为它是0.整个缩放是相反的顺序。
我换了一行:
*out++ = (float) ((data->getSample(::actualSample)-127)/128);
与
*out++ = (float) (((-1)*data->getSample(::actualSample)+127)/128);
这一切都很顺利。
以防它可以帮助某人。