媒体设备管理
实时音视频(TRTC)需要在直播场景中支持对多种媒体设备进行控制,以满足用户直播过程中的多种需求,本文将介绍如何:
控制摄像头
打开/关闭闪光灯
打开/关闭麦克风和摄像头
TRTC 提供了两种方式对麦克风/摄像头进行打开和关闭操作,均推荐采用第一种方式对麦克风/摄像头进行操作。
打开/关闭麦克风
方式一:调用 muteLocalAudio
该接口与 stopLocalAudio 不同,调用
muteLocalAudio(true)
并不会释放麦克风权限,而是继续发送码率极低的静音包。这对于需要云端录制的场景非常适用,因为 MP4 等格式的视频文件,对于音频数据的连续性要求很高,使用 stopLocalAudio 会导致录制出的 MP4 文件不易播放。// 打开麦克风mCloud.muteLocalAudio(false);// 关闭麦克风mCloud.muteLocalAudio(true);
// 打开麦克风[self.trtcCloud muteLocalAudio:NO];// 关闭麦克风[self.trtcCloud muteLocalAudio:YES];
// 打开麦克风[self.trtcCloud muteLocalAudio:NO];// 关闭麦克风[self.trtcCloud muteLocalAudio:YES];
// 打开麦克风trtc_cloud_->muteLocalAudio(false);// 关闭麦克风trtc_cloud_->muteLocalAudio(true);
方式二:调用
startLocalAudio
/stopLocalAudio
// 打开麦克风 mCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);// 关闭麦克风mCloud.stopLocalAudio();
// 开启麦克风[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];// 关闭麦克风[self.trtcCloud stopLocalAudio];
// 开启麦克风[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];// 关闭麦克风[self.trtcCloud stopLocalAudio];
// 开启麦克风trtc_cloud_->startLocalAudio(TRTCAudioQualitySpeech);// 关闭麦克风trtc_cloud_->stopLocalAudio();
打开/关闭摄像头
方式一:调用 muteLocalVideo
该接口在指定 TRTC_VIDEO_STREAM_TYPE_BIG 时等效于
start/stopLocalPreview
这两个接口,但具有更好的响应速度。因为 start/stopLocalPreview
需要打开和关闭摄像头,而打开和关闭摄像头都是硬件设备相关的操作,非常耗时。相比之下,muteLocalVideo
只需要在软件层面对数据流进行暂停或者放行即可,因此效率更高,也更适合需要频繁打开关闭的场景。// 打开摄像头mCloud.muteLocalVideo(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, false);// 关闭摄像头mCloud.muteLocalVideo(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, true);
// 打开摄像头[self.trtcCloud muteLocalVideo:TRTCVideoStreamTypeBig mute:NO];// 关闭摄像头[self.trtcCloud muteLocalVideo:TRTCVideoStreamTypeBig mute:YES];
// 开启摄像头[self.trtcCloud muteLocalVideo:TRTCVideoStreamTypeBig mute:NO];// 关闭摄像头[self.trtcCloud muteLocalVideo:TRTCVideoStreamTypeBig mute:YES];
// 打开摄像头trtc_cloud_->muteLocalVideo(TRTCVideoStreamTypeBig, false);// 关闭摄像头trtc_cloud_->muteLocalVideo(TRTCVideoStreamTypeBig, true);
方式二:调用
startLocalPreview
/stopLocalPreview
// 打开摄像头TXCloudVideoView cameraVideo = findViewById(R.id.txcvv_main_local); mCloud.startLocalPreview(true, cameraVideo);// 关闭摄像头mCloud.stopLocalPreview();
// 打开摄像头[self.trtcCloud startLocalPreview:YES view:self.view];// 关闭摄像头[self.trtcCloud stopLocalPreview];
// 打开摄像头[self.trtcCloud startLocalPreview:YES view:self.view];// 关闭摄像头[self.trtcCloud stopLocalPreview];
// 打开摄像头trtc_cloud_->startLocalPreview(true, local_view);// 关闭摄像头trtc_cloud_->stopLocalPreview();
控制摄像头
切换前后置摄像头:对于移动端设备,可以调用
switchCamera
切换前后置摄像头。// 默认开启前置摄像头,切换为后置摄像头TXDeviceManager manager = mCloud.getDeviceManager();if(manager.isFrontCamera()) {manager.switchCamera(false);}// 切换为前置摄像头TXDeviceManager manager = mCloud.getDeviceManager();manager.switchCamera(true);
// 默认开启前置摄像头,切换为后置摄像头TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];if([deviceManager isFrontCamera]) {[deviceManager switchCamera:false];}// 切换为前置摄像头TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];[deviceManager switchCamera:true];
设置摄像头缩放倍数:对于移动端设备,可以调用
setCameraZoomRatio
设置摄像头的缩放倍数。TXDeviceManager deviceManager = mCloud.getDeviceManager();float msg = deviceManager.getCameraZoomMaxRatio(); // 获取摄像头的最大缩放倍数 deviceManager.setCameraZoomRatio(5); // 设置摄像头的缩放倍数为 5
TXDeviceManager *deviceManager = [self.trtcCloud getDeviceManager];float cameraZoomMaxRatio = [deviceManager getCameraZoomMaxRatio]; // 获取摄像头的最大缩放倍数[deviceManager setCameraZoomRatio:5]; // 设置摄像头的缩放倍数为 5
打开/关闭闪光灯
对于移动端设备,当开启后置摄像头后,可以调用
enableCameraTorch
开启/关闭闪光灯。// 切换后置摄像头时可开启闪光灯TXDeviceManager manager = mCloud.getDeviceManager();manager.enableCameraTorch(true);// 关闭闪光灯TXDeviceManager manager = mCloud.getDeviceManager();manager.enableCameraTorch(false);
// 切换后置摄像头时可开启闪光灯TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];if(![deviceManager isFrontCamera]) {[deviceManager enableCameraTorch:true];}// 关闭闪光灯TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];[deviceManager enableCameraTorch:false];
开启/关闭人脸聚焦
调用
isAutoFocusEnabled
可以查询当前移动端设备是否支持自动识别人脸位置,若返回结果为真,表示当前设备支持,此时调用enableCameraAutoFocus
可以开启人脸自动对焦功能。// 若设备支持自动识别人脸位置,开启自动对焦功能TXDeviceManager manager = mCloud.getDeviceManager();if (manager.isAutoFocusEnabled()) {manager.enableCameraAutoFocus(true);}// 关闭自动对焦功能TXDeviceManager manager = mCloud.getDeviceManager();manager.enableCameraAutoFocus(false);
// 若设备支持自动识别人脸位置,开启自动对焦功能TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];if([deviceManager isAutoFocusEnabled]) {[deviceManager enableCameraAutoFocus:true];}// 关闭自动对焦功能TXDeviceManager * deviceManager = [self.trtcCloud getDeviceManager];[deviceManager enableCameraAutoFocus:false];
静音后检测用户是否在说话
调用 enableAudioVolumeEvaluation 启用音量大小提示,开启此功能后,SDK 会在 TRTCCloudListener 中的 onUserVoiceVolume 回调中反馈本地或远端用户的音频音量评估信息,包括音量大小、人声检测、音频频谱等。
private TRTCCloud mCloud;mCloud = TRTCCloud.sharedInstance(getApplicationContext());mCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH); // 打开麦克风mCloud.muteLocalAudio(true); // 关闭麦克风// 创建新的 TRTC 实例,用来检测麦克风音量private TRTCCloud mNewCloud;mNewCloud = TRTCCloud.sharedInstance(getApplicationContext());mNewCloud.setListener(new TRTCCloudListener() {// 通过 onUserVoiceVolume 回调获得 mCloud 的音频音量评估信息 @Override public void onUserVoiceVolume(ArrayList<TRTCCloudDef.TRTCVolumeInfo> userVolumes, int totalVolume) { super.onUserVoiceVolume(userVolumes, totalVolume);// 在这里更新 UI,例如更新音柱的高度 } });// 设置 TRTCAudioVolumeEvaluateParams 参数TRTCCloudDef.TRTCAudioVolumeEvaluateParams audioVolumeEvaluateParams = new TRTCCloudDef.TRTCAudioVolumeEvaluateParams(); audioVolumeEvaluateParams.enablePitchCalculation = false; // 是否开启本地人声频率计算 audioVolumeEvaluateParams.enableSpectrumCalculation = false; // 是否开启声音频谱计算 audioVolumeEvaluateParams.enableVadDetection = false; // 是否开启本地人声检测 audioVolumeEvaluateParams.interval = 100; // 设置 onUserVoiceVolume 回调的触发间隔为 100 ms// 开启音量大小提示 mNewCloud.enableAudioVolumeEvaluation(true, audioVolumeEvaluateParams);
// AppDelegate.h@interface AppDelegate : UIResponder <UIApplicationDelegate, TRTCCloudDelegate> // 添加 TRTCCloudDelegate 接口声明@property (nonatomic, strong) TRTCCloud *trtcCloud; // 声明 trtcCloud 实例@property (nonatomic, strong) TRTCCloud *newTRTCCloud; // 声明 newTRTCCloud 实例// AppDelegate.m_trtcCloud = [TRTCCloud sharedInstance];_trtcCloud.delegate = self;[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech]; // 打开麦克风[self.trtcCloud muteLocalAudio:YES]; // 关闭麦克风// 初始化新的 TRTC 实例_newTRTCCloud = [TRTCCloud sharedInstance];_newTRTCCloud.delegate = self;// 设置 TRTCAudioVolumeEvaluateParams 参数TRTCAudioVolumeEvaluateParams *trtcAudioVolumeEvaluateParams = [[TRTCAudioVolumeEvaluateParams alloc] init];trtcAudioVolumeEvaluateParams.enablePitchCalculation = NO; // 是否开启本地人声频率计算trtcAudioVolumeEvaluateParams.enableSpectrumCalculation = NO; // 是否开启声音频谱计算trtcAudioVolumeEvaluateParams.enableVadDetection = NO; // 是否开启本地人声检测trtcAudioVolumeEvaluateParams.interval = 100; // 设置 onUserVoiceVolume 回调的触发间隔为 100 ms// 开启音量大小提示[self.newTRTCCloud enableAudioVolumeEvaluation:YES withParams:trtcAudioVolumeEvaluateParams];// 实现 TRTCCloudDelegate 回调方法- (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume {// 处理用户音量信息for (TRTCVolumeInfo *volumeInfo in userVolumes) {NSLog(@"User ID: %@, Volume: %ld", volumeInfo.userId, (long)volumeInfo.volume);// 在这里更新 UI,例如更新音柱的高度}}
// AppDelegate.h@interface AppDelegate : NSObject <NSApplicationDelegate, TRTCCloudDelegate> // 添加 TRTCCloudDelegate 接口声明@property (nonatomic, strong) TRTCCloud *trtcCloud; // 声明 trtcCloud 实例@property (nonatomic, strong) TRTCCloud *newTRTCCloud; // 声明 newTRTCCloud 实例// AppDelegate.m_trtcCloud = [TRTCCloud sharedInstance];_trtcCloud.delegate = self;[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech]; // 打开麦克风[self.trtcCloud muteLocalAudio:YES]; // 关闭麦克风// 初始化新的 TRTC 实例_newTRTCCloud = [TRTCCloud sharedInstance];_newTRTCCloud.delegate = self;// 设置 TRTCAudioVolumeEvaluateParams 参数TRTCAudioVolumeEvaluateParams *trtcAudioVolumeEvaluateParams = [[TRTCAudioVolumeEvaluateParams alloc] init];trtcAudioVolumeEvaluateParams.enablePitchCalculation = NO; // 是否开启本地人声频率计算trtcAudioVolumeEvaluateParams.enableSpectrumCalculation = NO; // 是否开启声音频谱计算trtcAudioVolumeEvaluateParams.enableVadDetection = NO; // 是否开启本地人声检测trtcAudioVolumeEvaluateParams.interval = 100; // 设置 onUserVoiceVolume 回调的触发间隔为 100 ms// 开启音量大小提示[self.newTRTCCloud enableAudioVolumeEvaluation:YES withParams:trtcAudioVolumeEvaluateParams];// 实现 TRTCCloudDelegate 回调方法- (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume {// 处理用户音量信息for (TRTCVolumeInfo *volumeInfo in userVolumes) {NSLog(@"User ID: %@, Volume: %ld", volumeInfo.userId, (long)volumeInfo.volume);// 在这里更新 UI,例如更新音柱的高度}}
// .h 文件public:ITRTCCloud* trtc_cloud_;ITRTCCloud* new_trtc_cloud;public:virtual void onUserVoiceVolume(TRTCVolumeInfo* userVolumes, uint32_t userVolumesCount, uint32_t totalVolume) override;// .cpp 文件trtc_cloud_ = getTRTCSharedInstance();trtc_cloud_ -> addCallback(this);trtc_cloud_ -> startLocalAudio(TRTCAudioQualitySpeech); // 打开麦克风trtc_cloud_ -> muteLocalAudio(true); // 关闭麦克风// 创建新的 TRTC 实例,用来检测麦克风音量new_trtc_cloud_ = getTRTCSharedInstance();new_trtc_cloud_ -> addCallback(this);TRTCAudioVolumeEvaluateParams trtcAudioVolumeEvaluteParams;trtcAudioVolumeEvaluateParams.enablePitchCalculation = false; // 是否开启本地人声频率计算trtcAudioVolumeEvaluateParams.enableSpectrumCalculation = false; // 是否开启声音频谱计算trtcAudioVolumeEvaluateParams.enableVadDetection = false; // 是否开启本地人声检测trtcAudioVolumeEvaluateParams.interval = 100; // 设置 onUserVoiceVolume 回调的触发间隔为 100 ms// 开启音量大小提示new_trtc_cloud_ -> enableAudioVolumeEvaluation(true, trtcAudioVolumeEvaluateParams);// 实现 TRTCCloudDelegate 回调方法,将 CLASSNAME 替换为自己的类名void CLASSNAME::onUserVoiceVolume(TRTCVolumeInfo* userVolumes, uint32_t userVolumesCount, uint32_t totalVolume) {// 在这里更新 UI,例如更新音柱的高度}
检测远端用户麦克风/摄像头状态
该功能通常用于确认某一远端用户麦克风和摄像头的开启/关闭状态。
假设当前存在 A 和 B 两个用户。
1. 当 A 成功进入房间后,此时 B 也成功进入该房间, A 将会收到 onRemoteUserEnterRoom 监听事件消息。
2. 此时,A 默认 B 尚未打开自己的麦克风或摄像头。
3. 当 A 收到来自 B 的 onUserAudioAvailable(userId, true) 或 onUserVideoAvailable(userId, true) 时,表示远端用户 B 已经发布了自己的音频/主路视频。
4. 当 A 收到来自 B 的 onUserAudioAvailable(userId, false) 或 onUserVideoAvailable(userId, false) 时,表示远端用户 B 已经取消发布了自己的音频/主路视频。
联系我们
如果有任何需要或者反馈,您可以联系:info_rtc@tencent.com。