From 09de988e5f9223099f8a8e1f7f2b91b627ff839f Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期五, 30 一月 2026 15:12:41 +0800
Subject: [PATCH] P1 录像:132541_学员C_1_58.mp4 P2 录像:132642_学员C_2_60.mp4

---
 app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 114 insertions(+), 0 deletions(-)

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 0daac9e..bc4a807 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -6,6 +6,7 @@
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaFormat;
+import android.media.MediaMetadataRetriever;
 import android.media.MediaMuxer;
 import android.media.MediaRecorder;
 import android.text.TextUtils;
@@ -83,6 +84,9 @@
     
     // 褰曞埗寮�濮嬫椂闂达紙绾崇锛夛紝鐢ㄤ簬鏃堕棿鎴冲悓姝�
     private volatile long recordingStartTimeNs = 0;
+    
+    // 鍒氬畬鎴愮殑鏂囦欢锛堢敤浜庨噸鍛藉悕锛�
+    private File completedVideoFile;
     
     /**
      * 褰曞儚鍥炶皟鎺ュ彛
@@ -274,6 +278,13 @@
         
         stopRecordThread();
         releaseResources();
+        
+        // 閲嶅懡鍚嶅垰瀹屾垚鐨勬枃浠讹紙鍋滄褰曞儚鏃讹級
+        if (completedVideoFile != null) {
+            renameCompletedFile(completedVideoFile);
+            completedVideoFile = null;
+        }
+        
         if (usbCamera != null) {
             usbCamera.stopCamera();
         }
@@ -457,6 +468,11 @@
             mediaMuxer = null;
         }
         
+        // 淇濆瓨鍒氬畬鎴愮殑鏂囦欢璺緞锛岀敤浜庡悗缁噸鍛藉悕
+        if (currentVideoFile != null && currentVideoFile.exists()) {
+            completedVideoFile = currentVideoFile;
+        }
+        
         muxerStarted = false;
         videoTrackIndex = -1;
         audioTrackIndex = -1;
@@ -557,6 +573,12 @@
                         // 閲婃斁褰撳墠璧勬簮
                         releaseResources();
                         
+                        // 閲嶅懡鍚嶅垰瀹屾垚鐨勬枃浠�
+                        if (completedVideoFile != null) {
+                            renameCompletedFile(completedVideoFile);
+                            completedVideoFile = null;
+                        }
+                        
                         // 鍒濆鍖栨柊鐨勭紪鐮佸櫒鍜孧uxer
                         if (!initEncoderAndMuxer()) {
                             Timber.e("Failed to create new video file");
@@ -625,6 +647,13 @@
                 }
                 
                 releaseResources();
+                
+                // 閲嶅懡鍚嶅垰瀹屾垚鐨勬枃浠讹紙鍋滄褰曞儚鏃讹級
+                if (completedVideoFile != null) {
+                    renameCompletedFile(completedVideoFile);
+                    completedVideoFile = null;
+                }
+                
                 Timber.d("RecordThread ended");
             }
         }
@@ -699,6 +728,91 @@
     }
     
     /**
+     * 閲嶅懡鍚嶅畬鎴愮殑瑙嗛鏂囦欢
+     * 鏍煎紡锛欻Hmmss_瀛﹀憳鍚峗1鎴�2_鏃堕暱绉�.mp4
+     * 渚嬪锛�132541_瀛﹀憳C_1_58.mp4
+     */
+    private void renameCompletedFile(File originalFile) {
+        if (originalFile == null || !originalFile.exists()) {
+            Timber.w("鍘熷鏂囦欢涓嶅瓨鍦紝鏃犳硶閲嶅懡鍚�: %s", originalFile);
+            return;
+        }
+        
+        try {
+            // 1. 浠庡師鏂囦欢鍚嶆彁鍙栨椂鍒嗙锛堜緥濡傦細132541_P1.mp4 -> 132541锛�
+            String originalName = originalFile.getName();
+            String timePart = originalName;
+            // 绉婚櫎 .mp4 鎵╁睍鍚�
+            if (originalName.endsWith(".mp4")) {
+                timePart = originalName.substring(0, originalName.length() - 4);
+            }
+            // 绉婚櫎 _P1 鎴� _P2 鍚庣紑
+            if (timePart.endsWith("_P1") || timePart.endsWith("_P2")) {
+                timePart = timePart.substring(0, timePart.length() - 3);
+            }
+            
+            // 2. 鑾峰彇瀛﹀憳鍚嶅瓧
+            String studentName = GlobalData.getInstance().parseWaterMaskInfo("student", "鏃�", GlobalData.ShareType.STRING);
+            if (TextUtils.isEmpty(studentName) || "鏃�".equals(studentName)) {
+                studentName = "瀛﹀憳";
+            }
+            
+            // 3. 鑾峰彇 P1/P2锛�1 瀵瑰簲 P1锛�2 瀵瑰簲 P2锛�
+            int cameraId = (mediaArgu != null) ? mediaArgu.getUsbCameraId() : 1;
+            String cameraIdStr = String.valueOf(cameraId);
+            
+            // 4. 鑾峰彇瑙嗛鏃堕暱锛堢锛�
+            int durationSeconds = getVideoDuration(originalFile);
+            
+            // 5. 鏋勫缓鏂版枃浠跺悕锛欻Hmmss_瀛﹀憳鍚峗1鎴�2_鏃堕暱绉�.mp4
+            String newFileName = String.format("%s_%s_%s_%d.mp4", timePart, studentName, cameraIdStr, durationSeconds);
+            File newFile = new File(originalFile.getParent(), newFileName);
+            
+            // 6. 閲嶅懡鍚嶆枃浠�
+            if (originalFile.renameTo(newFile)) {
+                Timber.d("鏂囦欢閲嶅懡鍚嶆垚鍔�: %s -> %s", originalFile.getName(), newFileName);
+                // 鏇存柊鍥炶皟涓殑鏂囦欢鍚�
+
+                notifyCallback(2,0,newFileName);
+            } else {
+                Timber.e("鏂囦欢閲嶅懡鍚嶅け璐�: %s -> %s", originalFile.getName(), newFileName);
+            }
+        } catch (Exception e) {
+            Timber.e(e, "閲嶅懡鍚嶆枃浠舵椂鍙戠敓寮傚父: %s", originalFile.getName());
+        }
+    }
+    
+    /**
+     * 鑾峰彇瑙嗛鏂囦欢鏃堕暱锛堢锛�
+     */
+    private int getVideoDuration(File videoFile) {
+        MediaMetadataRetriever retriever = null;
+        try {
+            retriever = new MediaMetadataRetriever();
+            retriever.setDataSource(videoFile.getAbsolutePath());
+            String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
+            if (durationStr != null && !durationStr.isEmpty()) {
+                long durationMs = Long.parseLong(durationStr);
+                int durationSeconds = (int) (durationMs / 1000);
+                Timber.d("瑙嗛鏃堕暱: %d 绉�", durationSeconds);
+                return durationSeconds;
+            }
+        } catch (Exception e) {
+            Timber.e(e, "鑾峰彇瑙嗛鏃堕暱澶辫触锛屼娇鐢ㄩ粯璁ゅ��60绉�");
+        } finally {
+            if (retriever != null) {
+                try {
+                    retriever.release();
+                } catch (Exception e) {
+                    Timber.e(e, "閲婃斁 MediaMetadataRetriever 澶辫触");
+                }
+            }
+        }
+        // 濡傛灉鑾峰彇澶辫触锛岃繑鍥為粯璁ゅ��60绉�
+        return 60;
+    }
+    
+    /**
      * 妫�鏌ュ苟鍚姩Muxer
      * P1妯″紡锛氬綋瑙嗛鍜岄煶棰戣建閬撻兘鍑嗗濂芥椂鍚姩
      * P2妯″紡锛氬綋瑙嗛杞ㄩ亾鍑嗗濂芥椂鍗冲彲鍚姩锛堟棤闊抽杞ㄩ亾锛�

--
Gitblit v1.8.0