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