跳到主要内容

双向对讲

更新时间:2025-01-16 19:29:24

语音通话

双向对讲只在直播时可用

typedef NS_ENUM(NSInteger, LVAudioVideoTalkType) {
LVAudioVideoTalkType_Audio, // 音频通话
LVAudioVideoTalkType_Video, // 视频通话
};

@protocol LVAudioVideoTalkDelegate <NSObject>
- (void)audioVideoTalk:(LVAudioVideoTalk *)audioVideoTalk didFailToAudioVideoTalkWithError:(NSError *)error;
@end

@protocol LVAudioVideoTalkInterface <NSObject>

/**
初始化对象
@param deviceInfo 设备信息
@param avTalkType 音频、视频通话话类型
@param delegate 代理对象
*/
- (id)initWithDeviceInfo:(LVPlayInfo *)deviceInfo avTalkType:(LVAudioVideoTalkType)avTalkType delegate:(id<LVAudioVideoTalkDelegate>)delegate;
/**
开始通话
*/
- (void)startTalk;
/**
结束通话
*/
- (void)endTalk;
@end

调用示例如下:

// 初始化音频通话引擎
-(LVAudioVideoTalk *)audioTalkEngin {
if (_audioTalkEngin == nil) {
LVPlayInfo *deviceInfo = [[LVPlayInfo alloc] init];
deviceInfo.iotId = self.curDevice.iotId;
deviceInfo.productKey = self.curDevice.productKey;
deviceInfo.deviceName = self.curDevice.deviceName;
_audioTalkEngin = [[LVAudioVideoTalk alloc] initWithDeviceInfo:deviceInfo avTalkType:LVAudioVideoTalkType_Audio delegate:self];
}
return _audioTalkEngin;
}
// 开始音频通话
[self.audioTalkEngin startTalk];
// 结束音频通话
[self.audioTalkEngin endTalk];

#pragma mark -- LVAudioVideoTalkDelegate --
- (void)audioVideoTalk:(LVAudioVideoTalk *)audioVideoTalk didFailToAudioVideoTalkWithError:(NSError *)error {
// code: -10023代表对讲通道被占用
[self showToast:[NSString stringWithFormat:@"%ld : %@",error.code,error.userInfo[NSLocalizedFailureReasonErrorKey]]];
if (self.isAudioTalking) {
[self functionAudioTalk:NO];// 停止对讲
}
}

备注:当didFailToAudioVideoTalkWithError:回调error.code = -10023时,代表当前语音对讲通道被其他端占用,应结束对讲。

视频通话

手机端与带显示屏设备的双向视频通话

// 导入SDK头文件
#import <RTCXMedia/RTCXMedia.h>
typedef NS_ENUM(NSInteger, LVAudioVideoTalkType) {
LVAudioVideoTalkType_Audio, // 音频通话
LVAudioVideoTalkType_Video, // 视频通话
};

@protocol LVAudioVideoTalkDelegate <NSObject>
- (void)audioVideoTalk:(LVAudioVideoTalk *)audioVideoTalk didFailToAudioVideoTalkWithError:(NSError *)error;
@end

@protocol LVAudioVideoTalkInterface <NSObject>

/**
初始化对象
@param deviceInfo 设备信息
@param avTalkType 音频、视频通话话类型
@param delegate 代理对象
*/
- (id)initWithDeviceInfo:(LVPlayInfo *)deviceInfo avTalkType:(LVAudioVideoTalkType)avTalkType delegate:(id<LVAudioVideoTalkDelegate>)delegate;
/**
开始通话
*/
- (void)startTalk;
/**
结束通话
*/
- (void)endTalk;
/**
设置音视频通话配置
*/
- (void)setAudioVideoTalkConfig:(LVAudioVideoTalkConfig *)talkConfig;
/**
设置视频通话显示小窗口 如果avTalkType == LVAudioVideoTalkType_Video,需要调用
@param superView 小窗口所在父视图
@param videoFrame 显示小窗口的frame
*/
- (void)setVideoDisplaySuperView:(UIView *)superView videoFrame:(CGRect)videoFrame;
/**
设置视频画面是否可见,默认可见的(视频可见时播放器会渲染图像,不可见时播放器会停止渲染图像) YES: 不可见 NO: 可见
*/
- (void)setVideoInvisibleEnable:(BOOL)invisible;
/**
设置麦克风是否静音 YES: 静音 NO:不静音
*/
- (BOOL)setMuteLocalAudio:(BOOL)mute;
/**
设置摄像头是否开启 YES: 关闭摄像头 NO:开启摄像头
*/
- (BOOL)setMuteLocalVideo:(BOOL)mute;
/**
切换前后摄像头 front暂未启用,前后摄像头切换无需参数控制,completionCallback: 摄像头前后切换完成回调,在此回调之后再进行下一次的切换,防止crash
*/
- (BOOL)setSwitchCamera:(BOOL)front completionCallback:(void(^)(int type))callback;
/**
获取视频通话的视频小窗口view
*/
- (LVPlayerView *)localVideoWindow;
@end

调用示例如下:

// 初始化视频通话引擎
-(LVAudioVideoTalk *)videoTalkEngin {
if (_videoTalkEngin == nil) {
LVPlayInfo *deviceInfo = [[LVPlayInfo alloc] init];
deviceInfo.iotId = self.curDevice.iotId;
deviceInfo.productKey = self.curDevice.productKey;
deviceInfo.deviceName = self.curDevice.deviceName;
_videoTalkEngin = [[LVAudioVideoTalk alloc] initWithDeviceInfo:deviceInfo avTalkType:LVAudioVideoTalkType_Video delegate:self];
CGFloat height = 168;
CGFloat width = 168 * (240.0 / 320.0);
[_videoTalkEngin setVideoDisplaySuperView:self videoFrame:CGRectMake((SCREEN_WIDTH-width)/2, 0, width, height)];
}
return _videoTalkEngin;
}
// 开始视频通话
[self.videoTalkEngin startTalk];
// 结束视频通话
[self.videoTalkEngin endTalk];
// 设置麦克风是否静音
[self.videoTalkEngin setMuteLocalAudio:YES];
// 设置摄像头是否开启
[self.videoTalkEngin setMuteLocalVideo:YES];
// 切换前后摄像头
[self.videoTalkEngin setSwitchCamera:YES completionCallback:^(int type) {
}];
// 获取视频小窗口view
LVPlayerView *view = [self.videoTalkEngin localVideoWindow];

#pragma mark -- LVAudioVideoTalkDelegate --
- (void)audioVideoTalk:(LVAudioVideoTalk *)audioVideoTalk didFailToAudioVideoTalkWithError:(NSError *)error {
// code: -10023代表视频通道被占用
[self showToast:[NSString stringWithFormat:@"%ld : %@",error.code,error.userInfo[NSLocalizedFailureReasonErrorKey]]];
if (self.isVideoTalking) {
[self.videoTalkEngin endTalk];// 停止视频通话
}
}

备注:当didFailToAudioVideoTalkWithError:回调error.code = -10023时,代表当前视屏通话通道被其他端占用,应结束视频通话。