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

VB.NET中使用XtAudio遇回调函数stream为空崩溃问题求助

问题分析与解决方案

你的核心错误是创建XtStreamParams时错误调用了委托的Invoke方法,而非直接传递委托实例。这会导致回调函数在参数未初始化时就被执行,自然出现stream为空的崩溃。以下是具体修正步骤:

1. 修正委托与回调函数

确保委托定义严格匹配XtAudio要求的签名,回调函数无需静态(除非有特殊需求):

' 委托定义需完全匹配XtAudio的回调签名
Private Delegate Function XtBufferCallback(ByVal stream As XtStream, ByVal buffer As XtBuffer, ByVal userData As Object) As Integer

' 实际回调函数
Private Function OnBufferCallback(ByVal stream As XtStream, ByVal buffer As XtBuffer, ByVal userData As Object) As Integer
    ' 流创建后才会触发回调,此处stream不会为空
    Dim safeBuffer As XtSafeBuffer = XtSafeBuffer.Get(stream)
    ' 在此处理音频播放/录制逻辑
    ' ...
    Return 0 ' 返回0表示正常执行
End Function

2. 正确初始化流参数与创建流

不要调用Invoke,直接将委托实例传入XtStreamParams,完成设备打开、流创建的完整流程:

' 假设已从设备列表示例中获取目标音频设备
Dim targetDevice As XtDevice = ...
' 定义所需的音频格式(如44.1kHz、16位立体声)
Dim audioFormat As XtFormat = ...

' 创建流参数:直接传递委托实例,而非调用它
Dim bufferCallback As XtBufferCallback = AddressOf OnBufferCallback
Dim streamParams As New XtStreamParams(True, bufferCallback, Nothing, Nothing)

' 创建并启动流
Using audioStream As XtStream = targetDevice.OpenStream(audioFormat, streamParams, Nothing)
    audioStream.Start()
    ' 保持程序运行(如等待用户操作或播放完成)
    Console.ReadLine()
    audioStream.Stop()
End Using

3. 关键注意事项

  • 必须先正确初始化XtDevice和XtFormat,二者是创建有效stream的前提
  • 回调中处理音频数据时,需注意buffer的大小与格式,避免越界访问
  • 64位环境下,确保引用的XtAudio库为64位版本,避免架构不匹配问题

内容的提问来源于stack exchange,提问作者Paul Goldstein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:07:03