微信小程序

小程序音视频通话 SDK (Linux) Beta

# 小程序音视频通话 SDK (for Linux) (内测)

此 SDK 运行于搭载 Linux 系统的硬件设备上,为设备提供向手机微信内的小程序拨打 VoIP 通话的能力。使用此 SDK 之前,参考《小程序音视频通话(for 硬件)》完成前置的接入和小程序开发流程。

# 1. 系统要求

  • C++:提供 libstdc++.so.6,且支持 C++14
  • 音频输入:必须支持 PCM,可选支持 OPUS、G711、G729
  • 音频输出:PCM
  • 视频输入(如有摄像头):H.264 编码的视频流
  • 如果设备采用 EMMC,需确保 RPMB 分区未被使用

# 2. 下载 SDK

内测阶段请先使用内测群中提供的 SDK。解压之后,你将看到如下目录:

  • include: SDK 的头文件
  • lib: SDK 的动态库文件
  • example:独立可运行的 Demo 案例

以下介绍的接口,都可以在 include 目录中找到,example 中也有对应的用法案例,请结合头文件和示例代码阅读此文档

# 3. 接口说明

初次接入,建议按顺序阅读文档。本章首先介绍 VoIP SDK 使用中的核心概念。接下来的两章分别介绍如何适配硬件抽象层以及如何使用 VoIP SDK 发起通话。

# 3.1 wx_operation 说明

头文件:wmpf/operation.h

此SDK中的接口存在大量异步操作。如果看到一个函数的返回值类型为wx_operation_t,则说明此函数是一个异步函数,需要你在合适的时机调用如下任一函数以等待来异步执行的结果:

  • wx_operation_wait():同步阻塞式等待。支持设置超时时间。
  • wx_operation_await():异步等待,不会阻塞当前线程。支持设置回调函数。

如果你不关心异步操作的结果,可以调用如下函数释放wx_operation_t对象。

  • wx_operation_destroy():主动销毁wx_operation_t对象。异步操作会继续执行。

如果你想取消一个异步操作,可以调用如下函数:

  • wx_operation_cancel():取消异步操作。

请特别注意wx_operation_t对象的生命周期,以免造成内存泄漏:

  • 调用wx_operation_waitwx_operation_await函数直至异步调用结束,那么wx_operation_t对象会被自动回收。
  • 如果调用wx_operation_wait超时,你可以重新调用wx_operation_wait函数以继续等待,或者调用wx_operation_cancel()主动结束此次异步调用。cancel后wx_operation_t对象亦会被自动回收。
  • 你也可以手动调用wx_operation_destroy()销毁operation对象,这种情况下异步操作还会继续进行,但是你将不会收到异步调用的结果。
# 3.1.1 wx_operation_wait

同步阻塞式等待。支持设置超时时间。

