From 2d6583bf4c23cbb6209b01c0c6b27a7d3d87560b Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期三, 03 十二月 2025 13:47:23 +0800
Subject: [PATCH] 1.startTransFileMitter  可以传目录所有的文件

---
 app/src/main/java/com/anyun/h264/MainActivity.kt |  125 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 112 insertions(+), 13 deletions(-)

diff --git a/app/src/main/java/com/anyun/h264/MainActivity.kt b/app/src/main/java/com/anyun/h264/MainActivity.kt
index a71aa67..8091f40 100644
--- a/app/src/main/java/com/anyun/h264/MainActivity.kt
+++ b/app/src/main/java/com/anyun/h264/MainActivity.kt
@@ -1,6 +1,8 @@
 package com.anyun.h264
 
 import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
 import android.util.Log
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
@@ -11,6 +13,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
+import com.anyun.h264.H264FileTransmitter.OnTransmitProgressCallback
 import com.anyun.h264.ui.theme.MyApplicationTheme
 import timber.log.Timber
 import java.io.File
@@ -18,6 +21,9 @@
 class MainActivity : ComponentActivity() {
     private var h264Encoder: H264Encoder? = null
     private var transmitter: H264FileTransmitter? = null
+    private var fileList: List<File> = emptyList()
+    private var currentFileIndex: Int = 0
+    private val handler = Handler(Looper.getMainLooper())
     companion object{
         const val TAG ="MainActivity"
     }
@@ -34,13 +40,14 @@
                         modifier = Modifier.padding(innerPadding),
                         isRunning = isRunning,
                         onStartH264Click = {
-                            val success = startH264Encoder()
+                            val success = startFileTransmitter()
                             if (success) {
                                 isRunning = true
                             }
                         },
                         onStopH264Click = {
-                            stopH264Encoder()
+//                            stopH264Encoder()
+                            stopFileTransmitter()
                             isRunning = false
                         }
                     )
