| | |
| | | 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 |
| | |
| | | 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 |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | 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") |
| | |
| | | return false |
| | | } |
| | | } |
| | | |
| | | |
| | | private fun stopH264Encoder() { |
| | | h264Encoder?.let { encoder -> |
| | | try { |
| | |
| | | text = "H264 编码器", |
| | | style = MaterialTheme.typography.headlineMedium |
| | | ) |
| | | |
| | | |
| | | Spacer(modifier = Modifier.height(32.dp)) |
| | | |
| | | |
| | | Button( |
| | | onClick = onStartH264Click, |
| | | enabled = !isRunning, |
| | |
| | | ) { |
| | | Text("启动 H264") |
| | | } |
| | | |
| | | |
| | | Spacer(modifier = Modifier.height(16.dp)) |
| | | |
| | | |
| | | Button( |
| | | onClick = onStopH264Click, |
| | | enabled = isRunning, |
| | |
| | | ) { |
| | | Text("停止 H264") |
| | | } |
| | | |
| | | |
| | | Spacer(modifier = Modifier.height(32.dp)) |
| | | |
| | | |
| | | if (isRunning) { |
| | | Text( |
| | | text = "编码器运行中...", |