媒体设备管理

实时音视频(TRTC)需要在直播场景中支持对多种媒体设备进行控制,以满足用户直播过程中的多种需求,本文将介绍如何:

打开/关闭麦克风和摄像头

TRTC 提供了两种方式对麦克风/摄像头进行打开和关闭操作,均推荐采用第一种方式对麦克风/摄像头进行操作。

打开/关闭麦克风

方式一:调用 muteLocalAudio
该接口与 stopLocalAudio 不同,调用muteLocalAudio(true)并不会释放麦克风权限,而是继续发送码率极低的静音包。这对于需要云端录制的场景非常适用,因为 MP4 等格式的视频文件,对于音频数据的连续性要求很高,使用 stopLocalAudio 会导致录制出的 MP4 文件不易播放。
Android
iOS
Mac
Windows
// 打开麦克风
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
Android
iOS
Mac
Windows
// 打开麦克风 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 只需要在软件层面对数据流进行暂停或者放行即可,因此效率更高,也更适合需要频繁打开关闭的场景。
Android
iOS
Mac
Windows
// 打开摄像头
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
Android
iOS
Mac
Windows
// 打开摄像头
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切换前后置摄像头。
Android
iOS
// 默认开启前置摄像头,切换为后置摄像头
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设置摄像头的缩放倍数。
Android
iOS
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开启/关闭闪光灯。
Android
iOS
// 切换后置摄像头时可开启闪光灯
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可以开启人脸自动对焦功能。
Android
iOS
// 若设备支持自动识别人脸位置,开启自动对焦功能
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 回调中反馈本地或远端用户的音频音量评估信息,包括音量大小、人声检测、音频频谱等。
Android
iOS
Mac
Windows
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。