From 964db3e1a2d6e2ab277da1ffcb27064bd2776848 Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期一, 01 十二月 2025 14:53:03 +0800
Subject: [PATCH] 1.添加一个设置水印的aidl接口 2.h264Encoder 设置usbcamera加水印

---
 app/src/main/java/com/anyun/h264/H264EncodeService.java |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 111 insertions(+), 0 deletions(-)

diff --git a/app/src/main/java/com/anyun/h264/H264EncodeService.java b/app/src/main/java/com/anyun/h264/H264EncodeService.java
index 0f63836..9c535de 100644
--- a/app/src/main/java/com/anyun/h264/H264EncodeService.java
+++ b/app/src/main/java/com/anyun/h264/H264EncodeService.java
@@ -7,6 +7,7 @@
 import timber.log.Timber;
 
 import com.anyun.h264.model.ResourceInfo;
+import com.anyun.h264.model.WatermarkInfo;
 
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -29,6 +30,7 @@
     private H264Encoder h264Encoder;
     private H264FileTransmitter h264FileTransmitter; // H264鏂囦欢浼犺緭鍣�
     private String outputFileDirectory; // H264鏂囦欢杈撳嚭鐩綍
+    private WatermarkInfo currentWatermarkInfo; // 褰撳墠姘村嵃淇℃伅
     
     // 榛樿缂栫爜鍙傛暟
     private static final int DEFAULT_WIDTH = 640;
@@ -50,6 +52,11 @@
         @Override
         public List<ResourceInfo> getResourceList(String startTime, String endTime) throws RemoteException {
             return H264EncodeService.this.getResourceList(startTime, endTime);
+        }
+        
+        @Override
+        public void setWatermarkInfo(String watermarkInfo) throws RemoteException {
+            H264EncodeService.this.setWatermarkInfo(watermarkInfo);
         }
     };
     
