【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了

        这一篇我们开始讲 相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏9573412

目录

一、问题背景

二、问题分析过程

    2.1:基于原理分析

    2.2 :分析返帧情况

    2.3 :分析返帧异常

    2.4 :无Error异常日志分析思路

    2.5 :差异提交

    2.6 :回退复测

    2.7 :解决方案


一、问题背景

【操作步骤】【Operation steps】进入照片模式(后置),1x以上进行拍照
【实际结果】【Actual results】拍照定屏
【期望结果】【Expected results】无闪退、定屏等

二、问题分析过程

    2.1:基于原理分析

对于Camera HAL底层而已,我们需要排查返帧是否正常,若底层都没返帧,那么上层显示自然存在问题。

    2.2 :分析返帧情况

1:参考HAL3一级日志关键字:相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

2:我们可以确认配流和打开相机均正常,但返帧确实异常,很多帧没有返回。如下:

	行 12150: 07-17 17:35:49.454882  3365  3386 E CamX    : [ALWAYS_ON   ] camxhal3.cpp:608 open() HAL3Open end行 12633: 07-17 17:35:49.583325  3365  3386 I CamX    : [ INFO][HAL    ] camxhal3.cpp:1577 configure_streams()   operation_mode: 32769行 15881: 07-17 17:35:50.331532  3365  3576 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 15966: 07-17 17:35:50.337573  3365  3579 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 16021: 07-17 17:35:50.348748  3365  3577 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 16022: 07-17 17:35:50.348754  3365  3577 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2171 process_capture_result()     output_buffers[0] : 0xb4000070b863e380, buffer: 0xb400007089f89a98, status: 00000000, stream: 0xb400007096d341e8行 16027: 07-17 17:35:50.349325  3365  3386 I CamX    : [CORE_CFG][HAL    ] camxhal3.cpp:1838 process_capture_request() frame_number 17, settings 0xb4000070aedfd800, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 16028: 07-17 17:35:50.349344  3365  3386 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:1864 process_capture_request()     output_buffers[0] : 0xb4000070b48c8a60, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 17712: 07-17 17:35:51.320126  3365  3575 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 39, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 17713: 07-17 17:35:51.320131  3365  3575 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2171 process_capture_result()     output_buffers[0] : 0xb4000070b863e380, buffer: 0xb400007089f89b18, status: 00000000, stream: 0xb400007096d341e8行 17719: 07-17 17:35:51.320734  3365  3365 I CamX    : [CORE_CFG][HAL    ] camxhal3.cpp:1838 process_capture_request() frame_number 46, settings 0xb40000709c3f2000, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 17720: 07-17 17:35:51.320754  3365  3365 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:1864 process_capture_request()     output_buffers[0] : 0xb4000070ca1ff7a0, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 17899: 07-17 17:35:51.332635  3365  3578 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 40, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19102: 07-17 17:35:52.329564  3365  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19188: 07-17 17:35:52.337358  3365  3579 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19219: 07-17 17:35:52.345025  3365  3581 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 19220: 07-17 17:35:52.345034  3365  3581 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2171 process_capture_result()     output_buffers[0] : 0xb4000070b863e380, buffer: 0xb4000070b81f92f8, status: 00000000, stream: 0xb400007096d341e8行 19225: 07-17 17:35:52.345711  3365  3386 I CamX    : [CORE_CFG][HAL    ] camxhal3.cpp:1838 process_capture_request() frame_number 77, settings 0xb4000070aedfd800, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 19226: 07-17 17:35:52.345731  3365  3386 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:1864 process_capture_request()     output_buffers[0] : 0xb4000070b48c8a60, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 20090: 07-17 17:35:53.332129  3365  3578 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 20147: 07-17 17:35:53.337141  3365  3580 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 20196: 07-17 17:35:53.346338  3365  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1

可以看到返帧就10,39,40,70,100,并非每帧都返回。我们需要分析为什么没有返帧,是sensor没出返帧,还是camx hal流程异常导致。

    2.3 :分析返帧异常

搜索进程Error日志,发现并没有异常日志。一般返帧失败,Camx hal进程就会有报错。没有异常日志这时怎么处理?

    2.4 :无Error异常日志分析思路

