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