Video stuttering when using screen recording in android 7

Viewed 28

My device target is only android 7.1. and my camera is webcam ( usb camera - uvc).My video saved in SDCard (micro SDCard A1 3 XC I V30 - meaning at least can recoding HD video). When i playback my video that is suttering as per second, lagging Step 1: I'm using surfacetexture and show preview in screen

Step 2: Display text like timestamp in screen ( cause i don't know how to textoverlay in myvideo and saved it with the text, i can not find anything to do that with uvc camera.) So my method is display text in screen and recording anything in screen

private void displayDateTime(){

    Thread timeThread = new Thread(){
        @Override
        public void run() {
            try{
                while (!isInterrupted()){
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            long startTime = System.currentTimeMillis();
                            Date date = new Date(startTime);
                            SimpleDateFormat myFormat = new SimpleDateFormat("HH:mm:ss dd-MM-yyyy");
                            tv_dateCam1.setText(myFormat.format(date));
                            tv_dateCam2.setText(myFormat.format(date));
                            //show gps
                            ....
                          
                        }
                    });
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    timeThread.start();
}

Step 3: Recoding screen using mediarecoder and virtual display

 /* screen record */
public void initScreenRecord(){
    //DisplayMetrics A structure describing general information about a display,
    // such as its size, density, and font scaling
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    //densityDpi : the screen density expressed as dots-per-inch
    mScreenDensity = metrics.densityDpi;
    //init instance media recorder
    mMediaRecorder = new MediaRecorder();
    //
    mMediaProjectionManager =(MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);

    screenStart();

}
//status change
private void screenStart(){
    Log.d(TAG, "screenStart");
    if (isRecordScreen){
        initMediaRecord();
        recordScreen();
    }else {
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        stopScreenShare();
    }
}
//stat screen recording and create virtual display
private void recordScreen() {
    Log.d(TAG, "record screen");
    if (mMediaProjection == null){
        startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_SCREEN_CODE);
        return;
    }
    mVirtualDisplay = createVirtualDisplay();
    mMediaRecorder.start();
}
//recording screen stop
private void screenStop(){
    if (isRecordScreen){
        try {
            mMediaRecorder.stop();
            mMediaRecorder.reset();
            stopScreenShare();
            isRecordScreen = false;
            Log.d(TAG, "stop screen stop");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
private class MediaProjectionCallback extends MediaProjection.Callback{
    @Override
    public void onStop() {
        if (isRecordScreen){
            isRecordScreen = false;
            mMediaRecorder.stop();
            mMediaRecorder.reset();
            Log.d(TAG, "Callback recording stopped");
        }
        mMediaProjection = null;
        stopScreenShare();
    }
}
// create virtual display depending on device width / height
private VirtualDisplay createVirtualDisplay(){
    Log.d(TAG, "create Virtual Display");
    return mMediaProjection.createVirtualDisplay("ScreenRecord",SCREEN_WIDTH, SCREEN_HEIGHT,
            mScreenDensity,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
            mMediaRecorder.getSurface(), null, null);
}

private void reScreenRecord(){
    Log.d(TAG, "reRecording");
    mMediaRecorder.start();
}

private void initMediaRecord(){
    Log.d(TAG, "initMediaRecord");
    try {
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        String videoName = SDCard.getInstance().createVideoFileName();
        mMediaRecorder.setOutputFile(videoName);
        mMediaRecorder.setMaxDuration(TIME_RECORD*60000);

        mMediaRecorder.setVideoSize(SCREEN_WIDTH, SCREEN_HEIGHT);

        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

        /*
        // 1tr bitrate : 5' = 36,7mb
        3tr bitrate 5' = 100mb
        8tr bitrate
         */
        mMediaRecorder.setVideoEncodingBitRate(3000000);
        mMediaRecorder.setVideoFrameRate(1);
        /*
        /: change 30 to 16 : still stuttering
        6: look like 16
        remove frame rate setting: still bad
        1:
         */

        mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
            @Override
            public void onInfo(MediaRecorder mediaRecorder, int i, int i1) {

                if (i >= MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
                    Log.d(TAG,"max duration");

                    //check and delete oldest file
                    if (SDCard.getInstance().sdCardSpace() <=50000000L ) {
                        SDCard.getInstance().sortFile();
                    }
                    
                    mediaRecorder.stop();
                    mediaRecorder.reset();
                    stopScreenShare();
                    initMediaRecord();
                    recordScreen();
                }
            }
        });

        mMediaRecorder.prepare();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void stopScreenShare(){
    Log.d(TAG, "stop Screen Share");
    if (mVirtualDisplay == null){
        return;
    }
    mVirtualDisplay.release();
    //if use mediarecorder.release then cannot reuse again
    destroyMediaProjection();
}

private void destroyMediaProjection() {
    if (mMediaProjection != null){
        mMediaProjection.unregisterCallback(mMediaProjectionCallback);
        mMediaProjection.stop();
        mMediaProjection = null;
        isRecordScreen = false;
        Log.d(TAG, "Media projection stopped");
    }
}

I'm try remove display text, seem lagging little decrease but When i running by motorbike then video result still lagging. I dont know where is really bug: my code, my device, or my bad solution to insert to video. I'm new coder with android java . Some one can give me some resolves

0 Answers
Related