分析思路:

  1. 功能性问题,返帧失败,Camx hal进程就会有报错来体现返帧失败的过程或原因。
  2. 没有异常日志,说明大概率是正常的功能需求,才不会打印error日志,而正常功能需求一般没有足够测试影响范围,导致的性能稳定性问题。
  3. 常规做法:根据返帧流程添加日志分析哪里出现问题,但这样分析周期一般偏长。
  4. 二分法排查:项目紧张情况下,快速解决问题的方式是,根据必须或概率高复现路径,利用二分法排查哪个版本出现的问题,确定了某一天的版本有问题,然后差异提交去定位具体哪一个提交引入的问题,这样解决问题就非常有针对性,且快速解决问题。参考:相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比 相机camera开发之差异对比核查二:测试机和对比机的差异提交对比相机camera开发之差异对比核查三:测试机和对比机的Camera算法库、解耦配置和快稳省差异对比 相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字

    2.5 :差异提交

结果差异提交二分法排查,很快找到Camera相关仓库的几笔差异提交,结果技术分析,排查完全无影响的提交,最终锁定一笔功能导通的提交非常可疑,如下:这笔提交明显存在SetFrameSkipForPreview和SetFrameSkipFlag相关跳帧的改动。

导通yuvsr izoom---diff --git a///qcom/extensionlayer/BackseatDriver.cpp b///qcom/extensionlayer/BackseatDriver.cpp
index 0fca7a5..483a430 100755
--- a///qcom/extensionlayer/BackseatDriver.cpp
+++ b///qcom/extensionlayer/BackseatDriver.cpp
@@ -99,6 +99,7 @@m_isEnableIzoomNZSL            = FALSE;m_previewEv                    = 0;m_previewIzoomFrame            = 0;
+    m_previewYuvsrIzoomFrame       = 0;m_skipPreIzoomCount            = 0;m_trrigerIzoomRatio            = 0.0f;m_trigger4skipProLongExp       = 100000000.0f;
@@ -1223,7 +1224,11 @@{SetFrameSkipForPreviewIZOOM(pRequest);}
-
+    if ((m_trrigerIzoomRatio > 0 ||(m_Config.FeatureType == OP_YUVSR &&
+    m_Config.Bracket == _BRACKET_NONE))&& (m_pPlugin->IsSystemCamera() == TRUE))
+    {
+        SetFrameSkipForPreviewYuvsrIZOOM(pRequest);
+    }// need to drop more frames:m_continueDropframeCountm_continueDropframeCount = GetContinueDropframeCount(pRequest, pAppMeta);m_lastzoomtype = m_Config.FeatureType;
@@ -1272,7 +1277,7 @@((m_Config.Bracket == _BRACKET_04) && m_needSkipPreviewInBracket4) ||((m_Config.Bracket == _BRACKET_15) && m_needSkipPreviewForFaceBeauty) ||((m_Config.Bracket == _BRACKET_12) && m_needSkipPreviewForIZoom) ||
-                ((m_Config.Bracket == _BRACKET_17) && (FRONT_CAM_ID == m_pPlugin->GetLogicalCameraId())))
+                ((m_Config.Bracket == _BRACKET_17) && (FRONT_CAM_ID == m_pPlugin->GetLogicalCameraId())) || (m_Config.FeatureType == OP_YUVSR && m_Config.Bracket == _BRACKET_NONE)){CHX_LOG_DEBUG("Import skip preview sceneMode %d, frameIndex %d, applicationFrameNum %d, AeExposureCom %d, Bracket %d",m_Config.Scene,
@@ -1487,6 +1492,38 @@/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BackseatDriver::SetFrameSkipFlagForIZOOM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+VOID BackseatDriver::SetFrameSkipForPreviewYuvsrIZOOM(camera3_capture_request_t* pRequest)
+{
+    UINT32 applicationFrameNum = pRequest->frame_number;
+    UINT32 frameIndex          = pRequest->frame_number % MaxOutstandingRequests;
+    UINT32 temp_Index          = frameIndex;
+
+    if(m_Config.ZoomRatio >= m_trrigerIzoomRatio)
+    {
+        m_previewYuvsrIzoomFrame++;
+        if(m_previewYuvsrIzoomFrame<= m_skipPreIzoomCount && applicationFrameNum >0)
+        {
+            temp_Index = (frameIndex > 0) ? (frameIndex -1) : MaxOutstandingRequests - 1;
+            m_skipFrameInfo[temp_Index].isSkipPreview  = TRUE;
+            m_skipFrameInfo[temp_Index].isSkipViewFinder  = TRUE;
+            CHX_LOG_INFO("preview izoom skip in frame:%d",temp_Index);
+        }
+    }
+    else
+    {
+        if(m_previewYuvsrIzoomFrame !=0 && applicationFrameNum >0)
+        {
+            temp_Index = (frameIndex > 0) ? (frameIndex -1) : MaxOutstandingRequests - 1;
+            m_skipFrameInfo[temp_Index].isSkipPreview  = TRUE;
+            CHX_LOG_INFO("preview izoom skip out frame:%d",temp_Index);
+        }
+        m_previewYuvsrIzoomFrame = 0;
+    }
+
+}
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/// BackseatDriver::SetFrameSkipFlagForIZOOM
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VOID BackseatDriver::SetFrameSkipForPreviewIZOOM(camera3_capture_request_t* pRequest){UINT32 applicationFrameNum = pRequest->frame_number;
diff --git a///qcom/extensionlayer/BackseatDriver.h b///qcom/extensionlayer/BackseatDriver.h
index 0e643c8..5f1e8db 100755
--- a///qcom/extensionlayer/BackseatDriver.h
+++ b///qcom/extensionlayer/BackseatDriver.h
@@ -67,6 +67,9 @@VOID SetFrameSkipForPreviewIZOOM(camera3_capture_request_t* pRequest);+    VOID SetFrameSkipForPreviewYuvsrIZOOM(
+          camera3_capture_request_t* pRequest);
+VOID SetFrameSkipForPreviewIZOOMSensor(camera3_capture_request_t* pRequest);@@ -164,6 +167,7 @@char*         m_pBaseBuffer;BOOL          m_isBrokenImage;UINT32        m_previewIzoomFrame;
+    UINT32        m_previewYuvsrIzoomFrame;INT32         m_skipPreIzoomCount;FLOAT         m_trrigerIzoomRatio;diff --git a///qcom/extensionlayer/pluginbase.cpp b///qcom/extensionlayer/pluginbase.cpp
index a21e66a..b90369f 100755
--- a///qcom/extensionlayer/pluginbase.cpp
+++ b///qcom/extensionlayer/pluginbase.cpp
@@ -4424,10 +4424,18 @@INT32* pBracketMode = NULL;INT32* pFeatureType = NULL;
+    INT32* psensorMode  = NULL;
+    INT32  sensorMode  = 0;
+if (pMetadata != NULL){pBracketMode = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr, "BracketMode"));pFeatureType = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr,".feature.type"));
+        psensorMode = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr,"sensor.mode.list"));
+        if(psensorMode != NULL)
+        {
+            sensorMode = psensorMode[0];
+        }}Config Config = m_pMetaManager->GetConfig();@@ -4472,7 +4480,8 @@}if(m_isEnPreviewIzoom &&((pBracketMode != NULL && *pBracketMode == _BRACKET_12)
-        || (pFeatureType != NULL && *pFeatureType == OP_TURBO_RAW_IZOOM)
+        || (pFeatureType != NULL && (*pFeatureType == OP_TURBO_RAW_IZOOM||  (pBracketMode != NULL &&
+        *pBracketMode == _BRACKET_NONE && *pFeatureType == OP_YUVSR && sensorMode == 1)))|| ((Config.ZoomRatio >= m_trrigerIzoomRatio) && !isCTSorGSI()))){if ((m_pZoomController->isInZoomState() || (0 != GetTurboTotalNum())) &&
@@ -4516,8 +4525,8 @@}if (pFeatureType != NULL &&
-        (*pFeatureType == OP_HYBRIDRAW_IZOOM_TELE || *pFeatureType == OP_TURBO_RAW_IZOOM) &&
-        !m_pZoomController->isInZoomState())
+        (*pFeatureType == OP_HYBRIDRAW_IZOOM_TELE || *pFeatureType == OP_TURBO_RAW_IZOOM|| (pBracketMode != NULL &&
+         *pBracketMode == _BRACKET_NONE && *pFeatureType == OP_YUVSR && sensorMode == 1)) &&!m_pZoomController->isInZoomState()){izoomEnabled = 1;}

    2.6 :回退复测

