| | |
| | | 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; |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 设置水印信息 |
| | | * @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) { |