From 7923221a07a752b370f9592ef43e54531f110822 Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期三, 28 一月 2026 15:56:39 +0800
Subject: [PATCH] 1.usb录像加水印。 推流、录像都有水印;结束时也结束水印线程

---
 app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java   |   36 +++++++++++++++++
 app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java |   36 +++++++++++++++++
 2 files changed, 70 insertions(+), 2 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 6997f18..fb85f0f 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -15,6 +15,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
 import com.alivc.live.pusher.AlivcAudioAACProfileEnum;
@@ -150,6 +151,7 @@
         Timber.d("stopPush called");
         stopPushThread();
 //        stopAudioTransfer();
+        stopWaterMaskSchedule();
         releaseAlivcPusher();
         if (usbCamera != null) {
             usbCamera.stopCamera();
@@ -282,7 +284,15 @@
     private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
     private void setWaterMask() {
 
-        scheduledExecutorService.scheduleWithFixedDelay(() -> {
+        // 闃叉閲嶅 schedule锛坰tartPush 鍙兘琚娆¤皟鐢級
+        if (watermarkFuture != null && !watermarkFuture.isCancelled()) {
+            return;
+        }
+        if (scheduledExecutorService == null || scheduledExecutorService.isShutdown()) {
+            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+        }
+
+        watermarkFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
 
 
             if (pushStarted){
@@ -350,6 +360,28 @@
             }
 
         },1,1, TimeUnit.SECONDS);
+    }
+
+    private ScheduledFuture<?> watermarkFuture;
+
+    private void stopWaterMaskSchedule() {
+        try {
+            if (watermarkFuture != null) {
+                watermarkFuture.cancel(true);
+                watermarkFuture = null;
+            }
+        } catch (Throwable t) {
+            Timber.w(t, "cancel watermarkFuture failed");
+        }
+        try {
+            if (scheduledExecutorService != null && !scheduledExecutorService.isShutdown()) {
+                scheduledExecutorService.shutdownNow();
+            }
+        } catch (Throwable t) {
+            Timber.w(t, "shutdown watermark scheduledExecutorService failed");
+        } finally {
+            scheduledExecutorService = null;
+        }
     }
 
     private Handler mainHandler = new Handler(Looper.getMainLooper());
@@ -610,6 +642,8 @@
      * 閲婃斁闃块噷鎺ㄦ祦璧勬簮
      */
     private void releaseAlivcPusher() {
+        // 鍏滃簳锛氶槻姝㈠閮ㄦ病鏈夎蛋 stopPush
+        stopWaterMaskSchedule();
         // 绉婚櫎闅愯棌鐨� SurfaceView
         if (previewSurfaceView != null && windowManager != null) {
             try {
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 5b36a5e..b8f0b8a 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -28,6 +28,7 @@
 import java.util.Date;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -146,9 +147,18 @@
     int baseY = 20;
     int fontSize= 24;
     private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+    private ScheduledFuture<?> watermarkFuture;
     private void setWaterMask() {
 
-        scheduledExecutorService.scheduleWithFixedDelay(() -> {
+        // 闃叉閲嶅 schedule锛坰tartRecord 鍙兘琚娆¤皟鐢級
+        if (watermarkFuture != null && !watermarkFuture.isCancelled()) {
+            return;
+        }
+        if (scheduledExecutorService == null || scheduledExecutorService.isShutdown()) {
+            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+        }
+
+        watermarkFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
 
 
 
@@ -216,6 +226,26 @@
         },1,1, TimeUnit.SECONDS);
     }
 
+    private void stopWaterMaskSchedule() {
+        try {
+            if (watermarkFuture != null) {
+                watermarkFuture.cancel(true);
+                watermarkFuture = null;
+            }
+        } catch (Throwable t) {
+            Timber.w(t, "cancel watermarkFuture failed");
+        }
+        try {
+            if (scheduledExecutorService != null && !scheduledExecutorService.isShutdown()) {
+                scheduledExecutorService.shutdownNow();
+            }
+        } catch (Throwable t) {
+            Timber.w(t, "shutdown watermark scheduledExecutorService failed");
+        } finally {
+            scheduledExecutorService = null;
+        }
+    }
+
 
 
     /**
@@ -223,6 +253,8 @@
      */
     public void stopRecord() {
         Timber.d("stopRecord called");
+
+        stopWaterMaskSchedule();
         
         // 鍋滄闊抽绾跨▼
         if (audioThread != null) {
@@ -351,6 +383,8 @@
      * 閲婃斁璧勬簮
      */
     private void releaseResources() {
+        // 鍏滃簳锛氶槻姝㈠紓甯搁��鍑烘椂姘村嵃绾跨▼娉勯湶
+        stopWaterMaskSchedule();
         if (audioRecord != null) {
             try {
                 if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {

--
Gitblit v1.8.0