@@ -52,16 +59,37 @@
     override fun onDestroy() {
         super.onDestroy()
         stopH264Encoder()
+        stopFileTransmitter()
     }
 
     private fun startFileTransmitter():Boolean {
-
         if (transmitter != null) {
-            Timber.w("H264Encoder is already running")
+            Timber.w("FileTransmitter is already running")
             return false
         }
 
+        // 鑾峰彇鐩綍涓殑鎵�鏈� .h264 鏂囦欢
+        val directory = application.applicationContext.getExternalFilesDir(null)
+        Timber.i("瑙嗛鐩綍=${directory?.absolutePath}")
+        
+        if (directory?.isDirectory != true) {
+            Timber.e("Directory is not valid: ${directory?.absolutePath}")
+            return false
+        }
 
+        // 鑾峰彇鎵�鏈� .h264 鏂囦欢骞舵寜鏂囦欢鍚嶆帓搴�
+        fileList = directory.listFiles()
+            ?.filter { it.isFile && it.name.endsWith(".h264", ignoreCase = true) }
+            ?.sortedBy { it.name }
+            ?: emptyList()
+
+        if (fileList.isEmpty()) {
+            Timber.w("No .h264 files found in directory")
+            return false
+        }
+
+        Timber.i("Found ${fileList.size} .h264 files to transmit")
+        currentFileIndex = 0
 
         try {
             transmitter = H264FileTransmitter()
@@ -69,28 +97,99 @@
             transmitter?.setServerAddress("192.168.16.138", 1078)
             transmitter?.setProtocolType(JT1076ProtocolHelper.PROTOCOL_TYPE_TCP) // 鎴� PROTOCOL_TYPE_UDP
 
-
             // 璁剧疆鍗忚鍙傛暟
             transmitter?.setProtocolParams("013120122580", 1.toByte())
 
-
             // 璁剧疆甯х巼锛堢敤浜庤绠楁椂闂存埑闂撮殧锛�
             transmitter?.setFrameRate(25)
+            transmitter?.setOnTransmitProgressCallback(object : OnTransmitProgressCallback {
+                override fun onProgress(currentFrame: Int, totalFrames: Int) {
+                    val currentFile = if (currentFileIndex < fileList.size) fileList[currentFileIndex] else null
+                    Timber.d("Transmitting file ${currentFileIndex + 1}/${fileList.size}: ${currentFile?.name}, frame: $currentFrame")
+                }
 
+                override fun onComplete() {
+                    val currentFile = if (currentFileIndex < fileList.size) fileList[currentFileIndex] else null
+                    Timber.i("File transmission complete: ${currentFile?.name} (${currentFileIndex + 1}/${fileList.size})")
+                    
+                    // 浣跨敤 Handler 寤惰繜璋冪敤锛岀‘淇濆墠涓�涓枃浠剁殑浼犺緭鐘舵�佸凡閲嶇疆
+                    currentFileIndex++
+                    handler.postDelayed({
+                        transmitNextFile()
+                    }, 100) // 寤惰繜100ms锛岀‘淇濆墠涓�涓枃浠剁殑 finally 鍧楀凡鎵ц
+                }
+
+                override fun onError(error: String?) {
+                    val currentFile = if (currentFileIndex < fileList.size) fileList[currentFileIndex] else null
+                    Timber.e("File transmission error: ${currentFile?.name}, error: $error")
+                    
+                    // 鍗充娇鍑洪敊涔熺户缁紶杈撲笅涓�涓枃浠�
+                    // 浣跨敤 Handler 寤惰繜璋冪敤锛岀‘淇濆墠涓�涓枃浠剁殑浼犺緭鐘舵�佸凡閲嶇疆
+                    currentFileIndex++
+                    handler.postDelayed({
+                        transmitNextFile()
+                    }, 100) // 寤惰繜100ms锛岀‘淇濆墠涓�涓枃浠剁殑 finally 鍧楀凡鎵ц
+                }
+            })
 
             // 鍒濆鍖朣ocket
-            if (transmitter?.initialize()==true) {
-                // 寮�濮嬩紶杈撴枃浠�
-                transmitter?.transmitFile("/storage/emulated/0/Android/data/com.anyun.h264/files/h264_1764574451071.h264")
+            if (transmitter?.initialize() == true) {
+                // 寮�濮嬩紶杈撶涓�涓枃浠�
+                transmitNextFile()
                 return true
-            }else{
+            } else {
+                Timber.e("Failed to initialize transmitter")
+                transmitter = null
                 return false
             }
         } catch (e: Exception) {
-            Timber.e(e, "Failed to start H264Encoder")
+            Timber.e(e, "Failed to start FileTransmitter")
             transmitter = null
             return false
         }
+    }
+
+    /**
+     * 浼犺緭涓嬩竴涓枃浠�
+     */
+    private fun transmitNextFile() {
+        if (transmitter == null) {
+            Timber.w("Transmitter is null, cannot transmit next file")
+            return
+        }
+
+        if (currentFileIndex >= fileList.size) {
+            Timber.i("All files transmission complete! Total: ${fileList.size} files")
+            // 鎵�鏈夋枃浠朵紶杈撳畬鎴愶紝鍋滄浼犺緭鍣�
+            stopFileTransmitter()
+            return
+        }
+
+        val nextFile = fileList[currentFileIndex]
+        Timber.i("Starting transmission of file ${currentFileIndex + 1}/${fileList.size}: ${nextFile.name}")
+        
+        // 浼犺緭涓嬩竴涓枃浠�
+        transmitter?.transmitFile(nextFile.absolutePath)
+    }
+
+    /**
+     * 鍋滄鏂囦欢浼犺緭鍣�
+     */
+    private fun stopFileTransmitter() {
+        // 绉婚櫎鎵�鏈夊緟澶勭悊鐨� Handler 浠诲姟
+        handler.removeCallbacksAndMessages(null)
+        
+        transmitter?.let { tx ->
+            try {
+                tx.stop()
+                Timber.d("FileTransmitter stopped")
+            } catch (e: Exception) {
+                Timber.e(e, "Failed to stop FileTransmitter")
+            }
+        }
+        transmitter = null
+        fileList = emptyList()
+        currentFileIndex = 0
     }
 
     private fun startH264Encoder(): Boolean {
@@ -109,11 +208,11 @@
             // 璁剧疆杈撳嚭鏂囦欢锛堝彲閫夛級
             val outputFile = File(getExternalFilesDir(null), "test2.h264")
             h264Encoder?.setOutputFile(outputFile.absolutePath)
-            h264Encoder?.setEnableFileOutput(false) // 鍚敤鏂囦欢杈撳嚭
+            h264Encoder?.setEnableFileOutput(true) // 鍚敤鏂囦欢杈撳嚭
 
             // 璁剧疆UDP鏈嶅姟鍣ㄥ湴鍧�锛堝彲閫夛級
 //             h264Encoder?.setServerAddress("58.48.93.67", 11935)
-            h264Encoder?.setEnableNetworkTransmission(true)
+            h264Encoder?.setEnableNetworkTransmission(false)
             h264Encoder?.setServerAddress("192.168.16.138", 1078)
             h264Encoder?.setProtocolParams("013120122580", 1)
 

--
Gitblit v1.8.0