From 80f64ba7d38a4a4a2661be2e3828d4ec8af6097c Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期五, 06 二月 2026 16:28:54 +0800
Subject: [PATCH] 1.getVideoDuration 返回时长666的,录的文件有问题,删除(可能是processcamera返回-1)
---
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java | 232 ++++++++++++++++++++++++++--------------------
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java | 9 +
2 files changed, 137 insertions(+), 104 deletions(-)
diff --git a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
index 8b44b11..e6ca2bf 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -78,6 +78,9 @@
// 闊抽鎺ㄦ祦绾跨▼姹狅紙鍗曠嚎绋嬶級
private ExecutorService audioPushExecutor;
+ // 淇濇姢 alivcPusher / previewSurfaceView 绛夌敓鍛藉懆鏈燂紝閬垮厤 start/stop 骞跺彂瀵艰嚧 NPE
+ private final Object pusherLock = new Object();
+
/**
* 鎺ㄦ祦鍥炶皟鎺ュ彛
*/
@@ -162,131 +165,146 @@
* 鍋滄鎺ㄦ祦
*/
public void stopPush() {
- Timber.d("%s stopPush called", getCameraTag());
- stopPushThread();
-// stopAudioTransfer();
- stopWaterMaskSchedule();
- releaseAlivcPusher();
- if (usbCamera != null) {
- usbCamera.stopCamera();
+ // stop 鍚屾牱寮哄埗鍦ㄤ富绾跨▼涓茶鎵ц锛岄伩鍏嶄笌 init/setupListeners 骞跺彂
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ stopPushInternal();
+ } else {
+ mainHandler.post(this::stopPushInternal);
}
- pushStarted = false;
- notifyCallback(1, 4, "鎺ㄦ祦宸插仠姝�");
+ }
+
+ private void stopPushInternal() {
+ synchronized (pusherLock) {
+ Timber.d("%s stopPush called", getCameraTag());
+ stopPushThread();
+// stopAudioTransfer();
+ stopWaterMaskSchedule();
+ releaseAlivcPusherLocked();
+ if (usbCamera != null) {
+ usbCamera.stopCamera();
+ }
+ pushStarted = false;
+ notifyCallback(1, 4, "鎺ㄦ祦宸插仠姝�");
+ }
}
/**
* 鍒濆鍖栭樋閲屾帹娴�
*/
private void initAlivcPusher() {
- try {
- alivcLivePushConfig = new AlivcLivePushConfig();
+ synchronized (pusherLock) {
+ try {
+ alivcLivePushConfig = new AlivcLivePushConfig();
- // 鏍规嵁鍒嗚鲸鐜囪缃�
- setResolutionFromArray(resolutionArr);
+ // 鏍规嵁鍒嗚鲸鐜囪缃�
+ setResolutionFromArray(resolutionArr);
- // 寤鸿鐢ㄦ埛浣跨敤20fps
- alivcLivePushConfig.setFps(AlivcFpsEnum.FPS_20);
+ // 寤鸿鐢ㄦ埛浣跨敤20fps
+ alivcLivePushConfig.setFps(AlivcFpsEnum.FPS_20);
- // 鎵撳紑鐮佺巼鑷�傚簲
- alivcLivePushConfig.setEnableBitrateControl(true);
+ // 鎵撳紑鐮佺巼鑷�傚簲
+ alivcLivePushConfig.setEnableBitrateControl(true);
- // 璁剧疆妯睆鏂瑰悜
- alivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_LANDSCAPE_HOME_LEFT);
+ // 璁剧疆妯睆鏂瑰悜
+ alivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_LANDSCAPE_HOME_LEFT);
- // 璁剧疆闊抽缂栫爜妯″紡
- alivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
+ // 璁剧疆闊抽缂栫爜妯″紡
+ alivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
- // 璁剧疆鎽勫儚澶寸被鍨�
- alivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_BACK);
+ // 璁剧疆鎽勫儚澶寸被鍨�
+ alivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_BACK);
- // 璁剧疆瑙嗛缂栫爜妯″紡涓虹‖缂栫爜
- alivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
+ // 璁剧疆瑙嗛缂栫爜妯″紡涓虹‖缂栫爜
+ alivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
- // 鍏抽棴缇庨
- alivcLivePushConfig.setBeautyOn(false);
+ // 鍏抽棴缇庨
+ alivcLivePushConfig.setBeautyOn(false);
- // 娓呮櫚搴︿紭鍏堟ā寮�
- alivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST);
+ // 娓呮櫚搴︿紭鍏堟ā寮�
+ alivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST);
- // 璁剧疆鑷畾涔夋祦妯″紡
- alivcLivePushConfig.setExternMainStream(true);
- alivcLivePushConfig.setAlivcExternMainImageFormat(AlivcImageFormat.IMAGE_FORMAT_YUV420P);
+ // 璁剧疆鑷畾涔夋祦妯″紡
+ alivcLivePushConfig.setExternMainStream(true);
+ alivcLivePushConfig.setAlivcExternMainImageFormat(AlivcImageFormat.IMAGE_FORMAT_YUV420P);
- // 鍒濆鍖栨帹娴佸櫒
- alivcPusher = new AlivcLivePusher();
- alivcPusher.init(context.getApplicationContext(), alivcLivePushConfig);
- // 澶栭儴鑷畾涔夋祦妯″紡涓嬶紝鍚屾牱闇�瑕佸厛寮�鍚瑙堬紝璁╃姸鎬佷粠 INIT 杩涘叆 PREVIEWED
- // 鍒涘缓涓�涓殣钘忕殑 Window 鏉ユ壙杞� SurfaceView锛岀‘淇� Surface 鑳藉琚垱寤�
- windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
- previewSurfaceView = new SurfaceView(context.getApplicationContext());
+ // 鍒濆鍖栨帹娴佸櫒锛氬厛鐢ㄥ眬閮ㄥ彉閲忥紝閬垮厤涓�旇 stop 缃┖瀵艰嚧 setupListeners NPE
+ AlivcLivePusher localPusher = new AlivcLivePusher();
+ localPusher.init(context.getApplicationContext(), alivcLivePushConfig);
- // 鍦� SurfaceView 鐨� surfaceCreated 鍥炶皟涓啀鍚姩棰勮锛岀‘淇� Surface 宸茬粡鍒涘缓
- previewSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- try {
- Timber.d("%s previewSurfaceView surfaceCreated, startPreviewAysnc", getCameraTag());
- if (alivcPusher != null) {
- alivcPusher.startPreviewAysnc(previewSurfaceView);
+ // 澶栭儴鑷畾涔夋祦妯″紡涓嬶紝鍚屾牱闇�瑕佸厛寮�鍚瑙堬紝璁╃姸鎬佷粠 INIT 杩涘叆 PREVIEWED
+ // 鍒涘缓涓�涓殣钘忕殑 Window 鏉ユ壙杞� SurfaceView锛岀‘淇� Surface 鑳藉琚垱寤�
+ windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
+ previewSurfaceView = new SurfaceView(context.getApplicationContext());
+ // 鍦� SurfaceView 鐨� surfaceCreated 鍥炶皟涓啀鍚姩棰勮锛岀‘淇� Surface 宸茬粡鍒涘缓
+ previewSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ try {
+ Timber.d("%s previewSurfaceView surfaceCreated, startPreviewAysnc", getCameraTag());
+ synchronized (pusherLock) {
+ if (alivcPusher != null && previewSurfaceView != null) {
+ alivcPusher.startPreviewAysnc(previewSurfaceView);
-
- // 鍚姩鎽勫儚澶存暟鎹帹閫佺嚎绋�
- startPushThread();
- }
- } catch (Exception e) {
+ // 鍚姩鎽勫儚澶存暟鎹帹閫佺嚎绋�
+ startPushThread();
+ }
+ }
+ } catch (Exception e) {
Timber.e(e, "%s startPreviewAysnc in surfaceCreated failed", getCameraTag());
- notifyCallback(1, -3, "棰勮鍚姩澶辫触: " + e.getMessage());
+ notifyCallback(1, -3, "棰勮鍚姩澶辫触: " + e.getMessage());
+ }
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ Timber.d("previewSurfaceView surfaceChanged: %dx%d", width, height);
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Timber.d("previewSurfaceView surfaceDestroyed");
+ }
+ });
+
+ // 灏� SurfaceView 娣诲姞鍒伴殣钘忕殑 Window 涓紝杩欐牱 Surface 鎵嶄細琚垱寤�
+ WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+ 1, 1, // 1x1 鍍忕礌锛屽嚑涔庝笉鍙
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ android.graphics.PixelFormat.TRANSLUCENT
+ );
+ params.x = -1000; // 绉诲埌灞忓箷澶�
+ params.y = -1000;
+ params.alpha = 0.0f; // 瀹屽叏閫忔槑
+
+ try {
+ windowManager.addView(previewSurfaceView, params);
+ Timber.d("previewSurfaceView added to window");
+ } catch (Exception e) {
+ Timber.e(e, "Failed to add previewSurfaceView to window");
+ // 濡傛灉娣诲姞澶辫触锛屽皾璇曚娇鐢� TYPE_APPLICATION 绫诲瀷
+ params.type = WindowManager.LayoutParams.TYPE_APPLICATION;
+ try {
+ windowManager.addView(previewSurfaceView, params);
+ Timber.d("previewSurfaceView added to window with TYPE_APPLICATION");
+ } catch (Exception e2) {
+ Timber.e(e2, "Failed to add previewSurfaceView with TYPE_APPLICATION");
}
}
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- Timber.d("previewSurfaceView surfaceChanged: %dx%d", width, height);
- }
+ // 璁剧疆鐩戝惉鍣紙瀵瑰眬閮� pusher 鍏堢粦瀹氾級锛屾渶鍚庡啀鍙戝竷鍒板瓧娈�
+ setupListeners(localPusher);
+ alivcPusher = localPusher;
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- Timber.d("previewSurfaceView surfaceDestroyed");
- }
- });
-
- // 灏� SurfaceView 娣诲姞鍒伴殣钘忕殑 Window 涓紝杩欐牱 Surface 鎵嶄細琚垱寤�
- WindowManager.LayoutParams params = new WindowManager.LayoutParams(
- 1, 1, // 1x1 鍍忕礌锛屽嚑涔庝笉鍙
- WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
- android.graphics.PixelFormat.TRANSLUCENT
- );
- params.x = -1000; // 绉诲埌灞忓箷澶�
- params.y = -1000;
- params.alpha = 0.0f; // 瀹屽叏閫忔槑
-
- try {
- windowManager.addView(previewSurfaceView, params);
- Timber.d("previewSurfaceView added to window");
+ Timber.d("%s AlivcPusher initialized successfully", getCameraTag());
} catch (Exception e) {
- Timber.e(e, "Failed to add previewSurfaceView to window");
- // 濡傛灉娣诲姞澶辫触锛屽皾璇曚娇鐢� TYPE_APPLICATION 绫诲瀷
- params.type = WindowManager.LayoutParams.TYPE_APPLICATION;
- try {
- windowManager.addView(previewSurfaceView, params);
- Timber.d("previewSurfaceView added to window with TYPE_APPLICATION");
- } catch (Exception e2) {
- Timber.e(e2, "Failed to add previewSurfaceView with TYPE_APPLICATION");
- }
+ Timber.e(e, "%s Failed to initialize AlivcPusher", getCameraTag());
+ notifyCallback(1, -3, "鍒濆鍖栨帹娴丼DK澶辫触: " + e.getMessage());
}
-
- // 璁剧疆鐩戝惉鍣�
- setupListeners();
-
- Timber.d("%s AlivcPusher initialized successfully", getCameraTag());
- } catch (Exception e) {
- Timber.e(e, "%s Failed to initialize AlivcPusher", getCameraTag());
- notifyCallback(1, -3, "鍒濆鍖栨帹娴丼DK澶辫触: " + e.getMessage());
}
}
@@ -409,9 +427,13 @@
/**
* 璁剧疆鐩戝惉鍣�
*/
- private void setupListeners() {
+ private void setupListeners(AlivcLivePusher pusher) {
+ if (pusher == null) {
+ Timber.w("%s setupListeners skipped: pusher is null", getCameraTag());
+ return;
+ }
// 鎺ㄦ祦淇℃伅鐩戝惉鍣�
- alivcPusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
+ pusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
@Override
public void onPreviewStarted(AlivcLivePusher alivcLivePusher) {
Timber.d("%s onPreviewStarted", getCameraTag());
@@ -489,7 +511,7 @@
});
// 閿欒鐩戝惉鍣�
- alivcPusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
+ pusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
@Override
public void onSystemError(AlivcLivePusher alivcLivePusher, AlivcLivePushError alivcLivePushError) {
Timber.e("onSystemError: %s", alivcLivePushError.toString());
@@ -510,7 +532,7 @@
});
// 缃戠粶鐩戝惉鍣�
- alivcPusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
+ pusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
@Override
public void onNetworkPoor(AlivcLivePusher alivcLivePusher) {
Timber.w("onNetworkPoor");
@@ -672,6 +694,12 @@
* 閲婃斁闃块噷鎺ㄦ祦璧勬簮
*/
private void releaseAlivcPusher() {
+ synchronized (pusherLock) {
+ releaseAlivcPusherLocked();
+ }
+ }
+
+ private void releaseAlivcPusherLocked() {
// 鍏滃簳锛氶槻姝㈠閮ㄦ病鏈夎蛋 stopPush
stopWaterMaskSchedule();
// 绉婚櫎闅愯棌鐨� SurfaceView
@@ -691,7 +719,7 @@
Timber.d("褰撳墠鎺ㄦ祦鐘舵��: %s", stats != null ? stats.name() : "null");
if (stats != null && (stats == AlivcLivePushStats.PUSHED ||
- stats == AlivcLivePushStats.PREVIEWED)) {
+ stats == AlivcLivePushStats.PREVIEWED)) {
alivcPusher.stopPush();
}
alivcPusher.destroy();
diff --git a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
index b64cfd1..d476227 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -776,8 +776,13 @@
if (originalFile.renameTo(newFile)) {
Timber.d("鏂囦欢閲嶅懡鍚嶆垚鍔�: %s -> %s", originalFile.getName(), newFileName);
// 鏇存柊鍥炶皟涓殑鏂囦欢鍚�
+ if (durationSeconds==666){
+ Timber.i("褰曞埗閿欒锛屾鏂囦欢[%s]闇�瑕侀兘韪�",newFile.getAbsolutePath());
+ newFile.delete();
+ }else{
+ notifyCallback(2,0,newFileName);
+ }
- notifyCallback(2,0,newFileName);
} else {
Timber.e("鏂囦欢閲嶅懡鍚嶅け璐�: %s -> %s", originalFile.getName(), newFileName);
}
@@ -813,7 +818,7 @@
}
}
// 濡傛灉鑾峰彇澶辫触锛岃繑鍥為粯璁ゅ��60绉�
- return 60;
+ return 666;
}
/**
--
Gitblit v1.8.0