双向对讲
更新时间:2026-04-03 11:20:37
语音通话
双向对讲只在直播时可用
// 导入头文件
import 'package:airtc_engine/src/audio_video_talk/rtcx_audio_video_talk.dart';
import 'package:airtc_engine/src/audio_video_talk/rtcx_audio_video_talk_controller.dart';
class RTCXFluAudioVideoTalkApi {
/// 初始化音视频通话对象
void initTalk(RTCXFluAudioVideoTalkReq req);
/// 开始通话
void startTalk();
/// 结束通话
void endTalk();
/// 设置音视频通话质量
void setAudioVideoTalk(RTCXFluAudioVideoTalkConfig config);
/// 设置麦克风是否静音 YES: 静音 NO:不静音
RTCXFluAudioVideoResult setMuteLocalAudio(bool mute);
/// 设置摄像头是否开启 YES: 关闭摄像头 NO:开启摄像头
RTCXFluAudioVideoResult setMuteLocalVideo(bool mute);
/// 切换前后摄像头 暂时未实现
/// 切换前后摄像头 front暂未启用,前后摄像头切换无需参数控制,completionCallback: 摄像头前后切换完成回调,在此回调之后再进行下一次的切换,防止crash
void setSwitchCamera();
/// 释放音视频通话对象 (SDK没有,但封装后,内部引用,需手动释放)
void release();
}
调用示例如下:
- 初始化设置
// 1. 创建实例
// 语音对讲
final RTCXFluAudioVideoTalkController _talkApi = RTCXFluAudioVideoTalkController();
// 2. 初始化设置
@override
void initState() {
super.initState();
// 初始化通话对象
_talkApi.initTalk(
RTCXFluAudioVideoTalkReq(
type: RTCXFluAudioVideoTalkType.RTCXFluAudioVideoTalkType_Audio,
iotId: widget.iotId,
productKey: widget.productKey,
deviceName: widget.deviceName,
deviceType: widget.deviceType,
),
);
// 添加监听
_talkApi.onTalkError.listen((error) {
print('通话错误: $error');
});
}
// 释放
@override
void dispose() {
_talkApi.release();
super.dispose();
}
- 开始通话 开始通话需要麦克风权限,请先获取权限授权,再调用startTalk。可以使用Permission来获取授权。
final micStatus = await Permission.microphone.request();
if (micStatus.isGranted) {
// 开始通话
_talkApi.startTalk();
} else {
print(micStatus.toString());
print("需要麦克风权限才能进行通话");
}
- 结束通话
// 结束通话
_talkApi.endTalk();
- 设置麦克风是否静音
// 设置麦克风是否静音
Future<void> setMuteLocalAudio(bool mute) async {
try {
RTCXFluAudioVideoResult result = await _talkApi.setMuteLocalAudio(mute);
if(result.result) {
// 设置成功
print("设置成功");
} else {
print("设置失败");
}
} catch (e) {
print("setMuteLocalAudio e:" + e.toString());
}
}
备注:当onTalkError:回调error.code = -10023时,代表当前语音对讲通道被其他端占用,应结束对讲。
视频通话
调用示例如下:
- 初始化设置
// 1. 创建实例
// 视频对讲
final RTCXFluAudioVideoTalkController _talkApi = RTCXFluAudioVideoTalkController();
// 2. 初始化设置
@override
void initState() {
super.initState();
// 初始化通话对象
_talkApi.initTalk(
RTCXFluAudioVideoTalkReq(
type: RTCXFluAudioVideoTalkType.RTCXFluAudioVideoTalkType_Video,
iotId: widget.iotId,
productKey: widget.productKey,
deviceName: widget.deviceName,
deviceType: widget.deviceType,
),
);
// 添加监听
_talkApi.onTalkError.listen((error) {
print('通话错误: $error');
});
}
// 释放
@override
void dispose() {
_talkApi.release();
super.dispose();
}
- 开始通话 开始视频通话需要麦克风和相机权限,请先获取权限授权,再调用startTalk。可以使用Permission来获取授权。
final micStatus = await Permission.microphone.request();
final cameraStatus = await Permission.camera.request();
if (micStatus.isGranted && cameraStatus.isGranted) {
// 开始通话
_talkApi.startTalk();
} else {
print(micStatus.toString());
print(cameraStatus.toString());
}
- 结束通话
// 结束通话
_talkApi.endTalk();
- 设置视频通话质量
// 设置音视频通话质量
void setAudioConfig() {
RTCXFluAudioVideoTalkConfig config = RTCXFluAudioVideoTalkConfig(
audioTalk: false,
videoTalk: true,
videoResolutionRatioWidth: 640,
videoResolutionRatioHeight: 360,
videoFps: 15,
videoMaxBitrate: 900000,
);
_talkApi.setAudioVideoTalk(config);
}
- 设置摄像头是否开启
// 设置摄像头是否开启
Future<void> setMuteLocalVideo(bool mute) async {
try {
RTCXFluAudioVideoResult result = await _talkApi.setMuteLocalVideo(mute);
if(result.result) {
// 设置成功
print("设置成功");
} else {
print("设置失败");
}
} catch (e) {
print("setMuteLocalVideo e:" + e.toString());
}
}
- 切换前后摄像头
// 切换前后摄像头
void setSwitchCamera() {
_talkApi.setSwitchCamera();
}
备注:当onTalkError:回调error.code = -10023时,代表当前视屏通话通道被其他端占用,应结束视频通话。