|
BRAC_EnumAudioCapture
BRAC_EnumVideoCapture
这2个函数是一样的接口类型, 分别是枚举音频设备和视频设备的, 在每个多个设备情况下, BRAC_EnumVideoCapture视频多个设备没问题,但是BRAC_EnumAudioCapture多个音频设备时或出现IndexOutOfRangeException的异常(索引超出了数组界限). 使用的是vb.net 2008进行调用.
Dim maxDeviceNum As Integer = 10
Dim DeviceNameArray(maxDeviceNum - 1) As IntPtr
BRAC_EnumAudioCapture(DeviceNameArray(0), maxDeviceNum)
Dim i As Integer = 0
Do While (i < maxDeviceNum)
Dim tBytes As Byte()
Dim j As Integer = 0
While (Marshal.ReadByte(DeviceNameArray(i), j) <> 0)
ReDim Preserve tBytes(j)
tBytes(j) = Marshal.ReadByte(DeviceNameArray(i), j)
j += 1
End While
Dim DeivceName As String = Encoding.Default.GetString(tBytes)
Marshal.FreeHGlobal(DeviceNameArray(i))
i = i + 1
Loop
经过仔细比对发现原来是给的DEMO里面的函数声明出了问题
'注意:这里将CHAR**类型的参数lpDeviceName定义为引用传递的IntPtr类型,请注意这里传递回来的CHAR*指针所指缓冲区为函数在内部所分配,应注意手工释放该缓冲区,具体请参见相应SDK文档
'// 枚举本地音频采集设备
'BRAC_API DWORD BRAC_EnumAudioCapture(CHAR** lpDeviceName, DWORD& dwDeviceNum);
<DllImport(AnyChatSDKDLL, EntryPoint:="BRAC_EnumAudioCapture", CallingConvention:=CallingConvention.Cdecl)> _
Function BRAC_EnumAudioCapture(ByRef lpDeviceName As Integer, ByRef dwDeviceNum As Integer) As Integer
End Function
'注意:这里将CHAR**类型的参数lpDeviceName定义为引用传递的IntPtr类型,请注意这里传递回来的CHAR*指针所指缓冲区为函数在内部所分配,应注意手工释放该缓冲区,具体请参见相应SDK文档
'// 枚举本地视频采集设备
'BRAC_API DWORD BRAC_EnumVideoCapture(CHAR** lpDeviceName, DWORD& dwDeviceNum);
<DllImport(AnyChatSDKDLL, EntryPoint:="BRAC_EnumVideoCapture", CallingConvention:=CallingConvention.Cdecl)> _
Function BRAC_EnumVideoCapture(ByRef lpDeviceName As IntPtr, ByRef dwDeviceNum As Integer) As Integer
End Function
第一个参数的问题, 视频接口里面声明的是IntPtr 而 音频接口里面声明的是Integer类型.
所以, 恩, 修改一下吧.
|
|