回退复测,发现果然无此问题。且搜索问题版本日志,果然存在跳帧的正常debug日志:

	行 24841: 07-17 17:35:57.336583  3365  3365 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1287 SetFrameSkipFlag() Import skip preview sceneMode 0, frameIndex 227, applicationFrameNum 227, AeExposureCom 0, Bracket 0行 27424: 07-17 17:35:59.335478  3365  3579 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:279, FrameNumIndex 23行 31278: 07-17 17:36:02.353677  3365  3577 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:369, FrameNumIndex 113行 35608: 07-17 17:36:06.352156  3365  3577 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:489, FrameNumIndex 233行 39302: 07-17 17:36:09.350055  3365  3577 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:579, FrameNumIndex 67行 48172: 07-17 17:36:16.358805  3365  3386 D CHIUSECASE: [DEBUG  ] BackseatDriver.cpp:1287 SetFrameSkipFlag() Import skip preview sceneMode 0, frameIndex 28, applicationFrameNum 796, AeExposureCom 0, Bracket 0

    2.7 :解决方案

由于是共基线分支的其他项目的功能导通,影响到我们项目,因此我们通过添加解耦flag配置的方式,不执行这些代码即可。即可满足他们项目需求,又不影响自己项目。

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94005.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94005.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94005.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Non-stationary Diffusion For Probabilistic Time Series Forecasting论文阅读笔记

