package com.laifeng.sopcastsdk.controller.video; import android.annotation.TargetApi; import android.content.Intent; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.Build; import android.view.Surface; import com.laifeng.sopcastsdk.configuration.VideoConfiguration; import com.laifeng.sopcastsdk.constant.SopCastConstant; import com.laifeng.sopcastsdk.controller.video.IVideoController; import com.laifeng.sopcastsdk.mediacodec.VideoMediaCodec; import com.laifeng.sopcastsdk.screen.ScreenRecordEncoder; import com.laifeng.sopcastsdk.utils.SopCastLog; import com.laifeng.sopcastsdk.video.OnVideoEncodeListener; import static android.os.Build.VERSION_CODES.LOLLIPOP; /** * @Title: ScreenVideoController * @Package com.laifeng.sopcastsdk.controller.video * @Description: * @Author Jim * @Date 2016/11/2 * @Time 下午2:20 * @Version */ @TargetApi(LOLLIPOP) public class ScreenVideoController implements IVideoController { private MediaProjectionManager mManager; private int resultCode; private Intent resultData; private VirtualDisplay mVirtualDisplay; private MediaProjection mMediaProjection; private VideoConfiguration mVideoConfiguration = VideoConfiguration.createDefault(); private ScreenRecordEncoder mEncoder; private OnVideoEncodeListener mListener; public ScreenVideoController (MediaProjectionManager manager, int resultCode, Intent resultData) { mManager = manager; this.resultCode = resultCode; this.resultData = resultData; } @Override public void start() { mEncoder = new ScreenRecordEncoder(mVideoConfiguration); Surface surface = mEncoder.getSurface(); mEncoder.start(); mEncoder.setOnVideoEncodeListener(mListener); mMediaProjection = mManager.getMediaProjection(resultCode, resultData); int width = VideoMediaCodec.getVideoSize(mVideoConfiguration.width); int height = VideoMediaCodec.getVideoSize(mVideoConfiguration.height); mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenRecoder", width, height, 1, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null); } @Override public void stop() { if(mEncoder != null) { mEncoder.setOnVideoEncodeListener(null); mEncoder.stop(); mEncoder = null; } if (mMediaProjection != null) { mMediaProjection.stop(); mMediaProjection = null; } if (mVirtualDisplay != null) { mVirtualDisplay.release(); mVirtualDisplay = null; } } @Override public void pause() { if(mEncoder != null) { mEncoder.setPause(true); } } @Override public void resume() { if(mEncoder != null) { mEncoder.setPause(false); } } @Override public boolean setVideoBps(int bps) { //重新设置硬编bps,在低于19的版本需要重启编码器 boolean result = false; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { //由于重启硬编编码器效果不好,此次不做处理 SopCastLog.d(SopCastConstant.TAG, "Bps need change, but MediaCodec do not support."); }else { if (mEncoder != null) { SopCastLog.d(SopCastConstant.TAG, "Bps change, current bps: " + bps); mEncoder.setRecorderBps(bps); result = true; } } return result; } @Override public void setVideoEncoderListener(OnVideoEncodeListener listener) { mListener = listener; } @Override public void setVideoConfiguration(VideoConfiguration configuration) { mVideoConfiguration = configuration; } }