|
|
@ -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);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|