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