Non-stationary Diffusion For Probabilistic Time Series Forecasting 摘要 时间序列数据受到潜在的物理动力学和外部影响&#xff0c;其不确定性通常随时间而变化。现有的去噪扩散概率模型&#xff08;DDPMs&#xff09;受到加性噪声模型&#xff08;ANM&#xff09;的恒定方…

解决Docker 无法连接到官方镜像仓库

这个错误&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)表示 Docker 无法连接到官方镜像仓库 registry-1.docker…

解决RAGFlow启动时Elasticsearch容器权限错误的技术指南

文章目录 问题现象 根本原因分析 解决方案步骤 1. 定位宿主机数据目录 2. 修复目录权限 3. 验证权限状态 4. 重启服务 5. 检查启动状态 永久解决方案:优化Docker Compose配置 高级故障排除 技术原理 问题现象 在启动RAGFlow项目时,执行 docker logs ragflow-es-01 发现Elast…

【C++高阶六】哈希与哈希表

【C高阶六】哈希与哈希表1.什么是哈希&#xff1f;2.unordered系列容器3.哈希表3.1将key与存储位置建立映射关系3.1.1直接定址法3.1.2除留余数法&#xff08;产生哈希冲突&#xff09;3.2解决哈希冲突的方法3.2.1闭散列&#xff08;开放定址法&#xff09;3.3.2开散列&#xff…

Vue 3 +Ant Design Vue 父容器样式不影响子级,隔离

公共样式文件 common.scss.zz-ant-status-bar {div {font-size: 12px;padding: 0 8px;} }页面代码<div class"zz-ant-status-bar"><a-row><a-col :span"6" ><a-progress :percent"progress.percent" size"small"…

k8s 简介及部署方法以及各方面应用

Kubernetes 简介及部署方法Kubernetes&#xff08;简称 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化容器化应用的部署、扩展、管理和运维。它由 Google 基于内部的 Borg 系统经验开发&#xff0c;2014 年开源后由云原生计算基金会&#xff08;CNCF&#xf…

Class A 包含字段 x Class B 也包含字段 x,如果判断List<A> lista 和 List<B> listb 有相同的 x?

要判断两个不同类型的对象列表 List<A> 和 List<B> 是否包含相同的 x字段值&#xff08;即两个列表中至少有一个 x是相同的&#xff09;&#xff0c;你可以使用 Java 8 的 Stream API 来实现。import java.util.List; import java.util.Set; import java.util.stre…

SpringBoot整合Camunda工作流

什么是工作流&#xff1f;概述 工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可以由一个或多个软件系统完成&#xff0c;也可以由一个或一组人完成&#xff0c;还可以由一个或多个人与软件系统协作完成&#x…

2025年09月计算机二级Java选择题每日一练——第四期

计算机二级中选择题是非常重要的&#xff0c;所以开始写一个每日一题的专栏。 答案及解析将在末尾公布&#xff01; 今日主题&#xff1a;面向对象特性 1、有两个类 A 和 B 的定义如下&#xff1a; class A{final int x10;public void show(){System.out.print(x " &quo…

《Nature》新文解读:电化学辅助核聚变的实验验证与机制分析

前言一篇于2025年8月发表在《Nature》期刊上的重磅研究&#xff0c;由加拿大不列颠哥伦比亚大学&#xff08;UBC&#xff09;Curtis P. Berlinguette教授领导的跨学科团队完成&#xff0c;首次在实验上证实&#xff1a;通过电化学方法向钯金属靶中加载氘&#xff0c;可显著提升…

