因此,我正在构建一个线程 IMA ADPCM 解码器,将音频数据流式传输到 OpenAL(参见下面的简短描述)但我遇到了一些麻烦。
我的问题之一是有时我对 alBufferData 的调用:
alBufferData(*bufferID, format, pcmData, sizeInBytes, bitRate);
returns AL_INVALID_VALUE
尽管如此,在检查参数时,它们看起来像这样:
bufferID='109770616', format='AL_FORMAT_STEREO16', dataPtr='109754188', sizeInBytes='8164'
有任何线索吗?发生这种情况时,实际播放的声音会有些卡顿,并且错误通常会连续发生约 10 次(在同一声音上)。当我重复启动相同的声音时,通常也会发生这种情况(例如,用轻机枪进行短时间连发射击时......;))
流媒体解码器模块的快速简化浏览
声音的播放方式:
- 触发播放声音。
- 一个 bufferSize 大小的音频被解码,其余的则排队等待进一步解码。
- OpenAL 被触发开始播放声音。
解码/流媒体循环
- 对于每个排队等待解码的声音,解码 bufferSize 大小的音频。
- 解码后的音频将添加到具有适当 bufferID 的 alBuffer(请参阅上面的调用)中。
如果还不算太晚,我会告诉您我在 BufferData 中遇到的类似问题,以下是我的修复方法。不过,请记住,我不知道您的线程程序的具体情况。
由于多种原因返回无效值,我所知道的原因是......
- 如果源已经分配了 bufferID,则将新缓冲区排队(到流媒体源)(因为如果设置缓冲区 ID,它将设置为静态)。如果是这样,请删除源属性中的 ID。
- 更改播放中的缓冲区格式。一旦源开始播放,您就无法更改任何缓冲区设置(fmt、采样率),除了缓冲区数据本身,即使它位于另一个排队的源上。
听起来您可能正在另一个线程中更改这些设置之一。
另一件可能导致爆音的事情是重放声音。再次调用 play 只是停止源,然后倒回当前缓冲区并从头开始播放。像这样演奏枪声听起来不像你想要的(我认为是分层的)。 2 个选项,将剩余的枪声混合到缓冲区中然后重播,但这可能不起作用。另一个万无一失的方法是使用多个来源并轮流在每次开火时调用哪些来源。
祝你的项目好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)