You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DirectSound创建二级缓冲区失败问题求助

排查DirectSound二级缓冲区创建失败的问题

以下是几个常见错误原因及修复方案:

1. 二级缓冲区标志缺失

你的代码中secondary_buffer_desc.dwFlags = 0,这不符合DirectSound的要求。创建二级缓冲区时必须指定合适的缓冲区类型标志:

  • 若为流式播放(从服务器持续接收数据),使用DSBCAPS_STREAMING
  • 若加载完整音频文件,使用DSBCAPS_STATIC
    同时建议添加DSBCAPS_GLOBALFOCUS,避免窗口失焦时音频中断。

修改示例:

secondary_buffer_desc.dwFlags = DSBCAPS_STREAMING | DSBCAPS_GLOBALFOCUS;

2. 缓冲区大小不符合规范

DirectSound要求二级缓冲区大小必须是音频块对齐值(nBlockAlign)的整数倍,且不能超过设备支持的最大缓冲区大小。
检查file_size的值:

  • 若file_size为0,说明从服务器获取的文件大小无效,需确认Socket传输的文件数据是否正确
  • 确保缓冲区大小与块对齐值匹配,若不匹配则调整:
file_size = (file_size / primary_buffer_format.nBlockAlign) * primary_buffer_format.nBlockAlign;

3. 音频格式不被设备支持

虽然你设置了主缓冲区为44100Hz/16位/立体声,但部分音频设备可能不支持该配置。可先尝试简化格式测试:

primary_buffer_format.nChannels = 1;
primary_buffer_format.nSamplesPerSec = 22050;
primary_buffer_format.nBlockAlign = 1 * 16 / 8;
primary_buffer_format.nAvgBytesPerSec = 22050 * primary_buffer_format.nBlockAlign;

若能成功创建缓冲区,说明原格式不被当前设备支持。

4. 精准定位错误码

仅输出通用错误信息无法精准排查,建议获取具体HRESULT错误码:

HRESULT hr = dsound->CreateSoundBuffer(&secondary_buffer_desc, &secondary_buffer, NULL);
if (hr != DS_OK) {
    std::cout << "Error creating secondary buffer, HRESULT: 0x" << std::hex << hr << std::endl;
    // 后续清理代码
}

例如DSERR_BADSIZE表示缓冲区大小无效,DSERR_FORMATNOTSUPPORTED表示格式不被支持。

额外注意事项

  • 流式播放场景下,无需将二级缓冲区设置为完整文件大小,建议设置为2-5秒的音频数据量(比如4410022*2=352800字节,对应2秒立体声16位音频),后续循环填充数据即可实现流式播放。
  • 若为控制台程序,GetDesktopWindow()可能导致协作级别异常,可尝试创建隐藏窗口作为DirectSound的协作窗口。

内容的提问来源于stack exchange,提问作者Doums 2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:23