1.getVideoDuration 返回时长666的,录的文件有问题,删除(可能是processcamera返回-1)
2个文件已修改
63 ■■■■ 已修改文件
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -78,6 +78,9 @@
    // 音频推流线程池(单线程)
    private ExecutorService audioPushExecutor;
    // 保护 alivcPusher / previewSurfaceView 等生命周期,避免 start/stop 并发导致 NPE
    private final Object pusherLock = new Object();
    /**
     * 推流回调接口
     */
@@ -162,22 +165,34 @@
     * 停止推流
     */
    public void stopPush() {
        // stop 同样强制在主线程串行执行,避免与 init/setupListeners 并发
        if (Looper.myLooper() == Looper.getMainLooper()) {
            stopPushInternal();
        } else {
            mainHandler.post(this::stopPushInternal);
        }
    }
    private void stopPushInternal() {
        synchronized (pusherLock) {
        Timber.d("%s stopPush called", getCameraTag());
        stopPushThread();
//        stopAudioTransfer();
        stopWaterMaskSchedule();
        releaseAlivcPusher();
            releaseAlivcPusherLocked();
        if (usbCamera != null) {
            usbCamera.stopCamera();
        }
        pushStarted = false;
        notifyCallback(1, 4, "推流已停止");
    }
    }
    /**
     * 初始化阿里推流
     */
    private void initAlivcPusher() {
        synchronized (pusherLock) {
        try {
            alivcLivePushConfig = new AlivcLivePushConfig();
@@ -212,9 +227,10 @@
            alivcLivePushConfig.setExternMainStream(true);
            alivcLivePushConfig.setAlivcExternMainImageFormat(AlivcImageFormat.IMAGE_FORMAT_YUV420P);
            // 初始化推流器
            alivcPusher = new AlivcLivePusher();
            alivcPusher.init(context.getApplicationContext(), alivcLivePushConfig);
                // 初始化推流器:先用局部变量,避免中途被 stop 置空导致 setupListeners NPE
                AlivcLivePusher localPusher = new AlivcLivePusher();
                localPusher.init(context.getApplicationContext(), alivcLivePushConfig);
            // 外部自定义流模式下,同样需要先开启预览,让状态从 INIT 进入 PREVIEWED
            // 创建一个隐藏的 Window 来承载 SurfaceView,确保 Surface 能够被创建
            windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
@@ -226,13 +242,13 @@
                public void surfaceCreated(SurfaceHolder holder) {
                    try {
                        Timber.d("%s previewSurfaceView surfaceCreated, startPreviewAysnc", getCameraTag());
                        if (alivcPusher != null) {
                            synchronized (pusherLock) {
                                if (alivcPusher != null && previewSurfaceView != null) {
                            alivcPusher.startPreviewAysnc(previewSurfaceView);
                            // 启动摄像头数据推送线程
                            startPushThread();
                                }
                        }
                    } catch (Exception e) {
                            Timber.e(e, "%s startPreviewAysnc in surfaceCreated failed", getCameraTag());
@@ -280,13 +296,15 @@
                }
            }
            // 设置监听器
            setupListeners();
                // 设置监听器(对局部 pusher 先绑定),最后再发布到字段
                setupListeners(localPusher);
                alivcPusher = localPusher;
            Timber.d("%s AlivcPusher initialized successfully", getCameraTag());
        } catch (Exception e) {
            Timber.e(e, "%s Failed to initialize AlivcPusher", getCameraTag());
            notifyCallback(1, -3, "初始化推流SDK失败: " + e.getMessage());
            }
        }
    }
@@ -409,9 +427,13 @@
    /**
     * 设置监听器
     */
    private void setupListeners() {
    private void setupListeners(AlivcLivePusher pusher) {
        if (pusher == null) {
            Timber.w("%s setupListeners skipped: pusher is null", getCameraTag());
            return;
        }
        // 推流信息监听器
        alivcPusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
        pusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
            @Override
            public void onPreviewStarted(AlivcLivePusher alivcLivePusher) {
                Timber.d("%s onPreviewStarted", getCameraTag());
@@ -489,7 +511,7 @@
        });
        // 错误监听器
        alivcPusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
        pusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
            @Override
            public void onSystemError(AlivcLivePusher alivcLivePusher, AlivcLivePushError alivcLivePushError) {
                Timber.e("onSystemError: %s", alivcLivePushError.toString());
@@ -510,7 +532,7 @@
        });
        // 网络监听器
        alivcPusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
        pusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
            @Override
            public void onNetworkPoor(AlivcLivePusher alivcLivePusher) {
                Timber.w("onNetworkPoor");
@@ -672,6 +694,12 @@
     * 释放阿里推流资源
     */
    private void releaseAlivcPusher() {
        synchronized (pusherLock) {
            releaseAlivcPusherLocked();
        }
    }
    private void releaseAlivcPusherLocked() {
        // 兜底:防止外部没有走 stopPush
        stopWaterMaskSchedule();
        // 移除隐藏的 SurfaceView
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -776,8 +776,13 @@
            if (originalFile.renameTo(newFile)) {
                Timber.d("文件重命名成功: %s -> %s", originalFile.getName(), newFileName);
                // 更新回调中的文件名
                if (durationSeconds==666){
                    Timber.i("录制错误,此文件[%s]需要都踢",newFile.getAbsolutePath());
                    newFile.delete();
                }else{
                notifyCallback(2,0,newFileName);
                }
            } else {
                Timber.e("文件重命名失败: %s -> %s", originalFile.getName(), newFileName);
            }
@@ -813,7 +818,7 @@
            }
        }
        // 如果获取失败,返回默认值60秒
        return 60;
        return 666;
    }
    /**