【基础-判断】用户在长视频、短视频、直播、通话、会议、拍摄类应用等场景下,可以采用悬停适配在折叠屏半折态时,上屏进行浏览下屏进行交互操作

用户在长视频、短视频、直播、通话、会议、拍摄类应用等场景下,可以采用悬停适配在折叠屏半折态时,上屏进行浏览下屏进行交互操作。 解释如下: ✅ 1. 悬停态适配机制的核心设计 HarmonyOS 针对折叠屏半折态(悬停态)提供了分屏交互框架,其核心逻辑是: 上屏(Upper Scre…

nodejs安装后 使用npm 只能在cmd 里使用 ,但是不能在poowershell使用,只能用npm.cmd

nodejs安装后 使用npm 只能在cmd 里使用 &#xff0c;但是不能在poowershell使用&#xff0c;只能用npm.cmdnodejs版本&#xff1a;22.18.0 刚安装好nodejs&#xff0c;在 PowerShell 中无法执行 npm&#xff0c;但能执行npm.cmd&#xff0c;这通常是因为 PowerShell 的执行策略…

【链表 - LeetCode】2. 两数相加

谁都逃不掉 LeetCode &#xff01;&#xff01;哈哈哈~~~ 开刷&#xff1a;&#xff09; 2025年08月22日 题目&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;链表 /*** Definition for singly-linked list.* struct ListNode {* in…

WG-Tools 在线开发者工具推荐:完全免费、无广告干扰、无需安装、即开即用

WG-Tools 在线开发者工具箱全面探秘: 一站式效率提升平台前言一. WG-Tools 平台介绍 &#x1f6e0;️平台概览技术架构亮点二. 功能模块详细介绍 &#x1f3af;&#x1f4dd; 文本处理工具 (Text Tools)1. JSON工具2. XML工具3. 文本对比4. 正则表达式工具5. Markdown编辑器6. …

四十二、【核心功能强化】用例管理与调试:批量删除与在线请求测试

四十二、【核心功能强化】用例管理与调试:批量删除与在线请求测试 前言 准备工作 第一部分:后端实现 1. 修改 `TestCaseViewSet` (`api/views.py`) 2. 后端 API 权限: 第二部分:前端实现 1. 更新 `api/testcase.ts` API 服务 2. 改造 `TestCaseListView.vue` (用例列表页面…

从H.264到AV1:音视频技术演进与模块化SDK架构全解析

引言 过去二十年&#xff0c;音视频技术经历了从 文件点播 → 流媒体 → 实时直播 → 互动协作 的深刻演变。早期的视频更多停留在娱乐与媒体分发层面&#xff0c;而如今&#xff0c;它已经成为数字化社会的“实时交互基座”。从 安防监控的秒级告警、工业巡检的远程操作&…

Kubernetes 调度器 详解

1. 调度器在 K8s 中的位置与核心流程API Server ←→ etcd ←→ kube-scheduler ←→ kubelet创建&#xff1a;用户提交 Pod 描述&#xff08;YAML/Helm/Operator&#xff09;。监听&#xff1a;调度器通过 Watch 机制捕获到 spec.nodeName"" 的 Pod。过滤&#xff1…

51.Seata-TCC模式

前面两种XA模式和TA模式,都是用了加锁。 TCC模式则不会加锁,性能更好。 TCC模式跟AT模式非常相似, 1.AT模式下,第一阶段直接提交事务。 2.TCC模式下,第一阶段不是提交事务,而是资源的预留冻结。 不同的是二阶段TCC通过人工编码来实现数据恢复。 需要实现三个方法 …

什么是数据分类分级?数据分类分级技术实现路径及产品推荐

什么是数据分类分级&#xff1f; 数据分类分级是指按照一定的原则、方法和标准&#xff0c;对数据进行系统化的类别划分和级别确定。具体而言&#xff0c;数据分类是依据数据的属性、特征、来源、用途等维度&#xff0c;将数据划分为不同的类别&#xff0c;如按照业务领域可分为…

深度学习——神经网络

在当今人工智能蓬勃发展的时代&#xff0c;深度学习和神经网络已经成为最受关注的技术领域之一。从智能手机的人脸识别到自动驾驶汽车的环境感知&#xff0c;从医疗影像分析到金融风险预测&#xff0c;这些技术正在深刻改变我们的生活和工作方式。本文将带您了解深度学习和神经…