wx_error_t wx_operation_wait(wx_operation_t operation, uint32_t timeout_ms);
# 参数
属性 类型 说明
operation wx_operation_t 想要等待的operation对象
timeout_ms uint32_t 超时时间,单位毫秒。设置为0表示无限等待。设置为非零值则最多等待指定的时长。如果异步操作没有在指定时间内完成,则此次wait调用超时,返回WXERROR_TIMEOUT。如果超时,你可以重新调用``wx_operation_wait()函数以继续等待,也可以调用wx_operation_cancel()函数取消异步调用,或调用wx_operation_destroy()`销毁operation对象。
# 返回值
类型 说明
wx_error_t wait的结果
错误码 说明
WXERROR_OK operation顺利完成,operation对象会被自动销毁。
WXERROR_TIMEOUT operation超时。你可以重新调用wx_operation_wait()函数以继续等待,也可以调用wx_operation_cancel()函数取消异步调用,或调用wx_operation_destroy()销毁operation对象。
其他 不同的operation可能有不同的异常情况,请根据错误类型进行合理的处理。遇到此类错误码,表示异步操作已经完成,operation对象也会被自动销毁。
# 3.1.2 wx_operation_await

异步等待,不会阻塞当前线程。异步操作的结果将通过回调函数通知给你。wx_operation_t对象将会被自动回收。

void wx_operation_await(
  wx_operation_t operation,
  wx_operation_callback_t callback,
  void* user_data);
# 参数
属性 类型 说明
operation wx_operation_t 想要等待的operation对象
callback wx_operation_callback_t 回调函数
user_data void * 你想要在回调函数里接收的自定义数据。
# 3.1.3 wx_operation_cancel

取消异步操作。取消之后wx_operation_t对象将会被自动回收。调用该函数之后,不应该再对operation对象执行任何操作。

wx_error_t wx_operation_cancel(wx_operation_t operation);
# 参数
属性 类型 说明
operation wx_operation_t 想要取消的operation对象
# 返回值
类型 说明
wx_error_t cancel的结果
结果 说明
WXERROR_OK 异步操作顺利完成,operation对象会被自动销毁。
# 3.1.4 wx_operation_destroy

主动释放wx_operation_t对象,但不会取消异步操作本身。调用该函数之后,不应该再对operation对象执行任何操作。 如果你没有对wx_operation_t对象调用wait或cancel函数,并且你也不关心异步操作的结果,那么你可以调用此函数手动释放wx_operation_t对象。
如果你调用了wait函数并且收到了WXERROR_TIMEOUT错误码,那么你也可以调用此函数来释放wx_operation_t对象。
其他情况下wx_operation_t对象会被自动释放,你不应该再调用此函数主动释放它。

void wx_operation_destroy(wx_operation_t operation);
# 参数
属性 类型 说明
operation wx_operation_t 想要释放的operation对象

# 4. 硬件抽象层

VoIP SDK 正常工作依赖你的硬件设备平台提供的软硬件接口,包括麦克风、扬声器、摄像头、屏幕渲染、加密库等模块。我们设计了硬件抽象层,提供一致的接口定义,具体的接口实现需要SDK的接入方提供。

# 4.1 Module 抽象

头文件:wmpf/module.h

我们把每个模块抽象成一个wx_module类型,目前有如下几种module:

类型 头文件 说明
wx_audio_module wmpf/hardware/audio.h 音频模块,用于从麦克风和扬声器输入/输出音频流
wx_camera_module wmpf/hardware/camera.h 摄像头模块,用于从摄像头获取视频流
wx_display_module wmpf/hardware/display.h 显示模块,用于创建渲染窗口
wx_crypto_module wmpf/crypto.h 签名算法模块。VoIP SDK 依赖系统的加密库中的签名算法。

当你按需实现了这几种Module,那么在调用wx_init()初始化VoIP SDK的时候,将使用如下函数指针把你的Module提供给VoIP SDK使用:

typedef wx_error_t (*wx_get_module_t)(const char* id,
                                      struct wx_module** module);

VoIP SDK 调用你实现的这个函数时,会传给你一个ID,需要你返回此ID所对应的wx_module的实例。

# 参数
属性 类型 说明
id char* module ID,在后续定义
module wx_module ** 对应的module实例

当前支持的module ID已经预先定义在各个头文件中:

ID 头文件
WX_AUDIO_MODULE_ID wmpf/hardware/audio.h
WX_CAMERA_MODULE_ID wmpf/hardware/camera.h
WX_DISPLAY_MODULE_ID wmpf/hardware/display.h
WX_CRYPTO_MODULE_ID wmpf/crypto.h
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断请求的module是否有效。
错误码 说明
WXERROR_OK 请求的module有效。
WXERROR_UNIMPLEMENTED 请求的module无效。例如一台设备不具备摄像头,那么当VoIP SDK请求WX_CAMERA_MODULE_ID时,你只需返回WXERROR_UNIMPLEMENTED。
# 示例代码
// 假设已经实现了如下module:
extern struct wx_audio_module audio_module;
extern struct wx_camera_module camera_module;
extern struct wx_crypto_module crypto_module;
// 现实现HAL获取Module的函数如下:
wx_error_t hal_get_module(const char* id, struct wx_module** module_out) {
  if (!strcmp(id, WX_AUDIO_MODULE_ID)) {
    *module_out = (struct wx_module*)&audio_module;
    return WXERROR_OK;
  } else if (!strcmp(id, WX_CAMERA_MODULE_ID)) {
    *module_out = (struct wx_module*)&camera_module;
    return WXERROR_OK;
  } else if (!strcmp(id, WX_CRYPTO_MODULE_ID)) {
    *module_out = (struct wx_module*)&crypto_module;
    return WXERROR_OK;
  }
  // 假设当前设备没有屏幕,因此不需提供wx_display_module,那么就返回WXERROR_UNIMPLEMENTED
  return WXERROR_UNIMPLEMENTED;
}

# 4.2 音频模块 wx_audio_module

头文件:wmpf/hardware/audio.h

音频模块,需要配置一个wx_audio_module类型的实例。该类型主要包含如下几个函数指针:

函数指针 说明
get_number_of_devices VoIP SDK向系统查询音频输入/输出设备的数量。
get_device_name VoIP SDK向系统查询音频输入/输出设备的ID。
get_device_info VoIP SDK根据ID查询音频输入/输出设备的详情。
open VoIP SDK调用指定的音频输入/输出设备。

运行时,VoIP将顺序调用这4个函数,完成对音频输入/输出设备的配置。

# 4.2.1 get_number_of_devices

获取指定类型(如WX_AUDIO_DEVICE_IN表示麦克风)的设备的数量。

wx_error_t (*get_number_of_devices)(struct wx_audio_module* module,
                                    wx_audio_device_type_t device_type,
                                    size_t* num_devices_out);
# 参数
属性 类型 说明
module wx_audio_module* context
device_type wx_audio_device_type_t 设备类型,可选值WX_AUDIO_DEVICE_INWX_AUDIO_DEVICE_OUT
num_devices_out size_t* 返回对应类型的音频设备的数量
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备数量是否有效
错误码 说明
WXERROR_OK 请求到的num_devices_out有效。
# 4.2.2 get_device_name

查询指定类型(如WX_AUDIO_DEVICE_IN表示麦克风)设备列表中第index个设备的ID

wx_error_t (*get_device_name)(struct wx_audio_module* module,
                              size_t index,
                              wx_audio_device_type_t device_type,
                              char** device_name_out);
# 参数
属性 类型 说明
module wx_audio_module* context
index size_t 设备列表中指定的设备。取值范围[0, num_devices_out)
device_type wx_audio_device_type_t 设备类型,可选值WX_AUDIO_DEVICE_INWX_AUDIO_DEVICE_OUT
device_name_out char ** 返回对应设备的ID
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备ID是否有效
错误码 说明
WXERROR_OK 请求到的设备ID有效。
# 4.2.3 get_device_info

查询指定类型(如WX_AUDIO_DEVICE_IN表示麦克风)、指定设备ID的详细信息。

wx_error_t (*get_device_info)(struct wx_audio_module* module,
                              const char* id,
                              wx_audio_device_type_t device_type,
                              const struct wx_metadata** metadata_out);
# 参数
属性 类型 说明
module wx_audio_module* context
id char * get_device_name()查到的设备ID。
device_type wx_audio_device_type_t 设备类型,可选值WX_AUDIO_DEVICE_INWX_AUDIO_DEVICE_OUT
metadata_out wx_metadata ** 返回对应设备的详情。二级指针指向的对象可以是局部变量。
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备详情是否有效。
错误码 说明
WXERROR_OK 请求到的设备详情有效。
# 4.2.4 open

获取指定设备。

wx_error_t (*open)(struct wx_audio_module* module,
                   const char* id,
                   wx_audio_device_type_t device_type,
                   struct wx_audio_device** device_out);
# 参数
属性 类型 说明
module wx_audio_module* context
id char * get_device_name()查到的设备ID,或者WX_AUDIO_DEVICE_PRIMARY表示任意有效的设备。
device_type wx_audio_device_type_t 设备类型,可选值WX_AUDIO_DEVICE_INWX_AUDIO_DEVICE_OUT
device_out wx_audio_device ** 返回对应的设备实例。详见后续wx_audio_device类型说明
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备实例是否有效。
错误码 说明
WXERROR_OK 请求到的设备实例有效。
# wx_audio_device 类型
属性 类型 说明
common wx_device 设备类型的公共基类。
metadata wx_metadata 对于设备的描述信息。

可以看到,struct wx_audio_device本身的功能不多,主要是对于设备的描述。真正需要重点关注的是它的两个拓展类型:

  • wx_audio_device_in
  • wx_audio_device_out
# wx_audio_device_in 类型

对于麦克风设备的抽象。这个类型的关键是需要你提供open_input_stream函数实现,运行时VoIP SDK将调用此函数,创建音频输入流对象wx_audio_stream_in。VoIP SDK使用wx_audio_stream_in对象的实例进一步控制音频采集。

属性 类型 说明
device wx_audio_device 基类。
open_input_stream 函数指针 VoIP SDK使用这个函数指针打开/使用麦克风设备。

open_input_stream的参数:

参数 类型 说明
dev wx_audio_device_in * context
config wx_audio_config * VoIP SDK希望的麦克风配置。
listener wx_audio_stream_in_listener * VoIP SDK监听麦克风事件的回调函数。你需要在合适的时机正确地调用这些函数。
user_data void * VoIP SDK所依赖的其他context信息。你调用麦克风事件回调函数时需要带上这个指针。
stream_out wx_audio_stream_in ** 返回新创建的音频输入流对象。定义如下。
# wx_audio_stream_in 类型
参数 类型 说明
common wx_audio_stream * context
pause 函数指针 VoIP SDK调用此函数以暂停音频数据输入。
resume 函数指针 VoIP SDK调用此函数以恢复音频数据输入。
# wx_audio_stream_in_listener 类型
参数 类型 说明
common wx_struct 基类
data 函数指针 你的系统调用此函数向VoIP SDK提供麦克风采集到的音频数据。
error 函数指针 你的系统通过调用此函数告知VoIP SDK麦克风采集音频数据出错。
# wx_audio_device_out 类型

对于扬声器设备的抽象。这个类型的关键是提供open_output_stream函数实现,运行时VoIP SDK将调用此函数,创建音频输出流对象wx_audio_stream_out。VoIP SDK使用wx_audio_stream_out对象的实例进一步控制音频播放。

属性 类型 说明
device wx_audio_device 基类。
open_output_stream 函数指针 VoIP SDK使用这个函数指针打开/使用扬声器设备。

open_output_stream的参数:

参数 类型 说明
dev wx_audio_device_out * context
config wx_audio_config * VoIP SDK希望的扬声器配置。
listener wx_audio_stream_out_listener * VoIP SDK监听扬声器事件的回调函数。你需要在合适的时机正确地调用这些函数。
user_data void * VoIP SDK所依赖的其他context信息。你调用扬声器事件回调函数时需要带上这个指针。
stream_out wx_audio_stream_out ** 返回新创建的音频输出流对象。定义如下。
# wx_audio_stream_out 类型
参数 类型 说明
common wx_audio_stream * context
pause 函数指针 VoIP SDK调用此函数以暂停音频数据播放。
resume 函数指针 VoIP SDK调用此函数以恢复音频数据播放。
flush 函数指针 VoIP SDK调用此函数清空音频播放缓存。
# wx_audio_stream_out_listener 类型
参数 类型 说明
common wx_struct 基类
data 函数指针 你的系统通过调用此函数向VoIP SDK拉取待播放(铃声或收到的语音流)的音频数据。
error 函数指针 你的系统通过调用此函数通知VoIP SDK音频播放出错。

# 4.3 签名算法模块 wx_crypto_module

头文件:wmpf/crypto.h

VoIP SDK依赖系统内置的签名算法,我们提供了openssl、mbedtls、wolfssl的Demo实现,存放在example目录中。如果你使用上述crypto实现,通常可以直接使用example的代码实现,否则请参考example实现进行适配。

Demo实现:

  • example/crypto_mbedtls.c
  • example/crypto_openssl.c
  • example/crypto_wolfssl.c

# 4.4 [可选]摄像头模块 wx_camera_module

头文件:wmpf/hardware/camera.h

摄像头模块,需要配置一个 wx_camera_module 类型的实例。该类型主要是需要你提供如下几个函数指针:

函数指针 说明
get_number_of_devices VoIP SDK向系统查询摄像头设备的数量。
get_device_info VoIP SDK查询指定摄像头设备的详情。
open VoIP SDK调用指定的摄像头设备。

运行时,VoIP SDK将顺序调用这3个函数,完成对摄像头设备的配置。

# 4.4.1 get_number_of_devices

获取摄像头设备的数量。

wx_error_t (*get_number_of_devices)(struct wx_camera_module* module,
                                    size_t* num_devices_out);
# 参数
属性 类型 说明
module wx_camera_module* context
num_devices_out size_t* 返回对应类型的摄像头设备的数量
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备数量是否有效
错误码 说明
WXERROR_OK 请求到的num_devices_out有效。
# 4.4.2 get_device_info

查询指定设备的详细信息。

wx_error_t (*get_device_info)(struct wx_camera_module* module,
                              size_t index,
                              struct wx_camera_device_info* device_info);
# 参数
属性 类型 说明
module wx_camera_module* context
index size_t 设备列表中指定的设备。取值范围[0, num_devices_out)
device_info wx_camera_device_info* VoIP SDK会传入此device_info,需要你填充此结构体的内容。
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备详情是否有效。
错误码 说明
WXERROR_OK 请求到的设备详情有效。
# 4.4.3 open

获取指定设备。

wx_error_t (*open)(struct wx_camera_module* module,
                   const char* id,
                   struct wx_camera_device** device_out);
# 参数
属性 类型 说明
module wx_camera_module* context
id char * get_device_name()查到的设备ID,或者WX_CAMERA_DEVICE_PRIMARY表示任意有效的设备。
device_out wx_camera_device ** 返回对应的设备实例。
# 返回值
类型 说明
wx_error_t VoIP SDK根据此返回值,判断得到的设备实例是否有效。
错误码 说明
WXERROR_OK 请求到的设备实例有效。

# 5. 使用 VoIP SDK 通话

# 5.1 初始化SDK

头文件:wmpf/wmpf.h

你的进程每次启动后,调用任意VoIP SDK的接口之前,需要首先调用如下方法对VoIP SDK进行初始化。

wx_operation_t wx_init(const wx_init_config_t* config,
                             wx_get_module_t get_module);
# 参数
属性 类型 说明
config wx_init_config_t* 初始化参数,后面详细说明
get_module wx_get_module_t 前述第4章(硬件抽象层)所配置的函数指针
# 返回值
类型 说明
wx_operation_t wx_init()是异步函数,会发起网络请求。请留意异步操作完成之后的状态码。
状态码 说明
WXERROR_INVALID_ARGUMENT config中的参数有错误。
WXERROR_TIMEOUT 请求超时。
WXERROR_RESOURCE_EXHAUSTED 请检查网络状态或磁盘读写权限。
WXERROR_FAILED_PRECONDITION config传入的device_id和device_signature没有在WeCooper平台注册;或重复调用wx_init()。
WXERROR_INTERNAL 其他内部错误。
# wx_init_config_t

提供初始化VoIP SDK所需的一系列参数。

属性 类型 说明
common wx_struct_t wx_init_config_t类型的“基类”
log_dir char * SDK写日志的路径。如果设置为NULL则不会写入日志
data_dir char * SDK读写数据的路径。需确保进程有该目录的读写权限,需确保此目录内容不被其他代码/进程修改。
product_id int 固定填0
host_appid char * 固定填NULL
device_id char * 厂商自行分配的设备ID。需确保每台设备上的VoIP SDK使用唯一的ID,并且同一设备始终使用同一ID。
device_signature char * 固定填NULL
device_signature_version int 固定填0
model_id char * 通过微信公众平台获得
wxa_appid char * 接收通话的小程序的AppID
wxa_flavor wx_wxa_flavor_t 接收通话的小程序的版本,如开发版、体验版、正式版。
rpmb_device char * RPMB设备路径。采用EMMC的硬件设备需要指定此路径。

# 5.2 注册设备

头文件:wmpf/wmpf.h

SDK初始化成功之后,应当首先检查设备是否已经注册过。如果没有注册过,则需对设备进行注册,然后才能发起通话。

# 5.2.1 检查当前设备是否已注册
wx_error_t wx_device_is_registered(bool* is_registered_out);
# 参数
属性 类型 说明
is_registered_out bool* 传入指针,用于接收是否注册的状态,如果检查到尚未注册,需要参考流程2.2进行设备注册
# 返回值
类型 说明
wx_error_t 用于检查wx_device_is_registered()调用是否正常
错误码 说明
WXERROR_FAILED_PRECONDITION wx_init()函数尚未调用。需要先调用wx_init()。
WXERROR_OK wx_device_is_registered()调用正常,is_registered_out结果有效。
# 5.2.2 设备注册
wx_operation_t wx_device_register(const char* sn_ticket);
# 参数
属性 类型 说明
sn_ticket char* 设备票据,获取方法参考getSnTicket
# 返回值
类型 说明
wx_operation_t wx_device_register()是异步函数,会发起网络请求。请留意异步操作完成之后的状态码。
状态码 说明
WXERROR_INVALID_ARGUMENT sn_ticket不合法或已失效。
WXERROR_ALREADY_EXISTS 设备已经注册过,无需二次注册。
WXERROR_PERMISSION_DENIED 该设备ID已经注册过。
WXERROR_UNAVAILABL 网络访问失败。
WXERROR_DATA_LOSS 写入注册信息失败。需要检查文件读写权限。如果是EMMC,需检查RPMB是否已经写过内容。
WXERROR_FAILED_PRECONDITION wx_init()函数尚未调用。需要先调用wx_init()。

# 5.3 配置 Session

头文件:wmpf/voip.h

发起通话之前,需要首先创建一个Session。Session中将配置通话发起方(也就是接入此SDK的设备)的信息,设置通话状态回调等。

# 5.3.1 初始化Session对象

调用wx_voip_session_new()以配置wx_voip_session_t对象。此对象用于进一步发起通话。Session对象可以重复使用,反复发起通话。

wx_error_t
wx_voip_session_new(wx_voip_session_type_t,
                    wx_voip_session_scene_t,
                    const struct wx_voip_session_listener* listener,
                    void* user_data,
                    const wx_voip_member_t* caller,
                    const wx_voip_session_config_t* config,
                    wx_voip_session_t* session);
# 参数
属性 类型 说明
session_type wx_voip_session_type_t 选择是纯音频通话还是音视频通话
scene wx_voip_session_scene_t 固定填WX_VOIP_SESSION_SCENE_IOT
listener wx_voip_session_listener * 设置监听通话状态回调
user_data void * 开发者按需设置context信息。相关内容可以在状态回调中获取到。
caller wx_voip_member_t * 通话发起方(也就是接入此SDK的设备)的信息,详见后续“caller参数说明”
config wx_voip_session_config_t * 摄像头配置(分辨率、旋转等)。纯音频通话填入默认值{0,0,0}即可。
session wx_voip_session_t * 本次配置的session对象。注意:后续需记得调用wx_voip_session_destroy()销毁此对象。
# 返回值
类型 说明
wx_error_t wx_voip_session_new()调用是否正常
错误码 说明
WXERROR_INVALID_ARGUMENT 参数错误。
WXERROR_FAILED_PRECONDITION wx_init()函数尚未调用。需要先调用wx_init()。
# caller 参数说明

设备端(通话发起方)的wx_voip_member_t设置如下:

属性 类型 说明
name char * 固定填空字符串
id char * 必须传入调用wx_init()时config中的device_id
camera_status wx_voip_member_camera_status_t 音视频通话,此参数描述通话建立时己方摄像头是否开启。纯音频通话忽略。
# 5.3.2 销毁Session对象

当不需要发起通话之后,需要销毁之前创建的Session对象,防止内存泄漏。

void wx_voip_session_destroy(wx_voip_session_t session);
# 参数
属性 类型 说明
session wx_voip_session_t * 要销毁的session对象。

# 5.4 通话

头文件:wmpf/voip.h

成功创建了wx_voip_session_type_t对象,就可以进一步发起通话了。调用wx_voip_session_call()发起通话,调用wx_voip_session_hangup()主动结束通话。通话也可能被对方挂断,或者被异常挂断,相关事件通过创建session时设置的回调去监听。

# 5.4.1 发起通话

调用异步函数wx_voip_session_call()发起通话:

wx_operation_t
wx_voip_session_call(wx_voip_session_t session,
                     const wx_voip_member_t* callee);
# 参数
属性 类型 说明
session wx_voip_session_t 前面创建的session对象
callee wx_voip_member_t* 通话接听端(小程序端)信息。详见后续「callee 参数说明」
# 返回值
类型 说明
wx_operation_t wx_voip_session_call()是异步函数,会发起网络请求。此异步函数返回成功,表示通话正确拨出,不代表通话已接通。请留意异步操作完成之后的状态码。
状态码 说明
WXERROR_FAILED_PRECONDITION 当前正在通话中,不要重复拨打电话。
WXERROR_RESOURCE_EXHAUSTED 请检查网络状态。
WXERROR_PERMISSION_DENIED 被拨打的用户未向当前设备授权拨打 VoIP通话权限;或当前小程序开通拨打 VoIP 通话的权限。
WXERROR_INVALID_ARGUMENT open_id或sn_ticket设置错误
WXERROR_UNAVAILABLE 当前微信小程序没有开通VoIP通话权限,或未购买通话时长。
WXERROR_INTERNAL 内部错误
# callee 参数说明

小程序端(通话接听方)的 wx_voip_member_t 设置如下:

属性 类型 说明
name char * 显示在设备端UI上的名称。
id char * 传入通话接收方微信用户在小程序里的open_id。
camera_status wx_voip_member_camera_status_t 音视频通话,此参数描述通话建立时手机微信小程序端摄像头是否开启。纯音频通话请忽略此参数。
# 5.4.2 主动结束通话
wx_operation_t 
wx_voip_session_hangup(wx_voip_session_t session,
                       wx_voip_hangup_reason_t reason);
# 参数
属性 类型 说明
session wx_voip_session_t 前面创建的session对象
reason wx_voip_hangup_reason_t 挂断VoIP通话的原因
# 返回值
类型 说明
wx_operation_t wx_voip_session_hangup()是异步函数,会发起网络请求。此异步函数返回成功,表示通话成功挂断。请留意异步操作完成之后的状态码。

# 5.5 关闭SDK

头文件:wmpf/wmpf.h

当你不再使用VoIP SDK所提供的功能,想要释放资源,可以调用如下函数。
调用此函数之前,请务必确保之前的所有wx_operation、wx_voip_session等对象已经释放,否则可能造成未知的后果。
成功调用此函数之后,如何你还想再次使用VoIP SDK,那么需要重新走一遍5.1开始的各个流程。

wx_error_t wx_stop();
# 返回值
类型 说明
wx_error_t stop的结果
状态码 说明
WXERROR_OK VoIP SDK正常关闭