Skip to content

Front_Back_Switch

buliaoyin edited this page Apr 24, 2017 · 13 revisions

推流中前后台切换

在推流过程中可能会有主播切换到其他界面(onPause),然后再回来(onResume)继续直播的场景。
这个场景的处理是直播APP开发者所不能忽视的。

上述场景中,切后台的时间并不会很长,如果使用停止推流,返回后重新推流的方式并不合适, 因此SDK中提供了切后台也不会断流的处理方法。

v4.2.0之前版本的处理

  • 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版本开启后台正常推流功能

从v4.2.0开始,SDK支持切后台继续采集Camera数据并正常推流的特性,另外也保留了v4.1.1以来的特性,开发者可以继续采用4.1.1以来的处理方式。

如果需要支持app切后台后依然能够进行正常的Camera数据推流,可以参考以下的处理方式:

  1. 禁用切后台时重复最后一帧的功能

    mStreamer.setEnableRepeatLastFrame(false);
  2. 在onPause中将SDK设置为离屏推流模式

    mStreamer.setOffscreenPreview(mStreamer.getPreviewWidth(), mStreamer.getPreviewHeight());
  3. 在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数据
        mStreamer.setOffscreenPreview(mStreamer.getPreviewWidth(), mStreamer.getPreviewHeight());
    }
}
Clone this wiki locally