IrrKlang播放WAV文件时getPlayLength()返回时长异常求助
解决irrKlang getPlayLength()返回异常时长的问题
嗨,我之前也碰到过类似的情况,咱们一步步来排查解决:
最可能的原因:音频未加载完成就调用了getPlayLength()
irrKlang的play2D()是异步加载音频的——它会立刻返回声音实例,但后台还在加载音频数据。你刚调用完play2D()就去拿时长,此时只加载了极少量数据,所以返回143ms这种异常值。
解决方法很直接:先暂停播放让音频加载完成,再获取时长:
// 第三个参数设为true,让音频先暂停加载 auto m_pSound = m_pSoundEngine->play2D("G:\\SomeAbsolutePath\\3_Tenor.wav", true, true, true); // 等待音频加载就绪 while (!m_pSound->isReady()) { Sleep(10); // 短暂休眠,避免占满CPU } // 现在获取的时长就是正确的了 auto actualLength = m_pSound->getPlayLength(); // 之后再恢复播放 m_pSound->setIsPaused(false);
备选排查方向:WAV格式兼容性问题
VLC的解码能力很强,但irrKlang对WAV格式有更严格的要求,它优先支持16位PCM、44.1kHz/48kHz的标准WAV。如果你的文件是24位深度、非PCM编码(比如Cubase导出的某些压缩WAV变体),就可能导致irrKlang解析时长出错。
你可以用Audacity把文件转成标准16位PCM WAV,再测试一次,大概率能解决问题。
更可靠的验证方式:先加载音频源再获取时长
如果你想彻底避开异步加载的坑,可以先手动加载音频源,从源里获取时长:
auto soundSource = m_pSoundEngine->addSoundSourceFromFile("G:\\SomeAbsolutePath\\3_Tenor.wav"); if (soundSource) { // 从音频源获取的时长是100%准确的 auto length = soundSource->getPlayLength(); // 再用这个源播放音频 auto m_pSound = m_pSoundEngine->play2D(soundSource, true, false, true); }
最后:检查irrKlang版本
如果以上方法都不行,试试更新到最新版的irrKlang——旧版本可能存在某些WAV解析的bug,更新后大概率能修复。
内容的提问来源于stack exchange,提问作者144226734
相关产品推荐
相关产品推荐

