Dana
7 天以前 33b4919c10b89a88141a1f508b4db5a9183e07e7
1.usb推流加水印,1秒1tie  有问题,闪烁
1个文件已添加
1个文件已修改
217 ■■■■■ 已修改文件
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/util/GlobalData.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -3,12 +3,19 @@
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.alivc.live.pusher.AlivcAudioAACProfileEnum;
import timber.log.Timber;
@@ -27,9 +34,11 @@
import com.alivc.live.pusher.AlivcQualityModeEnum;
import com.alivc.live.pusher.AlivcResolutionEnum;
import com.anyun.libusbcamera.UsbCamera;
import com.anyun.libusbcamera.WatermarkParam;
import com.safeluck.floatwindow.MediaArgu;
import com.safeluck.floatwindow.ResponseVO;
import com.safeluck.floatwindow.util.AudioRecordManager;
import com.safeluck.floatwindow.util.GlobalData;
/**
 * USB摄像头推流管理器
@@ -113,6 +122,7 @@
        try {
            // 初始化推流SDK
            initAlivcPusher();
            setWaterMask();
            pushStarted = false;
            
            // 检查并打开USB摄像头
@@ -189,7 +199,6 @@
            // 初始化推流器
            alivcPusher = new AlivcLivePusher();
            alivcPusher.init(context.getApplicationContext(), alivcLivePushConfig);
            // 外部自定义流模式下,同样需要先开启预览,让状态从 INIT 进入 PREVIEWED
            // 创建一个隐藏的 Window 来承载 SurfaceView,确保 Surface 能够被创建
            windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
@@ -265,6 +274,84 @@
        }
    }
    WatermarkParam watermarkParam;
    ArrayList<WatermarkParam> watermarkParamList = new ArrayList<>();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    int baseY = 20;
    int fontSize= 24;
    private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    private void setWaterMask() {
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            if (pushStarted){
                if (!TextUtils.isEmpty(GlobalData.getInstance().getWaterMaskInfo())){
                    Log.i(TAG,"tieshuiin");
                    if (resolutionArr[0]==320&&resolutionArr[1]==240){
                        fontSize = 24;
                        baseY = 2;
                    }else if (resolutionArr[0]==640&&resolutionArr[1]==480){
                        fontSize = 32;
                        baseY = 4;
                    }else if (resolutionArr[0]==1280&&resolutionArr[1]==720){
                        fontSize = 48;
                        baseY = 6;
                    }else{
                        baseY = 2;
                        fontSize = 24;
                    }
                    String school = GlobalData.getInstance().parseWaterMaskInfo("school", "无", GlobalData.ShareType.STRING);
                    watermarkParam = new WatermarkParam(10,baseY,school);
                    watermarkParamList.clear();
                    watermarkParamList.add(watermarkParam);
                    String teacher = GlobalData.getInstance().parseWaterMaskInfo("teacher", "无", GlobalData.ShareType.STRING);
                    String stu = GlobalData.getInstance().parseWaterMaskInfo("student", "无", GlobalData.ShareType.STRING);
                    baseY = fontSize*11/10+baseY;
                    watermarkParam = new WatermarkParam(10,baseY,"教练:"+teacher+" 学员:"+stu);
                    watermarkParamList.add(watermarkParam);
                    double speed = GlobalData.getInstance().parseWaterMaskInfo("speed", 0.0, GlobalData.ShareType.DOUBLE);
                    String czh = GlobalData.getInstance().parseWaterMaskInfo("car_license", "无", GlobalData.ShareType.STRING) + GlobalData.getInstance().getCameraTag;
                    baseY = fontSize*11/10+baseY;
                    watermarkParam = new WatermarkParam(10,resolutionArr[1]-baseY,czh +"    "+String.format("速度:%.1f",speed));
                    watermarkParamList.add(watermarkParam);
                    double latitude = GlobalData.getInstance().parseWaterMaskInfo("latitude", 29.51228918, GlobalData.ShareType.DOUBLE);
                    double longitude = GlobalData.getInstance().parseWaterMaskInfo("longitude", 106.45556208, GlobalData.ShareType.DOUBLE);
//                            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
                    baseY = fontSize*11/10+baseY;
                    watermarkParam = new WatermarkParam(10,resolutionArr[1]-fontSize,  String.format("%.6f %.6f", latitude, longitude)+" "+sdf.format(new Date()));
                    watermarkParamList.add(watermarkParam);
                    if (resolutionArr[0]==320&&resolutionArr[1]==240){
                        usbCamera.enableWatermark(true,"/system/ms_unicode_24.bin");
                        usbCamera.setWatermark(3,fontSize,1,watermarkParamList);
                    }else if (resolutionArr[0]==640&&resolutionArr[1]==480){
                        usbCamera.enableWatermark(true,"/system/ms_unicode_32.bin");
                        usbCamera.setWatermark(3,fontSize,1,watermarkParamList);
                    }else if (resolutionArr[0]==1280&&resolutionArr[1]==720){
                        usbCamera.enableWatermark(true,"/system/ms_unicode_48.bin");
                        usbCamera.setWatermark(3,fontSize,1,watermarkParamList);
                    }else{
                        usbCamera.enableWatermark(true,"/system/ms_unicode_24.bin");
                        usbCamera.setWatermark(3,fontSize,1,watermarkParamList);
                    }
                }
            }
        },1,1, TimeUnit.SECONDS);
    }
    private Handler mainHandler = new Handler(Looper.getMainLooper());
    /**
     * 设置监听器
app/src/main/java/com/safeluck/floatwindow/util/GlobalData.java
New file
@@ -0,0 +1,128 @@
package com.safeluck.floatwindow.util;
import android.text.TextUtils;
import android.util.Log;
import com.safeluck.floatwindow.MediaArgu;
import org.json.JSONException;
import org.json.JSONObject;
/**
 * @ProjectName: aaa
 * @Package: com.safeluck.floatwindow.bean
 * @ClassName: GlobalData
 * @Description: 存放全局数据,到处都可以调用;  单例
 * @Author: zhanwei.li
 * @CreateDate: 2021/8/7 10:13
 * @UpdateUser: 更新者
 * @UpdateDate: 2021/8/7 10:13
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
public class GlobalData {
    private static final String TAG = "GlobalData";
    public static final String CPU_MODEL_8953 = "MSM8953";
    public String getCameraTag = "_2";
    //水印信息
    /*
    {"teacher": "张三",
            "student": "李四",
            "speed": 24.5,
            "longitude": "26.3231,
            "latitude": 109.3233,
            "school": "测试驾校",
            "car_license": "渝A1234学",
            "other": "",
    }
     */
    private String waterMaskInfo;
    private GlobalData() {
    }
    private static GlobalData instance;
    public static GlobalData getInstance() {
        if (instance == null) {
            synchronized (GlobalData.class) {
                if (instance == null) {
                    instance = new GlobalData();
                }
            }
        }
        return instance;
    }
    public void setWaterMaskInfo(String info){
        Log.i(TAG,"waterMaskInfo="+info);
        this.waterMaskInfo = info;
    }
    public String getWaterMaskInfo(){
        if (TextUtils.isEmpty(waterMaskInfo)){
            waterMaskInfo = "     {\"teacher\": \"\",\n" +
                    "            \"student\": "+stuName+",\n" +
                    "            \"speed\": 0,\n" +
                    "            \"longitude\": \"00.0000,\n" +
                    "            \"latitude\": 00.0000,\n" +
                    "            \"school\": \"\",\n" +
                    "            \"car_license\": \"\",\n" +
                    "            \"other\": \"\",\n" +
                    "    }";
        }
        return waterMaskInfo;
    }
    public<T> T parseWaterMaskInfo(String key,T defaultValue,ShareType type){
        Object value = null;
        Log.i(TAG,"parseWaterMaskInfo="+key);
        if (!TextUtils.isEmpty(waterMaskInfo)){
            try {
                JSONObject jsonObject = new JSONObject(waterMaskInfo);
                switch (type){
                    case STRING:
                        value = jsonObject.getString(key);
                        break;
                    case INTEGER:
                        value = jsonObject.getInt(key);
                        break;
                    case LONG:
                        value = jsonObject.getLong(key);
                        break;
                    case DOUBLE:
                        value = jsonObject.getDouble(key);
                        break;
                    case BOOLEAN:
                        value = jsonObject.getBoolean(key);
                        break;
                }
                Log.i(TAG,"key="+key+" value="+value);
                return (T)value;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return defaultValue;
    }
    private MediaArgu mediaArgu;
    public MediaArgu getMediaArgu() {
        return mediaArgu;
    }
    public void setMediaArgu(MediaArgu mediaArgu){
        this.mediaArgu = mediaArgu;
    }
    private String stuName="";
    public void setStuName(String userName) {
        stuName = userName;
    }
    public enum ShareType{
        STRING,INTEGER,LONG,DOUBLE,BOOLEAN
    }
}