-
Notifications
You must be signed in to change notification settings - Fork 209
Front_Back_Switch
在推流过程中可能会有主播切换到其他界面(onPause),然后再回来(onResume)继续直播的场景。
这个场景的处理是直播APP开发者所不能忽视的。
上述场景中,切后台的时间并不会很长,如果使用停止推流,返回后重新推流的方式并不合适, 因此SDK中提供了切后台也不会断流的处理方法。
-
APP切到后台之后,无法继续传递采集的Camera数据,没有必要继续Camera的数据采集, 可以在onPause回调中停止Camera采集;
-
切后台之后,调用KSYStreamer的onPause接口,返回推流应用时调用KSYStreamer的onResume接口, 在这段时间内播放端会保留切后台前的最后一帧画面,声音正常播放;
-
v4.0.0-v4.0.4版本需要开发者手动将推流设置为纯音频模式;
-
v4.0.5-v4.1.0版本会自动进入纯音频推流模式;
-
v4.1.1及以后版本不会进入纯音频推流模式,而是通过重复发送最后一帧视频来实现后台不断流;
-
-
如果不希望在后台的时候继续采集MIC的音频数据,可以再将推流端设置为静音推流模式, 此时SDK会使用静音数据替代MIC采集的音频数据。
-
v4.1.1及以后版本则可以关闭音频采集,切换至DummyAudioCapture来产生静音数据;
-
-
在后台推流的过程中,App应在系统通知栏提示用户后台推流正在运行,防止有用户认为切后台就会停止推流。
public class CameraActivity extends Activity {
// ...
@Override
public void onResume() {
super.onResume();
// 一般可以在onResume中开启摄像头预览
mStreamer.startCameraPreview();
// 调用KSYStreamer的onResume接口
mStreamer.onResume();
// 如果onPause中切到了DummyAudio模块,可以在此恢复
mStreamer.setUseDummyAudioCapture(false);
}
@Override
public void onPause() {
super.onPause();
// 调用KSYStreamer的onPause接口
mStreamer.onPause();
// 一般在这里停止摄像头采集
mStreamer.stopCameraPreview();
// 如果希望App切后台后,停止录制主播端的声音,可以在此切换为DummyAudio采集,
// 该模块会代替mic采集模块产生静音数据,同时释放占用的mic资源
mStreamer.setUseDummyAudioCapture(true);
}
}
从v4.2.0开始,SDK支持切后台继续采集Camera数据并正常推流的特性,另外也保留了v4.1.1以来的特性,开发者可以继续采用4.1.1以来的处理方式。
如果需要支持app切后台后依然能够进行正常的Camera数据推流,可以参考以下的处理方式:
-
禁用切后台时重复最后一帧的功能
mStreamer.setEnableRepeatLastFrame(false);
-
在onPause中将SDK设置为离屏推流模式(v4.2.2及以上版本不再需要)
mStreamer.setOffscreenPreview(mStreamer.getPreviewWidth(), mStreamer.getPreviewHeight());
-
在onResume中重新设置预览View
mStreamer.setDisplayPreview(mCameraPreviewView);
public class CameraActivity extends Activity {
// ...
// 禁用切后台时重复最后一帧的功能
mStreamer.setEnableRepeatLastFrame(false);
// ...
@Override
public void onResume() {
super.onResume();
// 回到前台时,重新设置预览view
mStreamer.setDisplayPreview(mCameraPreviewView);
// 调用KSYStreamer的onResume接口
mStreamer.onResume();
}
@Override
public void onPause() {
super.onPause();
// 调用KSYStreamer的onPause接口
mStreamer.onPause();
// 切后台时,将SDK设置为离屏推流模式,继续采集camera数据(v4.2.2及以上版本不再需要)
mStreamer.setOffscreenPreview(mStreamer.getPreviewWidth(), mStreamer.getPreviewHeight());
}
}
从v4.2.4版本开始,SDK支持用背景图代替camera进行推流,对于App切后台,不方便继续camera直播的场景, 可以使用该功能,提示观众主播已暂时离开。
-
禁用切后台时重复最后一帧的功能
mStreamer.setEnableRepeatLastFrame(false);
-
在onPause中关闭camera采集,开启背景图采集(如果也不想采集声音,可以切换为DummyAudio采集模块)
@Override public void onPause() { super.onPause(); // 调用KSYStreamer的onPause接口 mStreamer.onPause(); // 停止摄像头采集 mStreamer.stopCameraPreview(); // 开启背景图采集 mStreamer.startImageCapture(mBgImagePath); // 如果希望App切后台后,停止录制主播端的声音,可以在此切换为DummyAudio采集, // 该模块会代替mic采集模块产生静音数据,同时释放占用的mic资源 mStreamer.setUseDummyAudioCapture(true); }
-
在onResume中恢复Camera推流
@Override public void onResume() { super.onResume(); // 停止背景图采集 mStreamer.stopImageCapture(); // 开启摄像头预览 mStreamer.startCameraPreview(); // 调用KSYStreamer的onResume接口 mStreamer.onResume(); // 如果onPause中切到了DummyAudio模块,可以在此恢复 mStreamer.setUseDummyAudioCapture(false); }