| | |
| | | * // 设置UDP服务器地址(可选) |
| | | * encoder.setServerAddress("192.168.1.100", 8888); |
| | | * encoder.setProtocolParams("123456789012", (byte)1); |
| | | * encoder.setEnableNetworkTransmission(true); // 启用TCP/UDP网络传输,false表示禁用 |
| | | * |
| | | * // 初始化并启动 |
| | | * int[] cameraIdRange = {0, 0}; |
| | |
| | | private String outputFilePath; |
| | | private boolean enableFileOutput = false; // 是否启用文件输出 |
| | | private boolean spsPpsWritten = false; // 标记SPS/PPS是否已写入 |
| | | |
| | | // 网络传输控制 |
| | | private boolean enableNetworkTransmission = true; // 是否启用TCP/UDP网络传输 |
| | | |
| | | // 编码回调 |
| | | public interface OnFrameEncodedCallback { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 设置是否启用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) { |
| | |
| | | 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在第一次输出时写入) |
| | |
| | | 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); |
| | |
| | | * 发送编码后的数据(按JT/T 1076-2016协议打包) |
| | | */ |
| | | private void sendEncodedData(byte[] data, long timestamp, boolean isKeyFrame) { |
| | | // 如果未启用网络传输,直接返回 |
| | | if (!enableNetworkTransmission) { |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | // 计算时间间隔 |
| | | long currentTime = System.currentTimeMillis(); |
| | |
| | | } |
| | | |
| | | // 关闭Socket(UDP或TCP,根据协议类型自动选择) |
| | | if (protocolHelper != null) { |
| | | // 只有在启用网络传输时才需要关闭Socket |
| | | if (enableNetworkTransmission && protocolHelper != null) { |
| | | protocolHelper.closeSocket(); |
| | | } |
| | | |