- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一小段代码,打算读取一个 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/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!