功能描述

为保证通话或直播质量,我们推荐在进入频道前进行音视频设备测试,检测麦克风、摄像头等音视频设备能否正常工作。该功能对于有高质量要求的场景,如在线教育等,尤为适用。

实现方法

请确保你已经了解如何实现音视频通话互动直播

参考以下步骤测试音视频设备:

  • 选择以下一种方式测试音频设备:
    • 调用 startEchoTest 测试系统的音频设备(耳麦、扬声器等)和网络连接。
    • 调用 startRecordingDeviceTest 测试录音设备,调用 startPlaybackDeviceTest 测试音频播放设备。
    • 调用 startAudioDeviceLoopbackTest 测试音频设备回路(包括录音设备和音频播放设备)。
  • 调用 startDeviceTest 方法测试视频采集设备。
所有测试设备的方法都必须在加入频道之前调用。

语音通话测试

  • 用途:测试系统的音频设备(耳麦、扬声器等)和网络连接,是否正常工作。
  • 测试方法和原理:调用 startEchoTest,并使用该方法的 intervalInSeconds 参数设置返回测试结果的时间间隔;用户说话;SDK 在设定的时间间隔后,如果能正常播放该用户说的话,则说明音频设备及网络连接正常。
// 开启回声测试
rtcEngine.startEchoTest(10);

// 等待并检查是否可以听到自己的声音回放

// 停止测试
rtcEngine.stopEchoTest;

音频录制设备测试

  • 用途:测试本地音频录制设备,如麦克风,是否正常工作。
  • 测试方法及原理:调用 startRecordingDeviceTest;用户说话,如果录制设备正常工作,SDK 会触发 onAudioVolumeIndication 回调并报告音量信息。UID 为 0 表示本地音量。完成测试后,需调用 stopRecordingDeviceTest 停止录制设备测试。
// 枚举所有音频设备
AAudioDeviceManager* lpDeviceManager = new AAudioDeviceManager(lpRtcEngine);
IAudioDeviceCollection *lpRecordingDeviceCollection = (*lpDeviceManager)->enumerateRecordingDevices();

UINT lCount = (UINT) lpRecordingDeviceCollection->getCount();

CString strDeviceName;
CString strDeviceID;

for (UINT nIndex = 0; nIndex < lCount; nIndex++){
    int nRet = lpRecordingDeviceCollection->getDevice(nIndex, strDeviceName, strDeviceID);
    ...
}

// 选择一个音频采集设备
lpDeviceManager->setRecordingDevice(strDeviceID); // device ID chosen

// 实现音频音量回调接口
virtual void onAudioVolumeIndication(const AudioVolumeInfo* speakers, unsigned int speakerNumber, int totalVolume) {
        (void)speakers;
        (void)speakerNumber;
        (void)totalVolume;
    }

// 启用音频音量回调功能
rtcEngine.enableAudioVolumeIndication(1000, // 回调间隔,以毫秒为单位
    10 // 顺滑度
    );

// 开始音频采集设备测试
(*lpDeviceManager)->startRecordingDeviceTest(1000);

// 停止音频采集设备测试
(*lpDeviceManager)->stopRecordingDeviceTest();

音频播放设备测试

  • 用途:测试本地音频播放设备,如外放设备,是否正常工作。
  • 测试方法及原理:调用 startPlaybackDeviceTest,并指定播放的音频文件。如果能听到声音,则说明播放设备正常工作。完成测试后,需调用 stopPlaybackDeviceTest 停止播放设备测试。
AAudioDeviceManager* lpDeviceManager = new AAudioDeviceManager(lpRtcEngine);
IAudioDeviceCollection *lpPlaybackDeviceCollection = (*lpDeviceManager)->enumeratePlaybackDevices();

UINT lCount = (UINT) lpPlaybackDeviceCollection->getCount();

CString strDeviceName;
CString strDeviceID;

for (UINT nIndex = 0; nIndex < lCount; nIndex++){
    int nRet = lpPlaybackDeviceCollection->getDevice(nIndex, strDeviceName, strDeviceID);
    ...
}

// 选择一个音频播放设备
lpDeviceManager->setPlaybackDevice(strDeviceID); // device ID chosen

#ifdef UNICODE
    CHAR wdFilePath[MAX_PATH];
    ::WideCharToMultiByte(CP_UTF8, 0, filePath, -1, wdFilePath, MAX_PATH, NULL, NULL);
    (*lpDeviceManager)->startPlaybackDeviceTest(wdFilePath);
#else
    (*lpDeviceManager)->startPlaybackDeviceTest(filePath);
#endif


// 停止音频播放设备测试
(*lpDeviceManager)->stopPlaybackDeviceTest();

音频设备回路测试

  • 用途:测试本地音频设备回路是否正常工作。
  • 测试方法和原理:调用 startAudioDeviceLoopbackTest;用户说话,麦克风会采集本地讲话声音,然后用扬声器播放,同时 SDK 会在 onAudioVolumeIndication 回调中报告音量信息。UID 为 0 表示本地音量。完成测试后,需调用 stopAudioDeviceLoopbackTest 停止录制设备测试。

视频设备测试

  • 用途:测试本地视频设备,如摄像头和显示器,是否正常功能。
  • 测试方法及原理:调用 enableVideo 开启视频模块后,调用 startDeviceTest,并指定显示图像的窗口句柄,如果能看到本地采集的图像,则说明视频设备正常工作。完成测试后,需调用 stopDeviceTest 停止视频设备测试。
// 枚举所有视频采集设备
AVideoDeviceManager* lpDeviceManager = new AVideoDeviceManager(lpRtcEngine);
IVideoDeviceCollection *lpVideoDeviceCollection = (*lpDeviceManager)->enumerateVideoDevices();

UINT lCount = (UINT) lpVideoDeviceCollection->getCount();

CString strDeviceName;
CString strDeviceID;

for (UINT nIndex = 0; nIndex < lCount; nIndex++){
    int nRet = lpVideoDeviceCollection->getDevice(nIndex, strDeviceName, strDeviceID);
    ...
}

// 选择一个视频采集设备
lpDeviceManager->setDevice(strDeviceID); // device ID chosen

// 开始视频采集设备测试,如果正常的话,你将会看到画面预览
(*lpDeviceManager)->startDeviceTest(view); // pass a window handler to it

// 停止视频采集设备测试
(*lpDeviceManager)->stopDeviceTest();

API 参考

注意事项

  • 请确保进行测试时,相应的音视频设备没有被其他应用程序占用。
  • 测试结束后,请务必调用相应的 stop 方法停止测试,然后再调用 joinChannel 加入频道。