Dana
2025-11-30 d6cc9656d2677b353cf88d296ddab4f6cfec8482
1.控制位,控制是否网络传输
2个文件已修改
38 ■■■■ 已修改文件
app/src/main/java/com/anyun/h264/H264Encoder.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/anyun/h264/MainActivity.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/anyun/h264/H264Encoder.java
@@ -34,6 +34,7 @@
 * // 设置UDP服务器地址(可选)
 * encoder.setServerAddress("192.168.1.100", 8888);
 * encoder.setProtocolParams("123456789012", (byte)1);
 * encoder.setEnableNetworkTransmission(true); // 启用TCP/UDP网络传输,false表示禁用
 *
 * // 初始化并启动
 * int[] cameraIdRange = {0, 0};
@@ -73,6 +74,9 @@
    private String outputFilePath;
    private boolean enableFileOutput = false; // 是否启用文件输出
    private boolean spsPpsWritten = false; // 标记SPS/PPS是否已写入
    // 网络传输控制
    private boolean enableNetworkTransmission = true; // 是否启用TCP/UDP网络传输
    // 编码回调
    public interface OnFrameEncodedCallback {
@@ -134,6 +138,15 @@
    }
    /**
     * 设置是否启用TCP/UDP网络传输
     * @param enable true表示启用网络传输,false表示禁用
     */
    public void setEnableNetworkTransmission(boolean enable) {
        this.enableNetworkTransmission = enable;
        Log.d(TAG, "Network transmission " + (enable ? "enabled" : "disabled"));
    }
    /**
     * 初始化摄像头和编码器
     */
    public boolean initialize(int[] cameraIdRange, String cameraName, int[] resolution, boolean ayCamera) {
@@ -180,8 +193,13 @@
            initEncoder();
            // 4. 初始化Socket(UDP或TCP,根据协议类型自动选择)
            if (!protocolHelper.initializeSocket()) {
                return false;
            // 只有在启用网络传输时才初始化Socket
            if (enableNetworkTransmission) {
                if (!protocolHelper.initializeSocket()) {
                    return false;
                }
            } else {
                Log.d(TAG, "Network transmission disabled, skipping socket initialization");
            }
            // 5. 初始化文件输出(仅创建文件,SPS/PPS在第一次输出时写入)
@@ -398,11 +416,9 @@
            int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 0);
            while (outputBufferIndex >= 0) {
                ByteBuffer outputBuffer = encoder.getOutputBuffer(outputBufferIndex);
                Log.i(TAG,"1111");
                if (outputBuffer != null && bufferInfo.size > 0) {
                    // 检查是否为关键帧
                    boolean isKeyFrame = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0;
                    Log.i(TAG,"2222");
                    // 复制编码数据
                    byte[] encodedData = new byte[bufferInfo.size];
                    outputBuffer.position(bufferInfo.offset);
@@ -463,6 +479,11 @@
     * 发送编码后的数据(按JT/T 1076-2016协议打包)
     */
    private void sendEncodedData(byte[] data, long timestamp, boolean isKeyFrame) {
        // 如果未启用网络传输,直接返回
        if (!enableNetworkTransmission) {
            return;
        }
        try {
            // 计算时间间隔
            long currentTime = System.currentTimeMillis();
@@ -550,7 +571,8 @@
        }
        // 关闭Socket(UDP或TCP,根据协议类型自动选择)
        if (protocolHelper != null) {
        // 只有在启用网络传输时才需要关闭Socket
        if (enableNetworkTransmission && protocolHelper != null) {
            protocolHelper.closeSocket();
        }
app/src/main/java/com/anyun/h264/MainActivity.kt
@@ -66,10 +66,12 @@
            // 设置输出文件(可选)
            val outputFile = File(getExternalFilesDir(null), "test.h264")
            h264Encoder?.setOutputFile(outputFile.absolutePath)
            h264Encoder?.setEnableFileOutput(false) // 启用文件输出
            h264Encoder?.setEnableFileOutput(true) // 启用文件输出
            
            // 设置UDP服务器地址(可选)
             h264Encoder?.setServerAddress("58.48.93.67", 11935)
//             h264Encoder?.setServerAddress("58.48.93.67", 11935)
            h264Encoder?.setEnableNetworkTransmission(false)
             h264Encoder?.setServerAddress("192.168.16.12", 11935)
             h264Encoder?.setProtocolParams("013120122580", 1)
            
            // 初始化并启动