场景:当一个设备外放音乐,另一个手机/PC采集推流,对方播放出来的音质效果不好。
原因:音乐先被播放出来,就已经不是原声的音乐效果,如果再被手机采集进去,这个音乐声跟随噪音有可能会被降噪处理,同时,如果不是在手机的采集范围之内的话,这种效果很难保证效果
推荐:用我们的混音接口来混入背景音乐,这样音乐的数据是原声的,同时声音也不会经过处理,这样的效果是最好的。
作为观众进直播间,不需要用到麦克风,只需要播放音量,因此听到的声音音量是媒体音量,如正常手机播放音乐的音量一样。
当连麦后,用户从观众变为了主播,需要采集声音,此时就是双工的模式,即通话音量,如打电话一般。
原因: 手机的媒体音量和通话音量是有不同的音量的,如果两者的音量相差较大,就会感觉到进入直播间听到的声音和上麦后的声音 音量大小有区别,这是正常的;
处理:将手机音量调为一致即可。
原因: 系统的音频设备只有一个,当两个SDK切换的时候,如果一方SDK没有及时释放音频设备,或者是异步释放的话,另一方SDK刚启动音频设备,就会被前一方SDK释放掉了。
解决:首先要确保一方SDK释放完了,再去启动另一方SDK。 即构SDK提供音视频设备释放了的接口onAvEngineStop,在需要切换到另一方SDK的时候,先确认收到了这个接口回调,如果没有收到,先等待onAvEngineStop收到了之后再去切换SDK。
1、通过mediaplayer(媒体播放器)混入背景音乐的时候,可以通过接口 setVolume(int volume) 直接设定播放器的播放声音,和背景音乐音量
2、通过 setCaptureVolume(int volume) 接口,可以调节采集人声说话的声音大小
3、通过 setPlayVolume(int volume)接口,可以调节播放端拉流的声音大小
两个人太近时,声音是通过网络绕回来的,失真是一方面,网络延迟不可靠也是一方面。 啸叫是因为太近时噪音不断加强引发,如果按照啸叫模型去降噪,又会有模型不够准确的问题。 这块比较复杂,因为实际使用场景不会碰到,所以没做的那么复杂。
建议:主播直播的时候带耳机,或者主播和观众离远一点,比如2米左右。
原因:回声问题通常是由对方麦克风设备回采,导致这边听到了自己的声音。
解决:
硬件回声消除相关设置方法:消除的是系统声音或其他软件播放的声音
setAudioDeviceMode 接口, 需在 initsdk 前设置
//通话模式(voip),消除系统声音或其它软件播放出来的声音
ZEGOAPI_AUDIO_DEVICE_MODE_COMMUNICATION = 1,
软件回声消除:消除的是B回传的A的声音
enableAEC 设置为TRUE 建议在推流前设置
备注: iOS 默认不开启软件回声消除(enableAEC (因为IOS系统的回声消除做的比较好)
Android 是默认开启软件回声消除 (enableAEC) (因为安卓的系统回声消除做的相对没那么好,所以会默认也是开启软件回声消除)
但是由此引发一个问题,因为 iOS 系统无法区分使用耳机孔的(3.5mm的)是外置声卡还是耳机。如果此时使用耳机孔的是外置声卡,这样B采集的时候会采集到 A+BGM 的声音,再回给 A。
所以此时 iOS 端就需要使用到 enableAECWhenHeadsetDetected
的接口设置为 FALSE,表示耳机插入状态下不做回声消除。
Zego 的 SDK 默认是做了噪声抑制的,如果依然有噪声,可以检查:
Web 端和 App 端的音频编码格式不一样,请检查:
iOS 在 loginRoom
或者 logoutRoom
的时候收到系统的提示:
[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that running I/O.
All I/O should be stopped or paused prior to deactivating the audio session.
同时系统的背景音也被关闭了。
这是因为:
ZegoSDK 启动的时候,会抢占音频设备,ZegoSDK 释放的时候,会释放音频设备,如果此时这个应用正在使用其他的音频资源,比如播放背景音,就会收到系统的这个提示,此时背景音乐也可能会被关闭了。
在 initSDK 之前调用 setConfig
设置 AudioSession 的模式为 active 就可以解决。
对于 ZegoLiveRoom.framework:
NSString *config = [NSString stringWithFormat:@"%s=true",kZegoConfigKeepAudioSesionActive.UTF8String];
[ZegoLiveRoomApi setConfig:config];
对于 ZegoAudioRoom.framework:
NSString *config = [NSString stringWithFormat:@"%s=true", kZegoAudioRoomConfigKeepAudioSesionActive.UTF8String];
[ZegoAudioRoomApi setConfig:config];
系统开启了双声道采集和双声道编码,播放时会采用双声道播放。
如果采集时只采集了单声道,其他人也只能听到单声道,Windows 系统下可将麦克风采集端的声道数进行调整,如图所示将“2 通道”调整为“1 通道”。
如下介绍不同语音检测接口的几种使用场景:
enableVAD
接口开启语音活动检测功能和 enableDTX
接口开启离散音频包发送。两个接口配合使用,在关闭麦克风或者静音的状态下,达到推流中检测为静音的数据包不发送的功能。enableVAD
接口开启音浪回调检测 VAD,可在 onCaptureSoundLevelUpdate
回调中通过 vad 参数判断对应的流是否包含正常语音,以此来决定是否显示音量变化。setAudioVADStableStateCallback
接口设置检测语音状态的回调,再调用 enableCapturedAudioVADStableStateMonitor
接口开启采集后的音频数据语音状态检测(包括麦克风采集和外部音频采集,检测周期均为 3 秒)和 enableAudioPrepVADStableStateMonitor
接口开启音频外部预处理后的音频数据的语音状态检测(检测周期均为 3 秒)。enableCapturedAudioVADStableStateMonitor
和 enableAudioPrepVADStableStateMonitor
接口回调中 state 参数,判断检测的音频数据是噪声还是正常语音。联系我们
文档反馈