华为云用户手册

  • 什么是LakeFormation 湖仓构建 (DataArts Lake Formation,简称LakeFormation)是企业级 数据湖 一站式构建服务。 在存算分离架构基础上提供数据湖元数据统一管理的可视化界面及API,兼容Hive元数据模型以及Ranger权限模型,支持对接 MapReduce服务 MRS )、 数据仓库 服务 GaussDB (DWS)、 数据湖探索 DLI )、 AI开发平台 ModelArts、 数据治理中心 DataArts Studio 等多种计算引擎及大数据云服务,使用户可以便捷高效地构建数据湖和运营相关业务,加速释放业务数据价值。 LakeFormation产品通过底层资源实现跨AZ部署及高可靠、弹性伸缩、元数据统一管理、元数据与文件目录联动授权、对接多计算引擎等功能,是一个Serverless服务。
  • 什么是区域和可用区 通常用区域和可用区来描述数据中心的位置,您可以在特定的区域、可用区创建资源。 区域(Region)指物理的数据中心。每个区域完全独立,这样可以实现一定程度的容错能力和稳定性。资源创建成功后不能更换区域。 可用区(AZ,Availability Zone)是同一区域内,电力和网络互相隔离的物理区域,一个可用区不受其他可用区故障的影响。一个区域内可以有多个可用区,不同可用区之间物理隔离,但内网互通,既保障了可用区的独立性,又提供了低价、低时延的网络连接。 图1 区域和可用区 目前,华为云已在全球多个地域开放云服务,您可以根据需求选择适合自己的区域和可用区。更多信息请参见华为云全球站点。
  • 如何获取AK/SK AK/SK(Access Key ID/Secret Access Key)即访问密钥,包含访问密钥ID(AK)和秘密访问密钥(SK)两部分,系统通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。 登录华为云管理控制台。 将鼠标移动到右上角用户名,在下拉列表中单击“我的凭证”。 在“我的凭证”页面中选择“访问密钥”。 单击“新增访问密钥”,进入“新增访问密钥”页面。 根据提示输入对应信息,单击“确定”,在弹出的提示页面单击“立即下载”。 下载成功后,打开凭证文件,获取AK/SK信息。 为保证访问密钥的安全,访问密钥仅在初次生成时自动下载,后续不可再次通过管理控制台界面获取。请在生成后妥善保管。
  • 什么是项目 云的每个区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以区域默认单位为项目进行授权, IAM 用户可以访问您账号中该区域的所有资源。 如果您希望进行更加精细的权限控制,可以在区域默认的项目中创建子项目,并在子项目中购买资源,然后以子项目为单位进行授权,使得IAM用户仅能访问特定子项目中的资源,使得资源的权限控制更加精确。 项目中的资源不能转移。
  • LakeFormation适用哪些场景 LakeFormation适用于以下场景: 数据湖建设和持续运营:数据湖建设和持续运营,是指数据湖的初始化建设及后续日常的海量元数据及权限管理,因此客户需要便捷高效的建设和管理方式。 多计算引擎共享元数据:多计算引擎共享元数据,是指客户的多种计算引擎(Hive、Spark等)均使用统一的元数据,最大化实现数据的共享,避免不必要的重复数据,更大程度释放业务数据价值。
  • 准备用户 如果您是第一次使用LakeFormation,请参考LakeFormation准备工作章节,完成用户创建并授权使用LakeFormation等准备工作。 本入门示例,是为了演示使用LakeFormation的全流程,用户还需提前完成以下准备工作: 已在IAM服务中创建用于授权的IAM业务用户、用户组,用户已关联至用户组。 已在OBS服务中创建一个并行文件系统,并在文件系统中创建用于映射数据表的文件夹。 已创建对接LakeFormation所需的相关委托。例如,如果执行MRS对接LakeFormation,则参考MRS准备工作创建相关委托等。
  • 约束说明 MRS对接LakeFormation前,需要注意以下约束限制: MRS集群和LakeFormation实例必须同在一个云账户下且属于同一个Region。 LakeFormation侧创建的接入客户端所在虚拟私有云,必须与MRS集群在同一虚拟私有云下。 MRS集群仅支持对接LakeFormation实例中名称为hive的Catalog。 MRS存量集群需要先完成元数据库和权限策略向LakeFormation实例上迁移,再配置对接。 如果需要迁移多个MRS集群中的元数据到同一个LakeFormation实例,MRS集群之间的Database名称不能重复。 MRS对接LakeFormation后,MRS组件功能约束限制: Hive暂不支持临时表功能。 Hive暂不支持跨集群的列加密表功能。 Hive WebHCat暂不支持对接LakeFormation。 Hive创建内表时如果表目录不为空,则禁止创建表。 Hudi表创建前,需要先在LakeFormation上添加Hudi表目录的路径授权,赋予OBS读写权限。 Hudi表不支持在LakeFormation管理面编辑表的字段,只能通过Hudi客户端增删改表的字段。 Flink读写Hudi场景下同步Hive表,仅支持使用hive_sync.mode=jdbc,不支持hms方式。 Spark使用小权限用户登录客户端创建数据库时,如果用户没有default库的OBS路径权限,将提示缺少权限,实际创建数据库成功。 MRS对接LakeFormation后,权限策略约束限制: 通过LakeFormation授权仅支持将LakeFormation角色作为授权主体,不支持IAM用户或IAM用户组作为授权主体。 PolicySync进程不会修改集群内RangerAdmin Hive模块的默认策略,默认策略仍然生效。 PolicySync进程启动后,会与LakeFormation实例的权限进行比对,删除LakeFormation上不存在的非默认策略,请先完成权限策略迁移到LakeFormation实例上。 RangerAdmin WebUI界面的Hive模块,禁止执行添加、删除权限非默认策略的操作,统一在LakeFormation实例的数据权限界面进行授权操作。 RangerAdmin WebUI界面的OBS模块,禁止执行添加、删除权限非默认策略的操作,统一在LakeFormation实例的数据权限界面进行OBS路径授权操作。 MRS集群取消对接LakeFormation后,RangerAdmin的非默认策略不会清理,需要人工进行清理。 Hive暂不支持Grant授权的SQL语句,需统一在LakeFormation实例的数据权限界面进行授权操作。 MRS暂不支持LakeFormation行过滤权限能力。
  • 功能描述 用户在入会前可通过调用enableTopThreeAudioMode切换为音频最大三方模式。 会中通过调用switchAudioMode(2)将音频切换为订阅模式。订阅模式下,本地用户必须通过主动订阅远端用户音频流,才可接收该用户音频。 会中通过调用switchAudioMode(3)将音频切换为最大三方模式。最大三方模式下,本地用户不需要单独主动订阅某个远端用户音频流,即可接收当前房间内声音最大的三个用户的音频。
  • 实现播放音乐文件 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 播放音乐文件 调用startAudioFile播放音乐文件,目前仅支持本端播放。 返回值为0,则说明调用成功,不为0则表示失败。 public void startAudio() { int ret = mHwRtcEngine.startAudioFile(audioFilePaths[currentFilePos], publish, cycle, replace); if (ret == 0) { // 成功 } else { // 失败 }} 设置音乐文件音量 调用adjustAudioFileVolume调整播放音量。 其中,progress取值范围为0 ~ 100。 public void setAudioVolume() { mHwRtcEngine.adjustAudioFileVolume(progress);} 获取音乐文件总时长 播放过程中,调用getAudioFileDuration获取音乐文件总时长,可用于刷新界面上的进度条。 public void refreshSeekBar() { int duration = mHwRtcEngine.getAudioFileDuration();// 刷新进度条} 获取音乐文件播放位置 播放过程中,调用getAudioFilePosition获取音乐文件当前播放位置,可用于刷新界面上的进度条。 public void refreshSeekBar() { int pos = mHwRtcEngine.getAudioFilePosition();// 刷新进度条} 设置音乐文件播放位置 播放过程中,调用setAudioFilePosition设置音乐文件播放位置,可用于跳转至对应播放位置。 public void seekTo() { mHwRtcEngine.setAudioFilePosition(pos);} 暂停播放音乐文件 播放过程中,调用pauseAudioFile暂停播放当前音乐文件。 public void pauseAudio() { mHwRtcEngine.pauseAudioFile();} 恢复播放暂停的音乐文件 暂停时,调用resumeAudioFile恢复播放当前音乐文件。 public void resumeAudio() { mHwRtcEngine.resumeAudioFile();} 停止播放音乐文件 播放过程中,调用stopAudioFile停止播放当前音乐文件。 public void stopAudio() { mHwRtcEngine.stopAudioFile();} 音乐文件播放结束回调 播放结束后,SDK会触发onAudioMixStateChangedNotify回调来通知上层应用。 @Overridepublic void onAudioMixStateChangedNotify(HRTCEnums.HRTCAudioFileState state, HRTCEnums.HRTCAudioFileReason reason, long value) { // 判断state,如果是HRTC_AUDIO_FILE_STOPPED,则表示收到音乐文件播放结束通知,可以刷新界面,比如恢复播放前初始界面状态。}
  • 实现过程 加入房间前调用主引擎的setExternalVideoCapture 加入房间前调用此接口打开视频自采集功能。一旦开启后,将无法切换。 //开启自采集功能[rtcEngine setExternalVideoCapture:YES]; 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 定时推送视频数据帧 加入房间成功回调后,上层应用需要定时调用pushExternalVideoFrame接口推送外部视频数据,每1/帧率调用一次。 //初始化一个HWRtcVideoFrame对象,参数以实际为主,传rtcEngineHWRtcVideoFrame *rtcVideoFrame = [[HWRtcVideoFrame alloc] init]; rtcVideoFrame.format =HWRtcVideoImageFormatYUV420P; rtcVideoFrame.width = width; rtcVideoFrame.height = height; rtcVideoFrame.data = data; rtcVideoFrame.dataLen = data.length; [_rtcEngine pushExternalVideoFrame:rtcVideoFrame];
  • 实现过程 加入房间前设置音频最大三方模式 入会前调用enableTopThreeAudioMode设置是否开启音频最大三方模式。true表示开启音频最大三方,false表示不开启。 示例代码如下: this.client.enableTopThreeAudioMode(true) 加入房间 参考接口调用流程中加入房间的时序图步骤。 设置音频最大三方音量值 调用setVolume4TopThree接口可以设置音频最大三方模式的音量值,取值范围为[0,100]。 示例代码如下: // volume:音量值let volume = 50this.client.setVolume4TopThree(volume) 开启/禁用音频最大三方模式的音轨 调用muteAudio4TopThree接口可以开启/禁用音频最大三方模式的音轨,true表示禁用音频最大三方模式的音轨,false表示开启音频最大三方模式的音轨。 示例代码如下: this.client.muteAudio4TopThree(true) 切换音频订阅模式/音频最大三方模式 调用switchAudioMode可以切换音频模式。 当调用switchAudioMode(2)时,表示当前为音频订阅模式;当调用switchAudioMode(3)时,表示当前为音频最大三方模式。 示例代码如下: this.client.switchAudioMode(2)this.client.switchAudioMode(3)
  • API 参考 playAudioClip setVolumeOfAudioClip getAudioClipDuration getAudioClipCurrentPosition setAudioClipPosition pauseAudioClip pauseAllAudioClips resumeAudioClip resumeAllAudioClips stopAudioClip stopAllAudioClips onAudioClipFinished
  • 实现过程 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 播放音乐文件 调用startAudioFile接口可以播放一个音乐文件。同一时刻只能播放一个音乐文件。 [rtcEngine startAudioFile:[[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:@""] publish:1 cycle:1 replace:0]; 设置音乐文件音量 音乐文件播放过程中,可以调用adjustAudioFileVolume设置音乐文件播放音量。 [rtcEngine adjustAudioFileVolume:50]; 获取音乐文件总时长和播放位置 音乐文件打开成功后,sdk会触发一次onAudioMixStateChangedNotify回调,传入state参数为HWRtcAudioFileOpenCompleted,此时可以调用getAudioFileDuration获取音乐文件总时长,可用以刷新界面进度条的总时长。 音乐文件在播放过程中,sdk每秒会触发一次onAudioMixStateChangedNotify回调,其中的state参数为HWRtcAudioFilePositionUpdate,value参数就是当前的音乐文件播放进度,以毫秒为单位,可以在此回调中刷新界面的播放进度条。 播放过程中也可以调用getAudioFileCurrentPosition获取音乐文件当前播放位置,可用于刷新界面的播放进度条。 - (void)onAudioMixStateChangedNotify:(HWRtcAudioFileState)state reason:(HWRtcAudioFileReason)reason value:(NSUInteger)value{ switch (reason) { case HWRtcAudioFileReasonNone: { switch (state) { case HWRtcAudioFileOpenCompleted: { //获取总时长,并刷新进度条 int mixDuration = [self.rtcEngine getAudioFileDuration]; } break; case HWRtcAudioFilePositionUpdate: { //使用value参数值刷新界面的播放进度条 } break; case HWRtcAudioFilePlaying: { //刷新界面 } break; case HWRtcAudioFilePaused: { //刷新界面 } break; case HWRtcAudioFileStopped: { //刷新界面 } break; default: break; } } break; default: { //错误信息提示 } break; }} 设置音乐文件播放位置 播放过程中可以调用setAudioFilePosition设置音乐文件播放位置,可用于通过拖动进度条改变音乐文件的播放位置。 [rtcEngine setAudioFilePosition:50]; 暂停播放音乐文件 调用pauseAudioFile接口可以暂停播放一个音乐文件。 [rtcEngine pauseAudioFile]; 恢复播放暂停的音乐文件 音乐文件暂停播放后,可以调用resumeAudioFile接口恢复播放。 [rtcEngine resumeAudioFile]; 停止播放音乐文件 调用stopAudioFile接口可以停止播放音乐文件。 [rtcEngine stopAudioFile]; 音乐文件播放结束回调 音乐文件播放结束后,sdk会触发onAudioMixStateChangedNotify回调来通知上层应用。 - (void)onAudioMixStateChangedNotify:(HWRtcAudioFileState)state reason:(HWRtcAudioFileReason)reason value:(NSUInteger)value{ //收到音乐文件播放结束的通知,可以刷新界面,比如恢复到播放前初始界面状态 if(state == HWRtcAudioFilePlayCompleted){ }}
  • 功能描述 音视频传输过程中,可以对采集到的音视频数据进行前处理和后处理,获取想要的播放效果。 对于有自行处理音视频数据需求的场景,HWRtcEngine SDK提供原始数据功能,您可以在将数据发送给编码器前进行前处理,对捕捉到的音频信号或视频帧进行修改,也可以在将数据发送给解码器后进行后处理,对接收到的音频信号或视频帧进行修改。 原始视频数据可以进行视频前处理,然后发送给远端。也可以进行视频后处理。
  • 实现原始视频数据(视频前后处理) 注册视频前后处理 获取mHwRtcEngine的MediaEngine对象,调用setVideoFrameObserver方法进行注册。 传入的参数是需要实现了IHRTCVideoFrameObserver的实例对象。 从回调中获取视频帧,并进行处理。 @Overridepublic void onVideoFrameCapture(HRTCVideoFrame hrtcVideoFrame) { // 原始视频回调,从接口回调中取到原始视频数据以作前处理}@Overridepublic void onVideoFrameRender(String s, HRTCVideoFrame hrtcVideoFrame) { // 原始视频数据处理后回调}@Overridepublic boolean requireCaptureVideoFrame() { // 是否需要开启前处理 return false;}@Overridepublic boolean requireRenderVideoFrame() { // 是否需要开启后处理 return false;} 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。
  • 实现过程 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 播放音效文件 调用playAudioClip接口可以播放一个音效文件。可以同时播放多个音效文件,不同音效文件用不同的soundId参数进行区别。 int soundId = 0; //音效文件ID[rtcEngine playAudioClip:soundId filePath: [[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:@""] loop:1 pitch:0.00 pan:0.00 gain:100 publish:1 startPos:0]; 设置音效文件音量 音效文件播放过程中,可以调用setVolumeOfAudioClip设置音效文件播放音量。 音量大小,范围为0-100。 int soundId = 0; //音效文件ID[rtcEngine setVolumeOfAudioClip:soundId volume:50]; 获取音效文件总时长 播放过程中可以调用getAudioClipDuration获取音效文件总时长,可用于刷新界面的播放进度条。 int soundId = 0; //音效文件IDint duration = [rtcEngine getAudioClipDuration: [[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:@""]];//根据当前总时长刷新界面进度条 获取音效文件播放位置 播放过程中可以调用getAudioClipCurrentPosition获取音效文件播放位置,可用于刷新界面的播放进度条。 int soundId = 0; //音效文件IDint pos = [rtcEngine getAudioClipCurrentPosition:soundId];//根据当前播放位置刷新界面进度条 设置音效文件播放位置 播放过程中可以调用setAudioClipPosition设置音效文件播放位置,可用于通过拖动进度条改变音效文件的播放位置。 int soundId = 0; //音效文件ID[rtcEngine setAudioClipPosition:soundId pos:50]; 暂停播放音效文件 调用pauseAudioClip接口可以暂停播放一个音效文件。调用pauseAllAudioClips暂停播放所有正在播放的音效文件。 int soundId = 0; //音效文件ID[rtcEngine pauseAudioClip:soundId]; 恢复播放暂停的音效文件 音频文件暂停播放后,可以调用resumeAudioClip接口可以恢复播放之前暂停的音效文件。或者调用resumeAllAudioClips恢复播放所有暂停的音效文件。 int soundId = 0; //音效文件ID[rtcEngine resumeAudioClip:soundId]; 停止播放音效文件 调用stopAudioClip接口停止播放一个音效文件,或者调用stopAllAudioClips接口停止播放所有音效文件。 int soundId = 0; //音效文件ID[rtcEngine stopAudioClip:soundId]; 音效文件播放结束回调 音效文件播放结束后,sdk会触发onAudioClipFinished回调通知上层应用。 - (void)onAudioClipFinished:(NSInteger)soundId{ //收到音效文件播放结束通知后,可以刷新界面,比如恢复播放前初始界面状态。}
  • 功能描述 音视频传输过程中,可以对采集到的音视频数据进行前处理和后处理,获取想要的播放效果。 对于有自行处理音视频数据需求的场景,HWRtcEngine SDK提供原始数据功能,您可以在将数据发送给编码器前进行前处理,对捕捉到的音频信号或视频帧进行修改,也可以在将数据发送给解码器后进行后处理,对接收到的音频信号或视频帧进行修改。 原始音频数据可以进行音频前处理,然后发送给远端。也可以进行音频后处理。
  • 注意事项 同一时间最多只能创建4个连接对象,每个连接对象对应的房间ID必须互不相同。 如果使用connection对象加入房间,则加入房间的房间ID不能和已创建连接对象对应的房间ID相同。 同一时间只能以一个JOINER角色加入某一个房间。如果本端在其他房间里的角色是HWRtcRoleJoiner,则需要调用该房间的ChangeUserRole方法将本端在该房间的角色切换为HWRtcRolePlayer后才能以HWRtcRoleJoiner跨入其他房间。如果本端用户是以HWRtcRolePlayer角色加入此跨房房间,则需要调用跨房连接的ChangeUserRole方法将本端的角色切换为HWRtcRoleJoiner后才能发送音频流和视频流。
  • 实现原始音频数据(音频前后处理) 注册音频前后处理 获取mHwRtcEngine的MediaEngine对象,调用setAudioFrameObserver方法进行注册。 传入的参数是需要实现了IHRTCAudioFrameObserver的实例对象。 从回调中获取音频帧,并进行处理。 @Overridepublic void onAudioFramePlayback(HRTCAudioFrame hrtcAudioFrame) { // 需要播放的音频数据回调,从接口回调中取到音频数据以作后处理}@Overridepublic void onAudioFrameMixed(HRTCAudioFrame hrtcAudioFrame) { // 全部音频混音数据回调,包含上下行所有通道}@Overridepublic void onAudioFrameRecord(HRTCAudioFrame hrtcAudioFrame) { // 音频采集原始数据回调,对音频数据的修改会发送到远端}@Overridepublic boolean requirePlaybackAudioFrame() { // 是否开启音频后处理 return false;}@Overridepublic boolean requireRecordAudioFrame() { // 是否开启音频前处理 return false;}@Overridepublic boolean requireMixedAudioFrame() { // 是否需要开启全部音频混音数据回调 return false;} 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。
  • 实现自定义视频渲染 加入房间前 加入房间前,调用setExternalVideoFrameOutputEnable开启视频自渲染。 public void openExternalVideoOutput() { mHwRtcEngine.setExternalVideoFrameOutputEnable(true, true, new HRTCImageBufferFormat(frameFormat, HRTC_VIDEO_IMAGE_BUFFER_BYTE_ARRAY));} 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 渲染远端视频流 加入房间后,可以通过在onRenderExternalVideoFrame回调中进行视频帧的渲染。 public void onRenderExternalVideoFrame(String roomId, HRTCEnums.HRTCMediaDirection direction, String userId, HRTCVideoFrame videoFrame) { // 渲染视频数据}
  • 实现过程 加入房间前调用主引擎的setExternalAudioCapture 加入房间前调用此接口打开自采集功能。 [_rtcEngine setExternalAudioCapture:YES sampleRate:16000 channels:1] 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 开启音频流发送 调用接口muteLocalAudio开启音频流发送。 [_rtcEngine muteLocalAudio:NO]; 定时推送音频数据帧 加入房间成功回调后,每隔10ms定时调用pushExternalAudioFrame接口推送外部音频数据。 音频输入数据大小:10 * sampleRate * channels * 16 / 8 / 1000 字节,其中的sampleRate和channels是前面调用的setExternalAudioCapture里传入的采样率和声道数参数。 // audioData 获取的音频数据 [_rtcEngine pushExternalAudioFrame: audioData]; 根据帧率循环调用pushExternalAudioFrame方法往SDK推送数据。 音频自渲染 暂不支持音频自渲染功能。
  • 概述 华为云 实时音视频 服务提供的云端录制回放功能适用于需要将音视频通话或互动直播过程进行录制和存储的业务场景。云端录制功能包含两种模式,如表1所示。 表1 云端录制模式 模式 说明 适用场景 单流录制 支持单流录制,可按用户进行录制。 支持自启动录制,开启后对房间内每一个流进行录制。 录制指定的媒体类型,支持仅录制音频、仅录制视频、同时录制音视频。 支持录制MP4、HLS文件,音频编码类型支持AAC。 支持获取回调消息中的播放URL进行回放,回调消息中的downloadurl字段为OBS播放地址,使用该URL播放将会在OBS中产生对应的下载流量或者带宽费用。 支持选择摄像头流或屏幕分享流。 支持指定分辨率大小。 在线课堂、 内容审核 等 合流录制 支持合流录制,可多路视频或多路音频、视频合流录制。 录制指定的媒体类型,支持仅录制音频、仅录制视频、同时录制音视频。 支持录制MP4、HLS文件,音频编码类型支持AAC。 设置音视频属性,支持设置音视频属性,如码率、分辨率、帧率等。 支持获取回调消息中的播放URL进行回放,回调消息中的downloadurl字段为OBS播放地址,使用该URL播放将会在OBS中产生对应的下载流量或者带宽费用。 连麦直播等 父主题: 云端录制与回放
  • 实现过程 加入房间前调用主引擎的setExternalAudioCapture 加入房间前调用此接口打开自采集功能。 [_rtcEngine setExternalAudioCapture:YES sampleRate:16000 channels:1] 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 开启音频流发送 调用接口muteLocalAudio开启音频流发送。 [_rtcEngine muteLocalAudio:NO]; 定时推送音频数据帧 加入房间成功回调后,每隔10ms定时调用pushExternalAudioFrame接口推送外部音频数据。 音频输入数据大小:10 * sampleRate * channels * 16 / 8 / 1000 字节,其中的sampleRate和channels是前面调用的setExternalAudioCapture里传入的采样率和声道数参数。 // audioData 获取的音频数据 [_rtcEngine pushExternalAudioFrame: audioData]; 根据帧率循环调用pushExternalAudioFrame方法往SDK推送数据。 音频自渲染 暂不支持音频自渲染功能。
  • 注意事项 同一时间最多只能创建4个连接对象,每个连接对象对应的房间ID必须互不相同。 如果使用connection对象加入房间,则加入房间的房间ID不能和已创建连接对象对应的房间ID相同。 同一时间只能以一个JOINER角色加入某一个房间。如果本端在其他房间里的角色是HWRtcRoleJoiner,则需要调用该房间的setUserRole方法将本端在该房间的角色切换为HWRtcRolePlayer后才能以HWRtcRoleJoiner跨入其他房间。如果本端用户是以HWRtcRolePlayer角色加入此跨房房间,则需要调用跨房连接的setUserRole方法将本端的角色切换为HWRtcRoleJoiner后才能发送音频流和视频流。
  • 实现过程 加入房间 参考接口调用流程中加入房间的时序图步骤加入主房间。 创建跨房连接 当收到远端用户加入房间后会触发connection:onRemoteUserOnline跨房回调,在该回调内用对应远端用户的跨房连接调用startRemoteStreamView方法设置远端窗口并开启收流。 示例代码如下: //创建跨房引擎,room id具有唯一性,不可重复,设置引擎代理HWRtcConnection *connection = [rtcEngine createConnection:@”room id”];connection.delegate = self; 调用跨房连接的joinRoom加入跨房房间 调用跨房连接的joinRoom接口加入房间,其中HWRtcUserInfo的signature鉴权签名字符串需要填入正确的计算值,计算方法请参考接入鉴权。 如果本端需要发送音频或者视频流给跨房房间里的远端用户,则用户的role参数需要设为HWRtcRoleJoiner,否则可以设为HWRtcRolePlayer,只收流不发流。 注意:不能同时以JOINER角色加入多个房间。 加入跨房房间成功后会收到跨房回调指针的onJoinRoomSuccess通知,加入房间失败会收到跨房回调指针的onJoinRoomFailure通知。 示例代码如下: //创建HWRtcUserInfo对象HWRtcJoinParam *joinRoomParam = [[HWRtcJoinParam alloc] init];joinRoomParam.autoSubscribeAudio = YES;joinRoomParam.autoSubscribeVideo = YES;joinRoomParam.userId = "userId";joinRoomParam.userName = "userName";joinRoomParam.authorization = authorization;//authorization:鉴权信息,具体生成方法请参见接入鉴权。与加入房间的authorization相同joinRoomParam.ctime = time;//与加入房间的time相同joinRoomParam.roomId = "roomId";joinRoomParam.userRole = HWRtcRolePlayer;joinRoomParam.sfuType = 0;joinRoomParam.scenario = 0;//通过跨房引擎进入房间[connection joinRoom:joinRoomParam]; 收远端用户的视频流 收到远端用户加入房间后会收到跨房回调connection:onRemoteUserOnline,可以调用该远端用户对应的跨房连接的startRemoteStreamView设置远端窗口并开启收流。 示例代码如下: //远端用户加入房间后会收到跨房回调- (void)connection:(HWRtcConnection *)connection onRemoteUserOnline:(NSString * _Nonnull)userId userName:(NSString * _Nonnull)userName{ //创建视频画布对象 HWRtcVideoCanvas *canvas = [[HWRtcVideoCanvas alloc] init]; canvas.uid = @”remote userId”; canvas.view = [[HWRtcView alloc] initWitFrame:(0,0,100,100)]; //设置远端窗口并开启收流 [connection startRemoteStreamView:canvas streamType:HWRtcStreamTypeHD disableAdjustRes:YES];} 退出跨房房间 跨房结束后,调用跨房连接的leaveRoom接口跨房房间。 示例代码如下: //退出跨房房间[connection leaveRoom];
  • 实现过程 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 播放音效文件 调用playAudioClip接口可以播放一个音效文件。可以同时播放多个音效文件,不同音效文件用不同的soundId参数进行区别。 int soundId = 0; //音效文件ID[rtcEngine playAudioClip:soundId filePath: [[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:@""] loop:1 pitch:0.00 pan:0.00 gain:100 publish:1 startPos:0]; 设置音效文件音量 音效文件播放过程中,可以调用setVolumeOfAudioClip设置音效文件播放音量。 音量大小,范围为0-100。 int soundId = 0; //音效文件ID[rtcEngine setVolumeOfAudioClip:soundId volume:50]; 获取音效文件总时长 播放过程中可以调用getAudioClipDuration获取音效文件总时长,可用于刷新界面的播放进度条。 int soundId = 0; //音效文件IDint duration = [rtcEngine getAudioClipDuration: [[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:@""]];//根据当前总时长刷新界面进度条 获取音效文件播放位置 播放过程中可以调用getAudioClipCurrentPosition获取音效文件播放位置,可用于刷新界面的播放进度条。 int soundId = 0; //音效文件IDint pos = [rtcEngine getAudioClipCurrentPosition:soundId];//根据当前播放位置刷新界面进度条 设置音效文件播放位置 播放过程中可以调用setAudioClipPosition设置音效文件播放位置,可用于通过拖动进度条改变音效文件的播放位置。 int soundId = 0; //音效文件ID[rtcEngine setAudioClipPosition:soundId pos:50]; 暂停播放音效文件 调用pauseAudioClip接口可以暂停播放一个音效文件。调用pauseAllAudioClips暂停播放所有正在播放的音效文件。 int soundId = 0; //音效文件ID[rtcEngine pauseAudioClip:soundId]; 恢复播放暂停的音效文件 音频文件暂停播放后,可以调用resumeAudioClip接口可以恢复播放之前暂停的音效文件。或者调用resumeAllAudioClips恢复播放所有暂停的音效文件。 int soundId = 0; //音效文件ID[rtcEngine resumeAudioClip:soundId]; 停止播放音效文件 调用stopAudioClip接口停止播放一个音效文件,或者调用stopAllAudioClips接口停止播放所有音效文件。 int soundId = 0; //音效文件ID[rtcEngine stopAudioClip:soundId]; 音效文件播放结束回调 音效文件播放结束后,sdk会触发onAudioClipFinished回调通知上层应用。 - (void)onAudioClipFinished:(NSInteger)soundId{ //收到音效文件播放结束通知后,可以刷新界面,比如恢复播放前初始界面状态。}
  • API 参考 playAudioClip setVolumeOfAudioClip getAudioClipDuration getAudioClipCurrentPosition setAudioClipPosition pauseAudioClip pauseAllAudioClips resumeAudioClip resumeAllAudioClips stopAudioClip stopAllAudioClips onAudioClipFinished
  • 实现加入多频道(跨房) 加入主房间 参考接口调用流程中加入房间的时序图步骤加入主房间。 创建跨房连接 加入主房间后调用createConnection创建跨房对象,并进行相关参数配置。 其中,HRTCEncryptionConfig需要进行一些参数配置,主要包括:cryptionMode、cryptionSec、suiteType public void setting() { mHwRtcConnection = mHwRtcEngine.createConnection(roomid, ((RtcApplication) getApplication()).getConnectionHandler());mHwRtcConnection.setEncryption(new HRTCEncryptionConfig());} 调用跨房连接 创建跨房对象后,调用joinRoom接口加入房间。 其中,HRTCJoinParam需要进行一些参数配置,主要包括:userId、username、 roomId public void joinRoom() { mHwRtcConnection.joinRoom(new HRTCJoinParam());} 加入房间成功后,会收到跨房成功回调onJoinRoomSuccess 加入房间失败后,会收到跨房失败回调onJoinRoomFailure 接收远端用户的视频流 当收到远端用户加入房间后,会触发onRemoteUserOnline回调,在回调内,对远端用户调用startRemoteStreamView设置远端窗口并开启收流。 @Overridepublic void onRemoteUserOnline(HRTCConnection conn, String userId, String userName) { mHwRtcConnection.startRemoteStreamView(userId, surface, type, !isRemoteAdaptive);} 退出跨房房间 跨房结束后,调用跨房对象的leaveRoom离开房间。 public void leaveRoom() { mHwRtcConnection.leaveRoom();}
  • 注意事项 同一时间最多只能创建4个连接对象,每个连接对象对应的房间ID必须互不相同。 如果使用connection对象加入房间,则加入房间的房间ID不能和已创建连接对象对应的房间ID相同。 同一时间只能以一个JOINER角色加入某一个房间。如果本端在其他房间里的角色是HWRtcRoleJoiner,则需要调用该房间的setUserRole方法将本端在该房间的角色切换为HWRtcRolePlayer后才能以HWRtcRoleJoiner跨入其他房间。如果本端用户是以HWRtcRolePlayer角色加入此跨房房间,则需要调用跨房连接的setUserRole方法将本端的角色切换为HWRtcRoleJoiner后才能发送音频流和视频流。
  • 实现过程 加入房间前开启视频自渲染 加入房间前调用接口setExternalVideoFrameOutputWithFormat 打开视频自渲染功能。 //开启远端或者本地的视频自渲染HwRtcImageBufferFormat * fileFormat = [[HwRtcImageBufferFormat alloc] init]; fileFormat.format = HWRtcVideoImageFormatYUV420P; fileFormat.bufferType = HWRtcVideoImageBufferByteArray; [rtcEngine setExternalVideoFrameOutputWithFormat:fileFormat remoteEnable:YES localEnable:YES]; 加入房间 参考接口调用流程中加入房间的时序图步骤加入房间。 渲染远端视频流 当远端用户加入房间后会触发onRemoteUserOnline回调,在该回调中使用startRemoteStreamView方法开启接收远端用户的视频流,如果不开启,无法渲染远端视频流。 //远端用户加入房间后触发的回调- (void)onRemoteUserOnline:(NSString * _Nonnull)roomId userId:(NSString * _Nonnull)userId userName:(NSString * _Nonnull)userName{//创建视频画布对象HWRtcVideoCanvas *canvas = [[HWRtcVideoCanvas alloc] init];canvas.uid = @”remote userId”;canvas.view = [[HWRtcView alloc] initWitFrame:(0,0,100,100)]; // 开启远端视频流接收 // @param remote 参考 HWRtcVideoCanvas // @param streamType 视频分辨率 / /@param disableAdjustRes: 禁用分辨率自适应,默认关闭。[rtcEngine startRemoteStreamView:canvas streamType:HWRtcStreamTypeHD disableAdjustRes:YES];} 触发回调 加入房间后sdk会根据前面的参数设置调用onRenderExternalVideoFrame回调函数上报本地和远端视频帧数据给上层应用处理。 //自渲染回调- (void)onRenderExternalVideoFrame:(NSString *_Nonnull)roomid meidaDirection:(HWRtcMediaDirection)meidaDirection videoFrame:(HWRtcVideoFrame * _Nonnull)videoFrame{//获取videoFrame,进行数据处理}
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全