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
相关产品推荐
相关产品推荐

