Android平台FFmpeg音视频开发深度指南
一、FFmpeg在Android开发中的核心价值
FFmpeg作为业界领先的多媒体处理框架,在Android音视频开发中扮演着至关重要的角色。它提供了:
- 跨平台支持:统一的API处理各种音视频格式
- 完整功能链:从解码、编码到滤镜处理的全套解决方案
- 灵活扩展性:可通过自定义模块满足特殊需求
对于Android开发者而言,掌握FFmpeg意味着能够突破系统原生API的限制,实现更专业的音视频处理功能。
二、环境搭建与项目配置
- FFmpeg编译最佳实践
编译是使用FFmpeg的第一步,也是最重要的基础工作:
#!/bin/bash
API=24
NDK=/path/to/ndk
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64# 核心编译参数(新增安全加固和性能优化)
COMMON_FLAGS="
--target-os=android \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-programs \
--disable-doc \
--enable-gpl \
--enable-small \
--disable-symver \
--enable-neon \
--enable-asm \
--extra-cflags='-fPIC -O3 -fstack-protector-strong -march=armv8-a' \
--extra-ldflags='-Wl,--build-id=sha1 -Wl,--exclude-libs,ALL' \
--sysroot=$TOOLCHAIN/sysroot"# 编译arm64-v8a(新增Vulkan支持)
./configure $COMMON_FLAGS \--arch=aarch64 \--cpu=armv8-a \--enable-vulkan \--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \--cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \--prefix=./android/arm64-v8amake clean && make -j$(nproc) && make install
关键参数解析:
• --enable-shared
:生成动态库(.so文件)
• --disable-static
:禁用静态库编译
• --enable-small
:优化代码大小
• --disable-ffmpeg
:禁用不必要的命令行工具
• `增加安全编译选项(-fstack-protector-strong)
• `显式启用NEON和汇编优化
• `支持Vulkan硬件加速
• `符号隐藏处理(–exclude-libs,ALL)
- Android项目集成方案
现代CMake集成方式
# CMakeLists.txt完整配置示例
cmake_minimum_required(VERSION 3.10.2)project("ffmpegdemo")# 设置FFmpeg库路径
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})# 添加FFmpeg库
add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec PROPERTIESIMPORTED_LOCATION ${FFMPEG_DIR}/libavcodec.soINTERFACE_INCLUDE_DIRECTORIES ${FFMPEG_DIR}/include)# 其他库类似定义...# 主native库
add_library(native-lib SHAREDnative-lib.cpp)# 链接所有库
target_link_libraries(native-libandroidlogavcodecavformatavutilswresampleswscale)
关键注意事项:
- ABI过滤建议只保留
arm64-v8a
和armeabi-v7a
- 确保.so文件目录结构正确:
jniLibs/ABI_NAME/libxxx.so
- 对于大型项目,建议将FFmpeg封装为独立模块
三、核心开发流程详解
- 初始化阶段最佳实践
// 现代FFmpeg初始化方法(4.0+版本)
void initialize_ffmpeg() {// 网络初始化(如需处理网络流)avformat_network_init();// 设置日志级别(调试阶段可设为AV_LOG_DEBUG)av_log_set_level(AV_LOG_WARNING);// 注册所有编解码器(新版本已自动注册)// avcodec_register_all(); // 已废弃// 自定义AVIO上下文(可选)// avio_alloc_context(...);
}
重要变化:
• FFmpeg 4.0+版本已移除av_register_all()
• 编解码器现在自动注册,无需手动调用
- 媒体文件解析全流程
2.1 安全打开媒体文件
AVFormatContext* safe_open_input(JNIEnv *env, jstring path) {const char *file_path = (*env)->GetStringUTFChars(env, path, NULL);AVFormatContext *fmt_ctx = NULL;AVDictionary *options = NULL;// 设置超时参数(网络流特别重要)av_dict_set(&options, "timeout", "5000000", 0); // 5秒超时int ret = avformat_open_input(&fmt_ctx, file_path, NULL, &options);(*env)->ReleaseStringUTFChars(env, path, file_path);av_dict_free(&options);if (ret < 0) {char error[1024];av_strerror(ret, error, sizeof(error));__android_log_print(ANDROID_LOG_ERROR, "FFmpeg", "Open failed: %s", error);return NULL;}// 探测流信息if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {avformat_close_input(&fmt_ctx);return NULL;}return fmt_ctx;
}
2.2 智能流选择策略
typedef struct {int video_index;int audio_index;AVCodecContext *video_ctx;AVCodecContext *audio_ctx;
} StreamContext;StreamContext* prepare_streams(AVFormatContext *fmt_ctx) {StreamContext *sc = malloc(sizeof(StreamContext));sc->video_index = -1;sc->audio_index = -1;// 第一轮:优先选择主流for (int i = 0; i < fmt_ctx->nb_streams; i++) {AVStream *stream = fmt_ctx->streams[i];AVCodecParameters *params = stream->codecpar;if (params->codec_type == AVMEDIA_TYPE_VIDEO && sc->video_index == -1) {sc->video_index = i;}else if (params->codec_type == AVMEDIA_TYPE_AUDIO && sc->audio_index == -1) {sc->audio_index = i;}}// 第二轮:解码器初始化if (sc->video_index != -1) {AVStream *stream = fmt_ctx->streams[sc->video_index];const AVCodec *decoder = avcodec_find_decoder(stream->codecpar->codec_id);sc->video_ctx = avcodec_alloc_context3(decoder);avcodec_parameters_to_context(sc->video_ctx, stream->codecpar);// 启用多线程解码sc->video_ctx->thread_count = 4;sc->video_ctx->thread_type = FF_THREAD_FRAME;if (avcodec_open2(sc->video_ctx, decoder, NULL) < 0) {// 处理失败...}}// 音频流类似处理...return sc;
}
- 解码引擎深度优化
3.1 视频解码流水线
typedef struct {AVFrame *frame;AVPacket *pkt;AVCodecContext *codec_ctx;
} DecoderState;void init_decoder_state(DecoderState *ds, AVCodecContext *ctx) {ds->codec_ctx = ctx;ds->frame = av_frame_alloc();ds->pkt = av_packet_alloc();
}int decode_video_frame(DecoderState *ds, AVFormatContext *fmt_ctx) {while (av_read_frame(fmt_ctx, ds->pkt) >= 0) {if (ds->pkt->stream_index == ds->codec_ctx->stream_index) {// 发送到解码器int ret = avcodec_send_packet(ds->codec_ctx, ds->pkt);av_packet_unref(ds->pkt);if (ret < 0) continue;// 接收解码帧ret = avcodec_receive_frame(ds->codec_ctx, ds->frame);if (ret == 0) {return 1; // 成功解码} else if (ret == AVERROR(EAGAIN)) {continue; // 需要更多数据}}}return 0; // 结束
}
3.2 音频重采样进阶方案
typedef struct {SwrContext *swr_ctx;uint8_t **resample_data;int linesize;
} AudioResampler;void init_audio_resampler(AudioResampler *ar, AVCodecContext *ctx) {// 目标格式:Android兼容的16位立体声ar->swr_ctx = swr_alloc_set_opts(NULL,AV_CH_LAYOUT_STEREO,AV_SAMPLE_FMT_S16,ctx->sample_rate,ctx->channel_layout,ctx->sample_fmt,ctx->sample_rate,0, NULL);swr_init(ar->swr_ctx);// 预分配内存av_samples_alloc_array_and_samples(&ar->resample_data,&ar->linesize,2, // 输出声道数ctx->frame_size,AV_SAMPLE_FMT_S16,0);
}void resample_audio_frame(AudioResampler *ar, AVFrame *frame, jshortArray java_array, JNIEnv *env) {// 执行重采样int samples = swr_convert(ar->swr_ctx,ar->resample_data,frame->nb_samples,(const uint8_t **)frame->data,frame->nb_samples);// 拷贝到Java数组jsize len = samples * 2; // 立体声×2jshort *buffer = (*env)->GetShortArrayElements(env, java_array, NULL);memcpy(buffer, ar->resample_data[0], len * sizeof(jshort));(*env)->ReleaseShortArrayElements(env, java_array, buffer, 0);
}
四、性能优化黄金法则
-
内存管理四原则
-
配对原则:每个
alloc
必须有对应的free
-
及时释放:packet和frame使用后立即unref
-
预分配策略:重复使用的buffer只分配一次
-
环形缓冲:实现帧缓存队列减少内存分配
-
多线程架构设计
// 典型的生产者-消费者模型
typedef struct {AVFrameQueue video_frames;AVFrameQueue audio_frames;pthread_mutex_t mutex;pthread_cond_t cond;
} MediaContext;void* video_decoder_thread(void *arg) {MediaContext *mc = (MediaContext *)arg;DecoderState ds;init_decoder_state(&ds, mc->video_ctx);while (1) {if (decode_video_frame(&ds, mc->fmt_ctx)) {pthread_mutex_lock(&mc->mutex);enqueue_frame(&mc->video_frames, ds.frame);pthread_cond_signal(&mc->cond);pthread_mutex_unlock(&mc->mutex);} else {break;}}return NULL;
}
- 硬解码集成方案
// 检查设备支持的硬解格式
public boolean isHardwareDecodeSupported(String mimeType) {MediaCodecList list = new MediaCodecList(MediaCodecList.ALL_CODECS);for (MediaCodecInfo info : list.getCodecInfos()) {if (!info.isEncoder()) {for (String type : info.getSupportedTypes()) {if (type.equalsIgnoreCase(mimeType)) {return true;}}}}return false;
}// 获取最佳解码器名称
public String getBestDecoder(String mimeType) {// 实现策略:优先选择硬件解码器// ...
}
五、实战问题解决方案
-
音视频同步三大策略
-
基准时钟法:
// 以音频为基准 double audio_clock = audio_frame->pts * av_q2d(audio_stream->time_base); double video_clock = video_frame->pts * av_q2d(video_stream->time_base);// 计算差值 double diff = video_clock - audio_clock;// 控制视频显示 if (diff > 0.1) {// 视频超前,适当延迟usleep((diff - 0.1) * 1000000); } else if (diff < -0.1) {// 视频落后,丢弃帧return; }
-
同步阈值法:设置合理的同步阈值(±100ms)
-
动态调整法:根据网络状况动态调整同步策略
-
内存泄漏检测方案
-
Android Studio内存分析器:
• 监控Native内存增长• 捕获hprof文件分析
-
AddressSanitizer集成:
android {defaultConfig {externalNativeBuild {cmake {arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared"cFlags "-fsanitize=address -fno-omit-frame-pointer"cppFlags "-fsanitize=address -fno-omit-frame-pointer"}}} }
-
FFmpeg自带检查:
#include <libavutil/mem.h>// 内存统计 size_t mem = av_mem_get_total(); size_t max_mem = av_mem_get_max_total();
六、现代FFmpeg开发新特性
- 硬件加速API
// 使用Vulkan进行视频解码
AVBufferRef *hw_device_ctx = NULL;
av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VULKAN, NULL, NULL, 0);// 配置解码器
codec_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
codec_ctx->get_format = get_hw_format;
- 异步API使用
// 异步解码示例
avcodec_send_packet_async(codec_ctx, packet);
avcodec_receive_frame_async(codec_ctx, frame);
- 滤镜系统优化
// 创建滤镜图
AVFilterGraph *graph = avfilter_graph_alloc();
AVFilterContext *src_ctx, *sink_ctx;// 添加buffer源
avfilter_graph_create_filter(&src_ctx,avfilter_get_by_name("buffer"),"in", args, NULL, graph);// 添加sink
avfilter_graph_create_filter(&sink_ctx,avfilter_get_by_name("buffersink"),"out", NULL, NULL, graph);// 连接滤镜
avfilter_link(src_ctx, 0, sink_ctx, 0);
avfilter_graph_config(graph, NULL);
七、学习路径建议
-
初级阶段:
• 掌握基本解码流程• 理解AVFormatContext/AVCodecContext等核心结构体
• 实现简单播放器
-
中级阶段:
• 深入理解时间戳处理• 掌握音视频同步原理
• 实现滤镜处理链
-
高级阶段:
• 性能调优与内存优化• 硬件加速集成
• 自定义编解码器开发
-
专家阶段:
• FFmpeg源码贡献• 定制化分支开发
• 跨平台架构设计
结语
Android平台上的FFmpeg开发是一个需要理论与实践相结合的领域。建议开发者:
- 从简单项目入手,逐步增加复杂度
- 重视内存管理和性能优化
- 关注FFmpeg官方更新和社区动态
- 多参考开源项目实现(如ijkplayer、ExoPlayer)
通过持续学习和实践,开发者可以逐步掌握专业级的音视频开发技能,在多媒体应用开发领域获得竞争优势。
相关文章:
Android平台FFmpeg音视频开发深度指南
一、FFmpeg在Android开发中的核心价值 FFmpeg作为业界领先的多媒体处理框架,在Android音视频开发中扮演着至关重要的角色。它提供了: 跨平台支持:统一的API处理各种音视频格式完整功能链:从解码、编码到滤镜处理的全套解决方案灵…...
QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口
常用的光模块结构形式: 1)QSFP等效于4个SFP,支持410Gbit/s通道传输,可通过4个通道实现40Gbps传输速率。与SFP相比,QSFP光模块的传输速率可达SFP光模块的四倍,在部署40G网络时可直接使用QSFP光模块…...
MySQL事务和JDBC中的事务操作
一、什么是事务 事务是数据库操作的最小逻辑单元,具有"全有或全无"的特性。以银行转账为例: 典型场景: 从A账户扣除1000元 向B账户增加1000元 这两个操作必须作为一个整体执行,要么全部成功,要么全部失败…...
Linux系统下安装mongodb
1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置(以下示例为CentOS 7和CentOS 9的配置): CentOS 7(安装MongoDB 5.0/4.2等旧版本): In…...
JavaScript篇:async/await 错误处理指南:优雅捕获异常,告别失控的 Promise!
大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...
智能时代下,水利安全员证如何引领行业变革?
当 5G、AI、物联网等技术深度融入水利工程,传统安全管理模式正经历颠覆性变革。在这场智能化浪潮中,水利安全员证扮演着怎样的角色?又将如何重塑行业人才需求格局? 水利工程智能化转型对安全管理提出新挑战。无人机巡检、智能监测…...
使用FastAPI和React以及MongoDB构建全栈Web应用03 全栈开发快速入门
一、什么是全栈开发 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …...
NHANES稀有指标推荐:HALP score
文章题目:Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI:10.3389/fonc.2024.1419310 中文标题:HALP 评分与无前列腺癌的中老年人血清…...
软考错题集
一个有向图具有拓扑排序序列,则该图的邻接矩阵必定为()矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素,而其余部分为零。一般矩阵这个术语太过宽泛,不具体指向任何特定性 质的矩阵。对称矩阵…...
llama.cpp无法使用gpu的问题
使用cuda编译llama.cpp后,仍然无法使用gpu。 ./llama-server -m ../../../../../model/hf_models/qwen/qwen3-4b-q8_0.gguf -ngl 40 报错如下 ggml_cuda_init: failed to initialize CUDA: forward compatibility was attempted on non supported HW warning: n…...
[面试]SoC验证工程师面试常见问题(五)TLM通信篇
SoC验证工程师面试常见问题(五) 摘要:UVM (Universal Verification Methodology) 中的 TLM (Transaction Level Modeling) 通信是一种用于在验证组件之间传递事务(Transaction)的高层次抽象机制。它通过端口(Port)和导出(Export)实现组件间的解耦通信,避免了信…...
Spring循环依赖问题
个人理解,有问题欢迎指正。 Spring 生命周期中,首先使用构造方法对 bean 实例化,实例化完成之后才将不完全的 bean放入三级缓存中提前暴露出 bean,然后进行属性赋值,此时容易出现循环依赖问题。 由此可见,…...
AtCoder Beginner Contest 405(CD)
C - Sum of Product 翻译: 给你一个长为N的序列。 计算的值。 思路: 可使用前缀和快速得到区间和,在遍历 i 即可。(前缀和) 实现: #include<bits/stdc.h> using namespace std; using ll long lon…...
MindSpore框架学习项目-ResNet药物分类-模型优化
目录 5.模型优化 5.1模型优化 6.结语 参考内容: 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架,训推一体,支持动态图、静态图,全场景适用,有着不错的生态 本项目可以在华为云modelar…...
C. scanf 函数基础
scanf 函数 1. scanf 函数基础1.1 函数原型与头文件1.2 格式化输入的基本概念2.1 常见格式说明符整数格式说明符浮点数格式说明符字符和字符串格式说明符其他格式说明符2.2 格式说明符的高级用法宽度修饰符精度修饰符跳过输入字段宽度组合修饰符对齐修饰符实际应用示例3.2 精度…...
《C++探幽:模板从初阶到进阶》
文章目录 :red_circle:一、模板基础:开启泛型编程之门(一)泛型编程的必要性(二)函数模板1. 函数模板概念2. 函数模板定义格式3. 函数模板原理4. 函数模板实例化5. 模板参数匹配原则 (三)类模板1…...
画立方体软件开发笔记 js three 投影 参数建模 旋转相机 @tarikjabiri/dxf导出dxf
gitee: njsgcs/njsgcs_3d mainwindow.js:4 Uncaught SyntaxError: The requested module /3dviewport.js does not provide an export named default一定要default吗 2025-05-10 14-27-58 专门写了个代码画立方体 import{ scene,camera,renderer} from ./3dviewp…...
LVGL图像导入和解码
LVGL版本:8.1 概述 在LVGL中,可以导入多种不同类型的图像: 经转换器生成的C语言数组,适用于页面中不常改变的固定图像。存储系统中的外部图像,比较灵活,可以通过插卡或从网络中获取,但需要配置…...
Win10无法上网:Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目找不到域 TEST 的域控制器DNS 解析存在问题
目录 一.先看问题 二.解决问题 三.补充备用 一.先看问题 Win08有网且已经加入域 Win10无网并且找不到域(说明:Win10我之前已经加入过域的,并且能够上网,但每次在宿舍和教室切换校园网,就会导致只有Win10无网&#…...
开疆智能Canopen转Profinet网关连接工博士GBS20机器人配置案例
本案例是介绍将支持canopen通信协议的机器人机器人接入到西门子Profinet网络中,由于两种协议不能直接通讯,故选择了canopen转Profinet网关进行通讯协议转换。 配置过程: 首先打开Profinet主站配置软件,新建项目并导入网关GSD文件…...
物业企业绩效考核制度与考核体系
物业企业绩效考核制度旨在通过建立科学、公正的绩效管理体系,提升员工的工作效率、激发团队的潜力,并通过对绩效结果的合理运用来推动公司可持续发展。该制度覆盖了公司全体员工,并明确规定了不同岗位、不同部门的考核内容、周期以及绩效考核的标准操作流程。通过月度、季度…...
expo多网络请求设定。
在使用 npx expo start 启动 Expo 开发服务器时,你可以通过设置网络模式来控制你的应用如何连接到开发服务器。Expo 提供了几种网络模式供你选择: LAN (Default): 这是默认模式。在这种模式下,你的应用会通过本地局域网 (LAN) 连接到你的开发…...
M0基础篇之ADC
本节课使用到的例程 一、例程基本配置的解释 在例程中我们只使用到了PA25这一个通道,因此我们使用的是Single这个模式,也就是我们在配置模式的时候使用的是单一转换。 进行多个通道的测量我们可以使用Sequence这个模式。 二、例程基本代码讲解 DL_ADC12_…...
Cadence 高速系统设计流程及工具使用三
5.8 约束规则的应用 5.8.1 层次化约束关系 在应用约束规则之前,我们首先要了解这些约束规则是如何作用在 Cadence 设计对象上的。Cadence 中对设计对象的划分和概念,如表 5-11 所示。 在 Cadence 系统中,把设计对象按层次进行了划分&#…...
gitkraken 使用教程
一、安装教程 安装6.5.3,之后是收费的,Windows版免安装 二、使用教程 0. 软件说明 gitkraken是一个git本地仓库管理软件,可以管理多个仓库,并且仓库可以属于多个网站多个账户。 1. 克隆仓库 选择要克隆到什么位置࿰…...
抖音视频上传功能测试全维度拆解——从基础功能到隐藏缺陷的深度挖掘
一、核心功能测试(Happy Path) 文件基础验证 支持格式:MP4/MOV/AVI等(含H.264/H.265编码组合验证) 分辨率兼容性:720p→8K的渐进式测试(重点验证竖屏9:16适配) 时长边界࿱…...
基于PE环境搭建及调试S32K312
0、简介 本文基于S32K312 介绍PE的使用流程,主要是记录开发流程: MCU:NXP S32k312-100pin 编辑器:S32 Design Studio for S32 Platform 3.5 仿真器:PE USB Multilink Universal REV-E PE和jlink不一样,…...
Autoware播放提示音
播放提示音 1、修改sound_player.yaml src/autoware/utilities/sound_player/scripts/sound_player.yaml start : ~/Autoware/install/sound_player/share/sound_player/start.wav stop : ~/Autoware/install/sound_player/share/sound_player/stop.wav red …...
学习黑客5 分钟深入浅出理解cron [特殊字符]
5 分钟深入浅出理解cron 🕒 大家好!今天我们将探索Linux系统中的cron——这个强大的定时任务调度工具,它允许用户自动执行周期性任务。在网络安全领域,尤其是在TryHackMe平台上的CTF挑战中,理解cron不仅是系统管理的基…...
Qt解决自定义窗口样式不生效问题
方法一: this->setAttribute(Qt::WA_StyledBackground, true); 方法二: 将类继承QWidget 改成继承 QFrame class MyWidget : public QFrame {} 方法三:重新实现QWidget的paintEvent函数时,使用QStylePainter绘制。 void p…...
redis未授权访问
redis是高速缓存型数据库,主要用户缓存一些频繁使用的数据来缓解数据库的访问压力。而redis未授权访问漏洞是因为redis数据库使用的过程中没有设定密码,任何人都可以直接连接数据库,这既是未授权访问,这是个通用漏洞,部…...
.Net HttpClient 使用准则
HttpClient 使用准则 System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应。 HttpClient 实例是应用于该实例执行的所有请求的设置集合,每个实例使用自身的连接池,该池将其请求与其他请求隔离开来。 从 .NET Core …...
Eclipse 插件开发 6 右键菜单
Eclipse 插件开发 6 右键菜单 1 plugin.xml2 SampleHandler.java3 Activator.java 1 plugin.xml <?xml version"1.0" encoding"UTF-8"?> <?eclipse version"3.4"?> <plugin><!-- 定义命令 --><extension point&…...
MGP-STR:用于场景文本识别的多粒度预测
摘要 场景文本识别(Scene Text Recognition,简称STR)多年来一直是计算机视觉领域的研究热点。为了解决这一具有挑战性的问题,研究者们陆续提出了许多创新方法,近期将语言知识引入STR模型已成为一项重要趋势。在本研究…...
DAMA语境关系图汇总及考前须知
写在前面 1.考前须知 2.梳理彩色详细的语境关系图,方便理解与深化 1.考前须知 单选题10道题,每题1分,满分10分, 多选题15道题,每题2分,满分30分, 解答题6道,每题10分ÿ…...
Vue.js框架的优缺点
别再让才华被埋没,别再让github 项目蒙尘!github star 请点击 GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若你有快速提升github Star github 加星数的需求,访问taimili…...
【Pandas】pandas DataFrame corr
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
【引言】 随着国内技术的进步,越来越多的金融机构开始尝试将传统的商业数据库替换为国产化数据库。金仓数据库(KingbaseES,简称KES)凭借其高性能、稳定性和灵活的架构,逐步成为金融行业数据库替代的首选方案。本文将探…...
《基于人工智能的智能客服系统:技术与实践》
一、引言 在数字化时代,客户服务已成为企业竞争的关键领域之一。随着人工智能(AI)技术的飞速发展,智能客服系统逐渐成为企业提升服务质量和效率的重要工具。智能客服不仅能够快速响应客户咨询,还能通过自然语言处理&am…...
关于汇编语言与程序设计——单总线温度采集与显示的应用
一、实验要求 (1)握码管的使用方式 (2)掌握DS18B20温度传感器的工作原理 (3)掌握单总线通信方式实现 MCU与DS18B20数据传输 二、设计思路 1.整体思路 通过编写数码管显示程序和单总线温度采集程序,结合温度传感报警,利用手指触碰传感器,当…...
管道-验证和转换
管道-验证和转换 什么是管道管道的简单使用验证转换ParseIntPipeParseArrayPipe其他代码进度什么是管道 英雄联盟的老鼠说过一句话,条条管道通我家。管道一的脏水流到了管道二,管道二的脏水由于太脏了有杂物,堵住了去管道三的入口,所以通过不了(验证),去了管道四净化了下…...
多层嵌套子查询
在优化多层嵌套子查询的 Hive SQL 时,除了常见的谓词下推、分区裁剪、WITH 子句复用和动态分区优化,还可以通过 抽象语法树(AST)分析 和 基于历史的优化(HBO) 进一步优化。以下是结合所有技术方向的完整方案…...
[架构之美]从零开始整合Spring Boot与Maven(十五)
[架构之美]从零开始整合Spring Boot与Maven(十五) 摘要:本文手把手教你通过Maven快速构建Spring Boot项目,涵盖项目初始化、自动配置、依赖管理及打包部署全流程,并附赠常见避坑指南。适合需要快速搭建企业级项目的开…...
第21天打卡
何时使用降维? 1.数据可视化 高维数据难以直接可视化(如超过3维),通过降维(如PCA、t-SNE、UMAP)投影到2D/3D空间,揭示数据分布、聚类或流形结构。 适用算法:t-SNE(非线…...
【小记】excel vlookup一对多匹配
一个学生报四门课,输出每个学生课程 应用概述操作预处理数据计数指令 COUNTIFS进行一对多匹配 vlookup 应用概述 应用场景:学生报名考试,需要整理成指定格式,发给考试院。 一个学生最多报考四门 格式实例:准考证号 …...
前端项目中单元测试与集成测试的管理实践
前端项目中单元测试与集成测试的管理实践 在现代前端工程化中,单元测试(Unit Test)和集成测试(Integration Test)已成为保障项目质量的重要手段。合理地组织和管理测试代码,不仅有助于持续集成,…...
亿级流量系统架构设计与实战(六)
微服务架构与网络调用 当某个业务从单体服务架构转变为微服务架构后,多个服务之间会通过网络调用形式形成错综复杂的依赖关系。 在微服务架构中 , 一个微服务正常工作依赖它与其他微服务之间的多级网络调用。 网络是脆弱的 , RPC 请求有较大的概率会遇到超时 、 抖动 、 断…...
记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)
未发现AppIdName(qing rpt)服务或访问服务网络异常 前提是有许可和权限。 去console(云基础平台控制台),点击服务管理,编辑mservice-更新升级-环境变量,在appIds里增加qing_rpt 查看数据库 如果是采用公共数据源连接…...
Java并发编程,从线程安全到死锁避免的实战解析
Java并发编程是构建高性能系统的核心技能,但也伴随着复杂的挑战。本文通过实际代码示例,系统讲解线程安全、死锁、资源竞争等常见问题的解决方案,并深入探讨如何利用Java并发工具包(java.util.concurrent)构建健壮的并发程序。 一、线程安全问题与解决方案 1.1 共享资源的…...
基于Python的在线教育平台的设计与实现
标题:基于Python的在线教育平台的设计与实现 内容:1.摘要 随着互联网技术的飞速发展,在线教育平台成为了教育领域的重要组成部分。本研究的目的是设计并实现一个基于Python的在线教育平台,以满足用户多样化的学习需求。方法上,采用Python语言…...