安卓录屏保存成MP4

来源:互联网 发布:unity3d 室内灯光 编辑:程序博客网 时间:2024/05/17 22:06
/** * Created by leilu on 2017/12/25. */@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public class MyScreenActivity extends Activity {    private static final int REQUEST_CODE = 10;    private MediaProjectionManager mediaProjectionManager;    private MediaCodec mediaCodec;    private MediaMuxer mediaMuxer;    private VirtualDisplay virtualDisplay;    private int videoTrackIndex;    private boolean isRecording;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_my_screen);    }    public void start(View view) {        mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);        Intent intent = mediaProjectionManager.createScreenCaptureIntent();        startActivityForResult(intent, REQUEST_CODE);    }    public void stop(View view) {        isRecording = false;    }    @Override    protected void onActivityResult(int requestCode, final int resultCode, final Intent data) {        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {            new Thread(new Runnable() {                @Override                public void run() {                    startRecord(resultCode, data);                }            }).start();            moveTaskToBack(true);        }    }    private void startRecord(int resultCode, Intent data) {        MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);        Surface surface = init();        if (surface == null) {            throw new RuntimeException("不能录屏!");        }        virtualDisplay = mediaProjection.createVirtualDisplay(getClass().getName(), getScreenWidth(), getScreenHeight(), getResources().getDisplayMetrics().densityDpi                , DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, surface, null, null);        isRecording = true;        MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();        while (isRecording) {            int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 10000);            if (outputBufferIndex > 0) {                ByteBuffer byteBuffer = mediaCodec.getOutputBuffer(outputBufferIndex);                mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, bufferInfo);                mediaCodec.releaseOutputBuffer(outputBufferIndex, false);            } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {                resetOutputFormat();            }        }        release();    }    private void resetOutputFormat() {        MediaFormat mediaFormat = mediaCodec.getOutputFormat();        videoTrackIndex = mediaMuxer.addTrack(mediaFormat);        mediaMuxer.start();    }    private void release() {        if (mediaCodec != null) {            mediaCodec.stop();            mediaCodec.release();        }        if (virtualDisplay != null) {            virtualDisplay.release();        }        if (mediaMuxer != null) {            mediaMuxer.release();        }    }    private Surface init() {        Surface surface = null;        try {            MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, getScreenWidth(), getScreenHeight());            mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);            mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 96000);            mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);            mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);            mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);            mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);            mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);            surface = mediaCodec.createInputSurface();            mediaCodec.start();            mediaMuxer = new MediaMuxer("/sdcard/screen.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);        } catch (IOException e) {            e.printStackTrace();        }        return surface;    }    private int getScreenWidth() {        return getResources().getDisplayMetrics().widthPixels;    }    private int getScreenHeight() {        return getResources().getDisplayMetrics().heightPixels;    }}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老年人耳朵听力下降怎么办 感冒耳朵不通气怎么办 耳朵一边不通气怎么办 面包车油表不准怎么办 汽车油表针不准怎么办 新车油表不准怎么办 仪表盘油表不准怎么办 头发痒的厉害怎么办 牙痛引起耳朵痛怎么办 耳朵后面长疙瘩怎么办 脖子上长淋巴结怎么办 脖子上有淋巴结怎么办 孩子耳朵里面疼怎么办 孩子半夜耳朵疼怎么办 孩子说耳朵疼怎么办 小孩耳朵里面疼怎么办 孩子感冒耳朵疼怎么办 宝宝半夜耳朵疼怎么办 晚上小孩耳朵痛怎么办 怀孕了耳朵发炎怎么办 得了中耳炎怎么办%3f 深潜耳朵痛怎么办 潜水完了耳朵疼怎么办 潜水之后耳朵疼怎么办 潜水耳膜破了怎么办 潜水后耳朵疼怎么办 潜水以后耳朵痛怎么办 耳朵戴耳机痛怎么办 耳朵长期流脓怎么办呢 耳朵垂上边疼怎么办 儿童晚上耳朵痛怎么办 儿童感冒耳朵疼怎么办 耳朵里长粉刺怎么办 疖子疼的厉害怎么办 火疖子特别疼怎么办 耳朵有硬耳屎怎么办 青少年体毛旺盛怎么办 头发油脂分泌旺盛怎么办 耳朵里面有脓包怎么办 孩子颈部淋巴结肿大怎么办 小孩有淋巴结该怎么办