Dana
2025-12-02 8bc72ebc21e04e3d52f7250716c44d3104bfecfa
app/src/main/java/com/anyun/h264/MainActivity.kt
@@ -1,7 +1,7 @@
package com.anyun.h264
import android.os.Bundle
import timber.log.Timber
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
@@ -12,25 +12,29 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.anyun.h264.ui.theme.MyApplicationTheme
import timber.log.Timber
import java.io.File
class MainActivity : ComponentActivity() {
    private var h264Encoder: H264Encoder? = null
    private var transmitter: H264FileTransmitter? = null
    companion object{
        const val TAG ="MainActivity"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            var isRunning by remember { mutableStateOf(false) }
            MyApplicationTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    MainScreen(
                        modifier = Modifier.padding(innerPadding),
                        isRunning = isRunning,
                        onStartH264Click = {
                            val success = startH264Encoder()
                            val success = startFileTransmitter()
                            if (success) {
                                isRunning = true
                            }
@@ -44,40 +48,79 @@
            }
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        stopH264Encoder()
    }
    private fun startFileTransmitter():Boolean {
        if (transmitter != null) {
            Timber.w("H264Encoder is already running")
            return false
        }
        try {
            transmitter = H264FileTransmitter()
            Log.i(TAG,"startFileTransmitter")
            transmitter?.setServerAddress("192.168.16.138", 1078)
            transmitter?.setProtocolType(JT1076ProtocolHelper.PROTOCOL_TYPE_TCP) // 或 PROTOCOL_TYPE_UDP
            // 设置协议参数
            transmitter?.setProtocolParams("013120122580", 1.toByte())
            // 设置帧率(用于计算时间戳间隔)
            transmitter?.setFrameRate(25)
            // 初始化Socket
            if (transmitter?.initialize()==true) {
                // 开始传输文件
                transmitter?.transmitFile("/storage/emulated/0/Android/data/com.anyun.h264/files/h264_1764574451071.h264")
                return true
            }else{
                return false
            }
        } catch (e: Exception) {
            Timber.e(e, "Failed to start H264Encoder")
            transmitter = null
            return false
        }
    }
    private fun startH264Encoder(): Boolean {
        if (h264Encoder != null) {
            Timber.w("H264Encoder is already running")
            return false
        }
        try {
            // 创建编码器
            h264Encoder = H264Encoder()
            // 设置编码参数
            h264Encoder?.setEncoderParams(640, 480, 25, 2000000)
            // 设置输出文件(可选)
            val outputFile = File(getExternalFilesDir(null), "test2.h264")
            h264Encoder?.setOutputFile(outputFile.absolutePath)
            h264Encoder?.setEnableFileOutput(false) // 启用文件输出
            // 设置UDP服务器地址(可选)
//             h264Encoder?.setServerAddress("58.48.93.67", 11935)
            h264Encoder?.setEnableNetworkTransmission(true)
             h264Encoder?.setServerAddress("192.168.16.138", 1078)
             h264Encoder?.setProtocolParams("013120122580", 1)
            h264Encoder?.setServerAddress("192.168.16.138", 1078)
            h264Encoder?.setProtocolParams("013120122580", 1)
            // 初始化并启动
            val cameraIdRange = intArrayOf(1, 2)
            val resolution = intArrayOf(640, 480)
            if (h264Encoder?.initialize(cameraIdRange, null, resolution, false) == true) {
                h264Encoder?.start()
                Timber.d("H264Encoder started successfully")
@@ -94,7 +137,7 @@
            return false
        }
    }
    private fun stopH264Encoder() {
        h264Encoder?.let { encoder ->
            try {
@@ -126,9 +169,9 @@
            text = "H264 编码器",
            style = MaterialTheme.typography.headlineMedium
        )
        Spacer(modifier = Modifier.height(32.dp))
        Button(
            onClick = onStartH264Click,
            enabled = !isRunning,
@@ -138,9 +181,9 @@
        ) {
            Text("启动 H264")
        }
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = onStopH264Click,
            enabled = isRunning,
@@ -153,9 +196,9 @@
        ) {
            Text("停止 H264")
        }
        Spacer(modifier = Modifier.height(32.dp))
        if (isRunning) {
            Text(
                text = "编码器运行中...",