@@ -259,6 +266,11 @@
             // 鍒濆鍖栧苟鍚姩锛堜娇鐢ㄩ厤缃腑鐨勫垎杈ㄧ巼锛�
             int[] resolution = {width, height};
             if (h264Encoder.initialize(DEFAULT_CAMERA_ID_RANGE, null, resolution, false)) {
+                // 搴旂敤宸蹭繚瀛樼殑姘村嵃淇℃伅锛堝鏋滄湁锛�
+                if (currentWatermarkInfo != null) {
+                    h264Encoder.setWatermarkInfo(currentWatermarkInfo);
+                    Timber.d("Applied saved watermark info to encoder");
+                }
                 h264Encoder.start();
                 Timber.d("File encode started successfully, output file: %s, resolution: %dx%d, framerate: %d", 
                         outputFile.getAbsolutePath(), width, height, framerate);
@@ -321,6 +333,11 @@
             // 鍒濆鍖栧苟鍚姩锛堜娇鐢ㄩ厤缃腑鐨勫垎杈ㄧ巼锛�
             int[] resolution = {width, height};
             if (h264Encoder.initialize(DEFAULT_CAMERA_ID_RANGE, null, resolution, false)) {
+                // 搴旂敤宸蹭繚瀛樼殑姘村嵃淇℃伅锛堝鏋滄湁锛�
+                if (currentWatermarkInfo != null) {
+                    h264Encoder.setWatermarkInfo(currentWatermarkInfo);
+                    Timber.d("Applied saved watermark info to encoder");
+                }
                 h264Encoder.start();
                 Timber.d("Network encode started successfully, server: %s:%d, resolution: %dx%d, framerate: %d", 
                         config.ip, config.port, width, height, framerate);
@@ -534,6 +551,100 @@
     }
     
     /**
+     * 璁剧疆姘村嵃淇℃伅
+     * @param watermarkInfoJson 姘村嵃淇℃伅JSON瀛楃涓诧紝鍖呭惈锛氳溅鐗�(plateNumber)銆佸鍛�(student)銆佹暀缁�(coach)銆�
+     *                          缁忓害(longitude)銆佺含搴�(latitude)銆侀┚鏍�(drivingSchool)銆佽溅閫�(speed)
+     *                          绀轰緥锛歿"plateNumber":"浜珹12345","student":"寮犱笁","coach":"鏉庡洓",
+     *                                "longitude":116.397128,"latitude":39.916527,"drivingSchool":"XX椹炬牎","speed":60.5}
+     */
+    private void setWatermarkInfo(String watermarkInfoJson) {
+        Timber.d("setWatermarkInfo called, watermarkInfoJson: %s", watermarkInfoJson);
+        
+        try {
+            if (watermarkInfoJson == null || watermarkInfoJson.trim().isEmpty()) {
+                Timber.w("Watermark info JSON is null or empty, clearing watermark");
+                currentWatermarkInfo = null;
+                // 濡傛灉缂栫爜鍣ㄦ鍦ㄨ繍琛岋紝娓呴櫎姘村嵃
+                if (h264Encoder != null) {
+                    h264Encoder.setWatermarkInfo(null);
+                }
+                return;
+            }
+            
+            // 瑙f瀽JSON
+            JSONObject json = new JSONObject(watermarkInfoJson);
+            WatermarkInfo watermarkInfo = new WatermarkInfo();
+            
+            // 瑙f瀽鍚勪釜瀛楁锛堜娇鐢� optString/optDouble 閬垮厤瀛楁涓嶅瓨鍦ㄦ椂鎶涘嚭寮傚父锛�
+            watermarkInfo.setPlateNumber(json.optString("plateNumber", null));
+            watermarkInfo.setStudent(json.optString("student", null));
+            watermarkInfo.setCoach(json.optString("coach", null));
+            
+            // 缁忓害鍜岀含搴﹀彲鑳芥槸鏁板瓧鎴栧瓧绗︿覆
+            if (json.has("longitude")) {
+                Object lonObj = json.get("longitude");
+                if (lonObj instanceof Number) {
+                    watermarkInfo.setLongitude(((Number) lonObj).doubleValue());
+                } else if (lonObj instanceof String) {
+                    try {
+                        watermarkInfo.setLongitude(Double.parseDouble((String) lonObj));
+                    } catch (NumberFormatException e) {
+                        Timber.w("Invalid longitude format: %s", lonObj);
+                    }
+                }
+            }
+            
+            if (json.has("latitude")) {
+                Object latObj = json.get("latitude");
+                if (latObj instanceof Number) {
+                    watermarkInfo.setLatitude(((Number) latObj).doubleValue());
+                } else if (latObj instanceof String) {
+                    try {
+                        watermarkInfo.setLatitude(Double.parseDouble((String) latObj));
+                    } catch (NumberFormatException e) {
+                        Timber.w("Invalid latitude format: %s", latObj);
+                    }
+                }
+            }
+            
+            watermarkInfo.setDrivingSchool(json.optString("drivingSchool", null));
+            
+            // 杞﹂�熷彲鑳芥槸鏁板瓧鎴栧瓧绗︿覆
+            if (json.has("speed")) {
+                Object speedObj = json.get("speed");
+                if (speedObj instanceof Number) {
+                    watermarkInfo.setSpeed(((Number) speedObj).doubleValue());
+                } else if (speedObj instanceof String) {
+                    try {
+                        watermarkInfo.setSpeed(Double.parseDouble((String) speedObj));
+                    } catch (NumberFormatException e) {
+                        Timber.w("Invalid speed format: %s", speedObj);
+                    }
+                }
+            }
+            
+            // 淇濆瓨姘村嵃淇℃伅
+            currentWatermarkInfo = watermarkInfo;
+            Timber.i("Watermark info parsed successfully: %s", watermarkInfo);
+            
+            // 濡傛灉缂栫爜鍣ㄦ鍦ㄨ繍琛岋紝绔嬪嵆搴旂敤姘村嵃
+            if (h264Encoder != null) {
+                h264Encoder.setWatermarkInfo(watermarkInfo);
+                Timber.d("Watermark applied to encoder");
+            } else {
+                Timber.d("Encoder not running, watermark will be applied when encoder starts");
+            }
+            
+        } catch (JSONException e) {
+            Timber.e(e, "Failed to parse watermark info JSON: %s", watermarkInfoJson);
+            currentWatermarkInfo = null;
+        } catch (Exception e) {
+            Timber.e(e, "Unexpected error setting watermark info");
+            currentWatermarkInfo = null;
+        }
+    }
+    
+    /**
      * 浠庢枃浠跺垱寤鸿祫婧愪俊鎭紙濡傛灉鏂囦欢鍦ㄦ椂闂磋寖鍥村唴锛�
      */
     private ResourceInfo createResourceInfoFromFile(File file, Date startDate, Date endDate) {

--
Gitblit v1.8.0