2016年6月19日
现在直播越来越火,然而好的直播框架代码是很重要的,webrtc是谷歌开源的一个直播框架,集成简单功能较全,是一个较好的选择。
然而在直播开发过程中发现一个问题,就是webrtc直播的声音无法静音。在调节音量的的时候就能注意到,音量调节的图标并不是音乐媒体,而是通话的音频标志,通过看源码也发现,webrtc框架选用的就是通话的音频通道STREAM_VOICE_CALL;而因为通话音频通道的特殊性,是不允许将通话音频置为静音的(就是说音量值为0的时候仍然有声音输出),这也符合一般的使用思维(通话的时候静音意义不大)。
那么这时候该怎么解决这个问题呢?用户在看直播的时候希望静音这个需求是合理的,我选用的解决策略是:
1、设置音量调节监听,监听通话音量调节动作获取当前音量;
2、检测到一次或多次调音至0则直接暂停webrtc框架中的音频资源,调至0以上时再开启音频资源。
关键代码(其中mRoom和currentRemoteStream分别是webrtc框架中自带的ConferenceClient和RemoteStream类的实例化对象):
[java] view plain copy //TODO PRivate MyVolumeReceiver mVolumeReceiver = null; /** * 注册当音量发生变化时接收的广播 */ private void myRegisterReceiver() { mVolumeReceiver = new MyVolumeReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.media.VOLUME_CHANGED_ACTION"); registerReceiver(mVolumeReceiver, filter); } /** * 监听音量变化 */ private class MyVolumeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 检测是否调到最小音量,是的话直接暂停音频流 if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) { AudioManager audioManager = ((AudioManager) getSystemService(AUDIO_SERVICE)); int vol = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); if (vol==0) { mRoom.pauseAudio(currentRemoteStream, null); }else { mRoom.playAudio(currentRemoteStream, null); } } } }新闻热点
疑难解答