Dana
2025-12-01 964db3e1a2d6e2ab277da1ffcb27064bd2776848
app/src/main/java/com/anyun/h264/H264Encoder.java
@@ -4,11 +4,14 @@
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import com.anyun.libusbcamera.UsbCamera;
import com.anyun.libusbcamera.WatermarkParam;
import com.anyun.h264.model.WatermarkInfo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -148,6 +151,87 @@
    }
    /**
     * 设置水印信息
     * @param watermarkInfo 水印信息对象
     */
    public void setWatermarkInfo(WatermarkInfo watermarkInfo) {
        if (watermarkInfo == null) {
            Timber.w("WatermarkInfo is null, disabling watermark");
            usbCamera.enableWatermark(false, null);
            return;
        }
        try {
            // 构建水印文本列表(分行显示,每行一个信息项)
            ArrayList<WatermarkParam> watermarkParams = new ArrayList<>();
            // 从左上角开始,每行间隔25像素
            int yOffset = 30;
            int xOffset = 10;
            // 车牌号
            if (watermarkInfo.getPlateNumber() != null && !watermarkInfo.getPlateNumber().isEmpty()) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    "车牌:" + watermarkInfo.getPlateNumber()));
                yOffset += 25;
            }
            // 学员姓名
            if (watermarkInfo.getStudent() != null && !watermarkInfo.getStudent().isEmpty()) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    "学员:" + watermarkInfo.getStudent()));
                yOffset += 25;
            }
            // 教练姓名
            if (watermarkInfo.getCoach() != null && !watermarkInfo.getCoach().isEmpty()) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    "教练:" + watermarkInfo.getCoach()));
                yOffset += 25;
            }
            // 位置信息(纬度,经度)
            if (watermarkInfo.getLongitude() != null && watermarkInfo.getLatitude() != null) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    String.format("位置:%.6f,%.6f", watermarkInfo.getLatitude(), watermarkInfo.getLongitude())));
                yOffset += 25;
            }
            // 驾校名称
            if (watermarkInfo.getDrivingSchool() != null && !watermarkInfo.getDrivingSchool().isEmpty()) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    "驾校:" + watermarkInfo.getDrivingSchool()));
                yOffset += 25;
            }
            // 车速
            if (watermarkInfo.getSpeed() != null) {
                watermarkParams.add(new WatermarkParam(xOffset, yOffset,
                    String.format("车速:%.1fkm/h", watermarkInfo.getSpeed())));
            }
            if (!watermarkParams.isEmpty()) {
                // 启用水印,使用默认字体路径(如果系统有字体文件)
                // 颜色:0-REVERSE(反色),1-BLACK,2-WHITE,3-RED,4-GREEN,5-BLUE
                // 字体大小、倍数可以根据需要调整
                String fontPath = "/system/fonts/DroidSans.ttf"; // 默认字体路径,如果不存在可以传null
                usbCamera.enableWatermark(true, fontPath);
                // 设置水印:颜色(2=白色),字体大小(24),倍数(1),文本列表
                usbCamera.setWatermark(2, 24, 1, watermarkParams);
                Timber.d("Watermark set successfully: %s", watermarkInfo);
            } else {
                Timber.w("No watermark text to display, disabling watermark");
                usbCamera.enableWatermark(false, null);
            }
        } catch (Exception e) {
            Timber.e(e, "Failed to set watermark");
            usbCamera.enableWatermark(false, null);
        }
    }
    /**
     * 初始化摄像头和编码器
     */
    public boolean initialize(int[] cameraIdRange, String cameraName, int[] resolution, boolean ayCamera) {