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