修复OSD闪烁问题

serial
Matthew 1 year ago
parent 16af06d4fd
commit 8432db83ab

@ -52,6 +52,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.Semaphore;
public class Camera2VideoActivity extends AppCompatActivity { public class Camera2VideoActivity extends AppCompatActivity {
@ -94,6 +95,9 @@ public class Camera2VideoActivity extends AppCompatActivity {
private int mTimeMask = 0; private int mTimeMask = 0;
private int mStatusBarHeight = -1; private int mStatusBarHeight = -1;
private long mOsdTs = 0;
private Semaphore mOSDSemaphore = new Semaphore(0);
private Thread mOsdThread = null;
private static class OSD_ITEM private static class OSD_ITEM
{ {
@ -134,12 +138,17 @@ public class Camera2VideoActivity extends AppCompatActivity {
} }
// updateOSD(ts); // updateOSD(ts);
initOSD(ts); Bitmap bitmap = mBitmap;
mBitmap = null;
mOSDFilter.updateBitmap(bitmap);
mBitmap = Bitmap.createBitmap(mVideoWidth, mVideoHeight, Bitmap.Config.ARGB_8888);
mOsdTs = ts;
mOSDSemaphore.release();
mHandler.postDelayed(this, 1000 - ms); mHandler.postDelayed(this, 1000 - ms);
} }
}; };
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -261,6 +270,7 @@ public class Camera2VideoActivity extends AppCompatActivity {
mTimeMask |= TIME_MASK_RB_ML; mTimeMask |= TIME_MASK_RB_ML;
} }
} }
if (!TextUtils.isEmpty(mOSDLeftBottom)) { if (!TextUtils.isEmpty(mOSDLeftBottom)) {
mOSDLeftBottom = mOSDLeftBottom.replace("\r\n", "\n"); mOSDLeftBottom = mOSDLeftBottom.replace("\r\n", "\n");
mOSDLeftBottom = mOSDLeftBottom.replace("\n\r", "\n"); mOSDLeftBottom = mOSDLeftBottom.replace("\n\r", "\n");
@ -278,10 +288,42 @@ public class Camera2VideoActivity extends AppCompatActivity {
mHandler = new Handler(); mHandler = new Handler();
mOsdThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
mOSDSemaphore.acquire();
} catch (Exception ex) {
}
if (mOsdTs == -1) {
break;
}
updateOSD(mOsdTs);
}
}
});
mOsdThread.start();
mHandler.postDelayed(new Runnable() { mHandler.postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
mNextVideoAbsolutePath = getVideoFilePath(); mNextVideoAbsolutePath = getVideoFilePath();
if (mTimeMask != 0) {
long ts = System.currentTimeMillis();
long ms = ts % 1000;
initOSD(ts - ms);
mOsdTs = ts + 1000;
mOSDSemaphore.release();
mHandler.postDelayed(mTimerRunnable, 1000 - ms);
}
mGPUCameraRecorder.start(mNextVideoAbsolutePath); mGPUCameraRecorder.start(mNextVideoAbsolutePath);
} }
}, 200); }, 200);
@ -291,7 +333,7 @@ public class Camera2VideoActivity extends AppCompatActivity {
public void run() { public void run() {
mGPUCameraRecorder.stop(); mGPUCameraRecorder.stop();
} }
}, 200 + mDuration * 1000); }, 210 + mDuration * 1000);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} }
@ -644,6 +686,8 @@ public class Camera2VideoActivity extends AppCompatActivity {
mNextVideoAbsolutePath = getVideoFilePath(this); mNextVideoAbsolutePath = getVideoFilePath(this);
} }
mGPUCameraRecorder = new GPUCameraRecorderBuilder(this, mPreviewView) mGPUCameraRecorder = new GPUCameraRecorderBuilder(this, mPreviewView)
//.recordNoFilter(true) //.recordNoFilter(true)
.cameraRecordListener(new CameraRecordListener() { .cameraRecordListener(new CameraRecordListener() {
@ -655,6 +699,8 @@ public class Camera2VideoActivity extends AppCompatActivity {
@Override @Override
public void onRecordComplete() { public void onRecordComplete() {
mHandler.removeCallbacks(mTimerRunnable); mHandler.removeCallbacks(mTimerRunnable);
mOsdTs = -1;
mOSDSemaphore.release();
exportMp4ToGallery(getApplicationContext(), mNextVideoAbsolutePath); exportMp4ToGallery(getApplicationContext(), mNextVideoAbsolutePath);
broadcastVideoFile(true, mNextVideoAbsolutePath); broadcastVideoFile(true, mNextVideoAbsolutePath);
mHandler.postDelayed(new Runnable() { mHandler.postDelayed(new Runnable() {
@ -668,12 +714,7 @@ public class Camera2VideoActivity extends AppCompatActivity {
@Override @Override
public void onRecordStart() { public void onRecordStart() {
if (mTimeMask != 0) {
long ts = System.currentTimeMillis();
long ms = ts % 1000;
initOSD(ts - ms);
mHandler.postDelayed(mTimerRunnable, 1000 - ms);
}
} }

@ -9,7 +9,9 @@ import android.util.Log;
public class GlWatermarkFilter extends GlOverlayFilter { public class GlWatermarkFilter extends GlOverlayFilter {
private Object mLocker = new Object();
private Bitmap bitmap; private Bitmap bitmap;
private boolean invalidated = true;
private Position position = Position.LEFT_TOP; private Position position = Position.LEFT_TOP;
public GlWatermarkFilter(Bitmap bitmap) { public GlWatermarkFilter(Bitmap bitmap) {
@ -22,12 +24,28 @@ public class GlWatermarkFilter extends GlOverlayFilter {
this.position = position; this.position = position;
} }
public void updateBitmap(Bitmap bm) {
Bitmap oldBitmap = null;
synchronized (mLocker) {
invalidated = true;
oldBitmap = bitmap;
bitmap = bm;
}
if (oldBitmap != null) {
// oldBitmap.recycle();
}
}
@Override @Override
protected void drawCanvas(Canvas canvas) { protected void drawCanvas(Canvas canvas) {
synchronized (bitmap) { synchronized (mLocker) {
Log.d("OSD", "drawCanvas"); Log.d("OSD", "drawCanvas");
if (invalidated) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
canvas.drawBitmap(bitmap, null, canvas.getClipBounds(), null); canvas.drawBitmap(bitmap, null, canvas.getClipBounds(), null);
invalidated = false;
}
} }
/* /*

Loading…
Cancel
Save