当前位置: 首页 > news >正文

Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成

开发环境搭建

下载最新版Android Studio,安装SDK和模拟器

在Android Studio中配置:Setting → Android SDK → SDK Tools → 勾选CMake 和 NDK → Apply,按照提示下载安装

  • SDK是Android应用开发的基础工具包,适合大多数上层逻辑开发。
  • NDK是补充工具,用于需要直接控制硬件或高性能计算的场景。允许开发者使用C/C++编写高性能代码,直接运行于Android设备硬件。

创建Native C++项目

JNI:Java 原生接口

JNI中只能调用C函数(C++因为函数重载名字会被修改,所以要用extern "C"修饰)

可以在头文件中添加#include <android/log.h> ,使用

__android_log_print(*ANDROID_LOG_INFO*, "Test", "test for android log");语句测试

FFmpeg交叉编译

基础知识

应用二进制接口(ABI):armeabi / x86

  • CPU指令集
  • 内存字节序
  • 可执行二进制的格式
  • 解析的各种约定:对齐限制、堆栈使用和调用函数
  • 系统库集

常见的架构包括:

目录名架构Android ABI名称常见设备位数
aarch64-linux-androidARM64(ARMv8-A)arm64-v8a现代Android手机(如骁龙8系、天玑9000)64位
arm-linux-androideabiARMv7(兼容ARMv6)armeabi-v7a旧款手机(如骁龙625、Helio P10)32位
i686-linux-androidx86(Intel 32位)x86模拟器或老旧x86平板(如部分ZenFone)32位
x86_64-linux-androidx86-64(Intel 64位)x86_64现代x86模拟器或Chromebook64位
riscv64-linux-androidRISC-V 64位riscv64新兴架构(如部分IoT设备或实验性设备)64位

NEON(浮点数协处理器)是ARM架构中的一种SIMD(单指令多数据)指令集扩展,专门用于加速浮点数和整数运算,尤其在多媒体处理、信号计算等场景中性能提升显著。

具体步骤

网络上交叉编译Android平台的ffmpeg都是手动执行脚本,例如:https://github.com/AnJoiner/FFmpegCommand/blob/master/ffmpeg-wiki/%E7%BC%96%E8%AF%91FFmpeg.md

可是这种硬编码随着ffmpeg版本和ndk版本不同存在很大的缺陷:ndk的目录组织结构在不同版本差异很大,导致toolchain等路径都得重新设置。现代 NDK(r21+)提供了更便捷的 android.toolchain.cmake 工具链文件,可以大幅简化交叉编译流程。

  • 无需手动配置编译器路径:CMake 自动识别 NDK 中的工具链。
  • 支持多架构并行编译:通过 ANDROID_ABI 参数一键切换。
  • 更好的兼容性:避免因路径或环境变量错误导致的编译失败。

通过使用**ExternalProject_Add 命令,在 CMake 中集成外部项目的构建过程**(如 FFmpeg 这种非 CMake 项目)

include(ExternalProject)  # 必须包含该模块ExternalProject_Add(<项目名称>            # 自定义标识(如 "ffmpeg")# --- 关键参数 ---SOURCE_DIR      <path>       # 源码目录(如 ${CMAKE_SOURCE_DIR}/ffmpeg)CONFIGURE_COMMAND <cmd>      # 配置命令(如 ./configure --prefix=...)BUILD_COMMAND     <cmd>      # 构建命令(如 make -j8)INSTALL_COMMAND   <cmd>      # 安装命令(如 make install)# --- 可选参数 ---BUILD_IN_SOURCE   TRUE       # 在源码目录内构建(适用于 FFmpeg)INSTALL_DIR       <path>     # 安装路径(等价于 --prefix)DEPENDS           <targets>  # 依赖的其他 CMake 目标
)

参考官方文档:https://developer.android.com/ndk/guides/cmake?hl=zh-cn#command-line

参考编译脚本:https://umirtech.com/how-to-compile-build-ffmpeg-for-android-and-use-it-in-android-studio/

  1. 准备 FFmpeg 源码

    git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
    cd ffmpeg
    
  2. 创建**CMakeLists.txt**

    在 FFmpeg 根目录新建 CMakeLists.txt,内容如下:

    cmake_minimum_required(VERSION 3.10)
    project(ffmpeg_android)
    # 基本配置(可通过命令行参数覆盖)
    set(ANDROID_ABI "arm64-v8a" CACHE STRING "Target ABI")
    set(ANDROID_STL "c++_static" CACHE STRING "C++ STL implementation")
    set(ANDROID_PLATFORM "android-24" CACHE STRING "Android platform version")# 指定 NDK 工具链文件(通过命令行参数传递)
    if(NOT CMAKE_TOOLCHAIN_FILE)message(FATAL_ERROR "Please specify NDK toolchain file with -DCMAKE_TOOLCHAIN_FILE=")
    endif()
    # 获取 NDK 工具链路径
    set(ANDROID_NDK_TOOLCHAIN_DIR "${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin")# 从工具链文件中获取的信息
    message(STATUS "Using NDK: ${CMAKE_ANDROID_NDK}")
    message(STATUS "Using NDK toolchain dir: ${ANDROID_NDK_TOOLCHAIN_DIR}")
    message(STATUS "Target ABI: ${ANDROID_ABI}")
    message(STATUS "Android platform: ${ANDROID_PLATFORM}")
    message(STATUS "SYSROOT: ${CMAKE_SYSROOT}")
    message(STATUS "CC: ${CMAKE_C_COMPILER}")# 根据 ABI 设置 FFmpeg 特定参数
    if(ANDROID_ABI STREQUAL "arm64-v8a")set(TARGET_ARCH "aarch64")set(TARGET_CPU "armv8-a")set(TARGET_TRIPLE "aarch64-linux-android")set(EXTRA_CFLAGS "-fPIC -DANDROID -O3 -march=${TARGET_CPU} -fomit-frame-pointer")set(EXTRA_CONFIG "--enable-neon")
    elseif(ANDROID_ABI STREQUAL "armeabi-v7a")set(TARGET_ARCH "arm")set(TARGET_CPU "armv7-a")set(TARGET_TRIPLE "armv7a-linux-androideabi")set(EXTRA_CFLAGS "-fPIC -DANDROID -O3 -marm -march=${TARGET_CPU} -mfpu=neon -fomit-frame-pointer")set(EXTRA_CONFIG "--enable-neon --disable-armv5te --disable-armv6 --disable-armv6t2")
    endif()set(CMAKE_C_COMPILER "${ANDROID_NDK_TOOLCHAIN_DIR}/${TARGET_TRIPLE}${ANDROID_PLATFORM_LEVEL}-clang")
    set(CMAKE_CXX_COMPILER "${ANDROID_NDK_TOOLCHAIN_DIR}/${TARGET_TRIPLE}${ANDROID_PLATFORM_LEVEL}-clang++")# 设置 FFmpeg 配置选项
    set(ENABLED_CONFIG--enable-small--enable-avcodec--enable-avformat--enable-avutil--enable-swscale--enable-swresample--enable-demuxers--enable-parser=*--enable-decoders--enable-shared--enable-nonfree--enable-gpl--enable-small--enable-neon--enable-hwaccels--enable-avdevice--enable-jni--enable-mediacodec--enable-decoder=h264_mediacodec--enable-hwaccel=h264_mediacodec
    )set(DISABLED_CONFIG--disable-zlib--disable-v4l2-m2m--disable-cuda-llvm--disable-indevs--disable-libxml2--disable-avdevice--disable-network--disable-static--disable-debug--disable-ffmpeg--disable-ffplay--disable-ffprobe--disable-doc--disable-symver--disable-programs
    )# 添加 FFmpeg 为外部项目
    include(ExternalProject)
    ExternalProject_Add(ffmpegSOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure--prefix=${CMAKE_BINARY_DIR}/ffmpeg_install/${ANDROID_ABI}--target-os=android--arch=${TARGET_ARCH}--cpu=${TARGET_CPU}--enable-cross-compile--cross-prefix=${ANDROID_TOOLCHAIN_PREFIX}--cc=${CMAKE_C_COMPILER}--cxx=${CMAKE_CXX_COMPILER}--sysroot=${CMAKE_SYSROOT}--extra-cflags=${EXTRA_CFLAGS}--extra-ldflags="-L${CMAKE_SYSROOT}/usr/lib/${TARGET_ARCH}-linux-android/${ANDROID_PLATFORM_LEVEL}"--ar=${CMAKE_AR}--nm=${CMAKE_NM}--ranlib=${CMAKE_RANLIB}--strip=${CMAKE_STRIP}${ENABLED_CONFIG}${DISABLED_CONFIG}${EXTRA_CONFIG}BUILD_COMMAND make -j8INSTALL_COMMAND make installBUILD_IN_SOURCE TRUE
    )
    
  3. 执行 CMake 编译

    mkdir build && cd build
    # NDK=<your ndk path> # 根据你的NDK路径设置NDK变量
    # NDK=/Users/cloud.wang/Library/Android/sdk/ndk/29.0.13113456
    cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake
    make
    
  4. 输出结果

    编译后的头文件、动态库(.so 文件)会生成在 build目录的 ffmpeg_install 下的includelib目录中。

./configure报错输出的详细信息位于ffbuild/config.log文件中,如果遇到问题可以针对详细报错进行修改调试。

如果不愿意使用CMake,也可以尝试使用bash脚本,我通过参考博主MOHD UMIR的编译脚本,根据我的Mac环境进行修改后可以编译成功。

#!/bin/bash### Describe Your Target Architectures ###
ARCH_LIST=( "armv8a" ) ### Change As per Yours ####
BUILD_PLATFORM=darwin
ANDROID_API_LEVEL="24"
ANDROID_NDK_PATH="/Users/cloud.wang/Library/Android/sdk/ndk/29.0.13113456"
FFMPEG_SOURCE_DIR="/Users/cloud.wang/Code/ffmpeg7/ffmpeg-7.0.2"
FFMPEG_BUILD_DIR="/Users/cloud.wang/Code/build_ffmpeg_android"### Enable FFMPEG BUILD MODULES ####
ENABLED_CONFIG="\--enable-small \--enable-avcodec \--enable-avformat \--enable-avutil \--enable-swscale \--enable-swresample \--enable-demuxers \--enable-parser=* \--enable-decoders \--enable-shared  \--enable-nonfree \--enable-gpl \--enable-small \--enable-neon \--enable-hwaccels \--enable-avdevice \--enable-jni \--enable-mediacodec \--enable-decoder=h264_mediacodec \--enable-hwaccel=h264_mediacodec "### Disable FFMPEG BUILD MODULES ####
DISABLED_CONFIG="\--disable-zlib \--disable-v4l2-m2m \--disable-cuda-llvm \--disable-indevs \--disable-libxml2 \--disable-avdevice \--disable-network \--disable-static \--disable-debug \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-doc \--disable-symver \--disable-programs "### Dont Change ####
SYSROOT="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/sysroot"
LLVM_AR="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/llvm-ar"
LLVM_NM="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/llvm-nm"
LLVM_RANLIB="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/llvm-ranlib"
LLVM_STRIP="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/llvm-strip"configure_ffmpeg(){TARGET_ARCH=$1TARGET_CPU=$2CROSS_PREFIX=$3EXTRA_CFLAGS=$4EXTRA_CONFIG=$5CLANG="${CROSS_PREFIX}clang"CLANGXX="${CROSS_PREFIX}clang++"PREFIX="${FFMPEG_BUILD_DIR}/$TARGET_ARCH-$ANDROID_API_LEVEL"cd $FFMPEG_SOURCE_DIR./configure \--disable-everything \--target-os=android \--arch=$TARGET_ARCH \--cpu=$TARGET_CPU \--enable-cross-compile \--cross-prefix="$CROSS_PREFIX" \--cc="$CLANG" \--cxx="$CLANGXX" \--sysroot="$SYSROOT" \--prefix="$PREFIX" \--extra-cflags="-fPIC -DANDROID $EXTRA_CFLAGS" \--extra-ldflags="-L$SYSROOT/usr/lib/$TARGET_ARCH-linux-android/$ANDROID_API_LEVEL" \${ENABLED_CONFIG} \${DISABLED_CONFIG} \--ar="$LLVM_AR" \--nm="$LLVM_NM" \--ranlib="$LLVM_RANLIB" \--strip="$LLVM_STRIP" \${EXTRA_CONFIG}make cleanmake -j 8make install -j2}echo -e "\e[1;32mCompiling FFMPEG for Android...\e[0m"for ARCH in "${ARCH_LIST[@]}"; docase "$ARCH" in"armv8-a"|"aarch64"|"arm64-v8a"|"armv8a")echo -e "\e[1;32m$ARCH Libraries\e[0m"TARGET_ARCH="aarch64"TARGET_CPU="armv8-a"TARGET_ABI="aarch64"CROSS_PREFIX="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/$TARGET_ABI-linux-android${ANDROID_API_LEVEL}-"EXTRA_CFLAGS="-O3 -march=$TARGET_CPU -fomit-frame-pointer"EXTRA_CONFIG="\--enable-neon ";;"armv7-a"|"armeabi-v7a"|"armv7a")echo -e "\e[1;32m$ARCH Libraries\e[0m"TARGET_ARCH="arm"TARGET_CPU="armv7-a"TARGET_ABI="armv7a"CROSS_PREFIX="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/$TARGET_ABI-linux-androideabi${ANDROID_API_LEVEL}-"EXTRA_CFLAGS="-O3 -marm -march=$TARGET_CPU -mfpu=neon -fomit-frame-pointer"EXTRA_CONFIG="\--disable-armv5te \--disable-armv6 \--disable-armv6t2 \--enable-neon ";;"x86-64"|"x86_64")echo -e "\e[1;32m$ARCH Libraries\e[0m"TARGET_ARCH="x86_64"TARGET_CPU="x86-64"TARGET_ABI="x86_64"CROSS_PREFIX="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/$TARGET_ABI-linux-android${ANDROID_API_LEVEL}-"EXTRA_CFLAGS="-O3 -march=$TARGET_CPU -fomit-frame-pointer"EXTRA_CONFIG="\";;"x86"|"i686")echo -e "\e[1;32m$ARCH Libraries\e[0m"TARGET_ARCH="i686"TARGET_CPU="i686"TARGET_ABI="i686"CROSS_PREFIX="$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/$BUILD_PLATFORM-x86_64/bin/$TARGET_ABI-linux-android${ANDROID_API_LEVEL}-"EXTRA_CFLAGS="-O3 -march=$TARGET_CPU -fomit-frame-pointer"EXTRA_CONFIG="\--disable-asm ";;* )echo "Unknown architecture: $ARCH"exit 1;;esacconfigure_ffmpeg "$TARGET_ARCH" "$TARGET_CPU" "$CROSS_PREFIX" "$EXTRA_CFLAGS" "$EXTRA_CONFIG"
done

Android Studio配置

在编译好Android平台的ffmpeg库文件后,需要在Android Studio中进行一些配置才能够实现在Android中调用ffmpeg。

首先我们需要将头文件和库文件拷贝到项目中,最好是拷贝到src/main/cpp目录下(和CMakeLists.txt同级),拷贝后的目录结构如下:

cpp
├── CMakeLists.txt
├── include
│   └── arm64-v8a
│       ├── libavcodec
│       ├── libavfilter
│       ├── libavformat
│       ├── libavutil
│       ├── libpostproc
│       ├── libswresample
│       └── libswscale
├── lib
│   └── arm64-v8a
│       ├── libavcodec.so
│       ├── libavfilter.so
│       ├── libavformat.so
│       ├── libavutil.so
│       ├── libpostproc.so
│       ├── libswresample.so
│       └── libswscale.so
└── native-lib.cpp

接下来需要在CMakeLists.txt中配置ffmpeg的头文件和库文件,在CMakeLists.txt中添加以下内容。需要注意的是我这里目前只添加了avcodec库,实际项目中根据需要应该添加需要的所有的ffmpeg库。

# FFmpeg
message(STATUS "ANDROID_ABI: ${ANDROID_ABI}")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/${ANDROID_ABI})
set(ffmpeg_lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI})
add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib}/libavcodec.so)add_library(${CMAKE_PROJECT_NAME} SHARED# List C/C++ source files with relative paths to this CMakeLists.txt.native-lib.cpp)target_link_libraries(${CMAKE_PROJECT_NAME}# ffmpegavcodec# List libraries link to the target libraryandroidlog)

值得注意的是CMake中的${ANDROID_ABI} 变量的内容是被Android Studio自动设置的,为了指定编译的ABI,需要在build.gradle.kts(:app)中进行配置。找到android下配置添加以下内容:

defaultConfig {//...externalNativeBuild {//...ndk {abiFilters += "arm64-v8a"}}
}sourceSets {getByName("main") {jniLibs.srcDirs("src/main/cpp/lib")}
}

ndk.abiFilters指定了ndk编译的abi平台,jniLibs指定了需要打包的库文件目录。需要注意的是jniLibs要求路径下是对应abi平台名称的文件夹,文件夹中是对应的库文件。

旧版本Android Studio可能是在build.gradle中配置,基本内容是一样的,不过语法有些不同。

修改完成同步之后,在native-lib.cpp中添加以下内容:

#include <jni.h>
#include <string>
#include <android/log.h>extern "C" {
#include "libavcodec/avcodec.h"
}extern "C" JNIEXPORT jstring JNICALL
Java_com_example_androidvlc_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";hello += avcodec_configuration();__android_log_print(ANDROID_LOG_INFO, "Test", "test for android log: %s", hello.c_str());return env->NewStringUTF(hello.c_str());
}

运行成功在应用界面看到ffmpeg详细的编译信息则说明配置成功,可以在Android Studio中调用ffmpeg库。

相关文章:

Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成

开发环境搭建 下载最新版Android Studio&#xff0c;安装SDK和模拟器 在Android Studio中配置&#xff1a;Setting → Android SDK → SDK Tools → 勾选CMake 和 NDK → Apply&#xff0c;按照提示下载安装 SDK是Android应用开发的基础工具包&#xff0c;适合大多数上层逻辑…...

Spring AI 快速入门:从环境搭建到核心组件集成

Spring AI 快速入门&#xff1a;从环境搭建到核心组件集成 一、前言&#xff1a;Java开发者的AI开发捷径 对于Java生态的开发者来说&#xff0c;将人工智能技术融入企业级应用往往面临技术栈割裂、依赖管理复杂、多模型适配困难等挑战。Spring AI的出现彻底改变了这一局面——…...

研发内控新规下的合规之道:维拉工时助力企业穿越IPO审查雷区

&#x1f4cc; 背景 | 全面注册制下&#xff0c;研发内控成“必修课” 在全面注册制背景下&#xff0c;证监会发布的《监管规则适用指引——发行类第9号&#xff1a;研发人员及研发投入》&#xff08;简称“发行类9号”&#xff09;&#xff0c;对企业的研发费用归集、研发工时…...

PyTorch生成式人工智能实战(3)——分类任务详解

PyTorch生成式人工智能实战&#xff08;3&#xff09;——分类任务详解 0. 前言1. 使用 PyTorch 进行端到端的深度学习1.1 PyTorch 深度神经网络训练流程1.2 数据预处理 2. 二分类2.1 创建数据批次2.2 模型构建与训练2.3 模型测试 3. 多类别分类3.1 验证集和提前停止3.2 模型构…...

单机无穷大系统暂态稳定性仿真Matlab模型

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他低版本可联系代为转换&#xff09; 电力系统是一个复杂的动态系统&#xff0c;系统一旦出现稳定性问题&#xff0c;可…...

12个HPC教程汇总!从入门到实战,覆盖分子模拟/材料计算/生物信息分析等多个领域

在科学研究、工程仿真、人工智能和大数据分析等领域&#xff0c;高性能计算 (High Performance Computing, HPC) 正扮演着越来越重要的角色。它通过并行处理、大规模计算资源的整合&#xff0c;极大提升了计算效率&#xff0c;使原本耗时数日的任务能够在数小时内完成。 随着计…...

零基础快速搭建AI绘画网站!用Gradio玩转Stable Diffusion

借助Gradio&#xff0c;简单几行Python代码即可快速搭建一个专属的AI绘画网站&#xff0c;轻松部署Stable Diffusion文生图应用&#xff0c;gradio自带的组件已经相当美化了&#xff0c;前端基础也省了&#xff01; 好像大神的Stable Diffusion WebUI项目也是用的Gradio搭建的&…...

SpringCloud搭建Eureka注册中心

1、Eureka 的简介 Eureka 是 Netflix 开源的 ‌服务注册与发现框架‌,后被 Spring Cloud 集成为核心组件,用于解决微服务架构中服务治理问题。其核心目标是通过动态管理服务实例信息,实现服务间的透明通信与负载均衡。Eureka 通过简洁的 Server-Client 模型,结合心跳、缓存…...

信息学奥赛一本通 1509:【例 1】Intervals | OpenJudge 百练 1201:Intervals

【题目链接】 ybt 1509&#xff1a;【例 1】Intervals OpenJudge 百练 1201:Intervals 【题目考点】 1. 贪心算法 树状数组 并查集 2. 差分约束算法 【解题思路】 解法1&#xff1a;贪心算法树状数组、并查集优化 该题属于区间选点问题&#xff0c;ybt 1324&#xff1a;…...

电子电子架构 --- 主机厂视角下ECU开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

⭐Unity_Demolition Media Hap (播放Hap格式视频 超16K大分辨率视频 流畅播放以及帧同步解决方案)

播放大分辨率视频以及实现局域网视频同步是许多开发者会遇到的需求&#xff0c;AVPro有一个 Ultra Edition版本,也能播放Hap格式视频,之外就是Demolition Media Hap插件啦&#xff0c;实测即使是 7208*3808 大分辨率的视频帧率还是能稳定在30帧&#xff0c;它能帮助我们轻松解决…...

【MySQL】MySQL索引与事务

目录 前言 1. 索引 &#xff08;index&#xff09; 1.1 概念 1.2 作用 1.3 使用场景 1.4 索引的相关操作 查看索引 创建索引 删除索引 2. 索引背后的数据结构 2.1 B树 2.2 B&#xff0b;树的特点 2.3 B&#xff0b;树的优势 3. 事务 3.1 为什么使用事务 3.2 事…...

Apache Spark 源码解析

Apache Spark 是一个开源的分布式计算系统&#xff0c;提供了高效的大规模数据处理能力。下面我将对 Spark 的核心源码结构进行解析。 核心架构 Spark 的主要代码模块包括&#xff1a; Core (核心模块) 包含 Spark 的基本功能&#xff0c;如任务调度、内存管理、错误恢复等 …...

MySQL的日志--Undo Log【学习笔记】

MySQL的日志--Undo Log 知识来源&#xff1a; 《MySQL是怎样运行的》--- 小孩子4919 为了保证事务的原子性&#xff0c;当事务中途遇到各种错误需要将数据回滚&#xff08;rollback&#xff09;到原来的样子。为此MySQL提出撤销日志&#xff08;Undo Log&#xff0c;也称undo日…...

一洽 全力辅助商户平台在线咨询解决方案

在商业数字化转型加速的背景下&#xff0c;客户对高效服务的需求日益增强。商户平台需要通过优化在线咨询服务&#xff0c;提升客户沟通效率与服务质量。一套综合性的在线咨询解决方案&#xff0c;通过整合多维度功能与智能技术&#xff0c;能够有效满足商户与客户的双向需求&a…...

ctfshow-web-新春欢乐杯

这几天做了这个新春欢乐杯&#xff0c;对于我这个小萌新来说有难度&#xff0c;同时也是收获满满&#xff0c;以下是我解题流程和收获 热身 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-01-16 15:42:02 # Last Modified by: h1xa # Last Modified …...

信奥赛之c++基础(初识循环嵌套与ASCII密码本)

🎠 游乐园编程奇遇记——循环嵌套与ASCII密码本 🎡 第一章:摩天轮与旋转木马——循环嵌套 🎪 游乐场里的双重循环 for(int 排数=1; 排数<=3; 排数++){// 外层循环像摩天轮for(int 座位=1; 座位<=5; 座位++){// 内层循环像旋转木马cout << "🎪"…...

同一电脑下使用 python2 和 python3

我本地先安装的2&#xff0c;然后再安装3。在电脑的环境变量 - Path 内&#xff0c;发现3的路径没有被加上&#xff0c;所以在cmd内输入python调用的是python2目录下的python.exe文件。pip.exe则是在Python/Scripts目录下&#xff0c;也就是默认调用的pip也是2的。 解决方案&…...

第十二届蓝桥杯 2021 C/C++组 直线

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 两点确定一条直线&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 第一种方式代码详解&#xff1a; 第二种方式代码详解&#xff1a; 题目&#xff1a;…...

向量数据库实践:存储和检索向量数据

向量数据库是一种专门设计用于存储和检索向量嵌入的数据库系统&#xff0c;能够支持语义搜索、推荐系统、图像识别等 AI 应用场景。 下面将详细介绍向量数据库中向量数据的存储和检索原理及实际应用&#xff0c;希望对各位读者有所帮助。 一. 向量数据的存储与检索流程 在向量…...

Pandas 数据导出:如何将 DataFrame 追加到 Excel 的不同工作表

在数据分析和数据处理过程中&#xff0c;将数据导出到 Excel 文件是一个常见的需求。Pandas 提供了强大的功能来实现这一需求&#xff0c;尤其是将数据追加到同一个 Excel 文件的不同工作表&#xff08;Sheet&#xff09;中。本文将详细介绍如何使用 Pandas 实现这一功能&#…...

区块链驱动的供应链金融创新:模型构建与商业化路径研究

区块链驱动的供应链金融创新&#xff1a;模型构建与商业化路径研究 1. 研究背景与意义 1.1 背景介绍 全球供应链金融市场规模预计2025年将达到3.6万亿美元&#xff0c;但传统模式面临四大核心问题&#xff1a;信息孤岛导致信任成本高昂&#xff08;占交易成本15-20%&#xf…...

DAX Studio将PowerBI与EXCEL连接

DAX Studio将PowerBI与EXCEL连接 具体步骤如下&#xff1a; 第一步&#xff1a;先打开一个PowerBI的文件&#xff0c;在外部工具栏里打开DAXStudio&#xff0c;如图&#xff1a; 第二步&#xff1a;DAXStudio界面&#xff0c;点击Advanced选项卡-->Analyze in Excel&#…...

使用springboot+easyexcel实现导出excel并合并指定单元格

1&#xff1a;准备一个单元格合并策略类代码&#xff1a; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.Writ…...

conformer编码器

abstract 最近,基于Transformer和卷积神经网络(CNN)的模型在自动语音识别(ASR)中显示出有希望的结果,优于递归神经网络(RNN)。Transformer模型擅长捕捉基于内容的全局交互,而CNN则有效地利用了局部特征。在这项工作中,我们通过研究如何将联合收割机卷积神经网络和tr…...

每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)

洛谷P1060 马拉松接力赛题解&#xff1a;贪心算法在资源分配中的巧妙应用 题目描述 P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手&#xff0c;使得总耗时最短。每位选手可跑1-10公里的整数距离&…...

操作指南:vLLM 部署开源大语言模型(LLM)

vLLM 是一个专为高效部署大语言模型&#xff08;LLM&#xff09;设计的开源推理框架&#xff0c;其核心优势在于显存优化、高吞吐量及云原生支持。 vLLM 部署开源大模型的详细步骤及优化策略&#xff1a; 一、环境准备与安装 安装 vLLM 基础安装&#xff1a;通过 pip 直接安装…...

目前市面上知名的数据采集器

程序员爱自己动手打造一切&#xff0c;但这样离钱就会比较远。 市面上知名的数据采集工具 数据采集工具&#xff08;也称为网络爬虫或数据抓取工具&#xff09;在市场上有很多选择&#xff0c;以下是目前比较知名和广泛使用的工具分类介绍&#xff1a; 一、开源免费工具 Scra…...

BitNet: 微软开源的 1-bit 大模型推理框架

GitHub&#xff1a;https://github.com/microsoft/BitNet 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 微软专为 CPU 本地推理和极致压缩&#xff08;低比特&#xff09;大模型设计的推理框架。它支持对 1-bit/1.58-bit 量化模型进行…...

前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南

文章目录 前言一、Hash 值为何重要&#xff1f;二、Hash 值基础知识2.1 什么是 Hash&#xff1f;2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法&#xff08;MD5、SHA 系列&#xff09; 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...

Java与Kotlin在Android开发中的全面对比分析

趋势很重要 语言发展背景与现状 Android操作系统自2008年正式发布以来&#xff0c;Java长期作为其主要的开发语言。这种选择源于Java语言的跨平台特性、成熟的生态系统以及广泛开发者基础。然而&#xff0c;随着移动开发需求的快速演变&#xff0c;Java在Android开发中逐渐暴…...

Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南

一、基础配置与概念 1. 什么是 appModule appModule 是 Koin 依赖注入框架中的核心配置模块&#xff0c;用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块&#xff08;org.koin.core.module.Module&#xff09;&#xff0c;通过 DSL 方式声明各种组件的创建方式和依…...

Flink TaskManager详解

1. TaskManager 概述 Apache Flink 的 TaskManager 是作业执行的核心工作节点&#xff0c;负责实际的数据处理任务。它与 JobManager 协同工作&#xff0c;接受其调度指令&#xff0c;管理本地资源&#xff08;如 CPU、内存、网络&#xff09;&#xff0c;并执行具体的算子&am…...

Docker安装(Ubuntu22版)

前言 你是否还在为Linux上配置Docker而感到烦恼&#xff1f; 你是否还在为docker search&#xff0c;docker pull连接不上&#xff0c;而感到沮丧&#xff1f; 本文将解决以上你的所有烦恼&#xff01;快速安装好docker&#xff01; Docker安装 首先&#xff0c;我们得先卸载…...

《深入浅出ProtoBuf:从环境搭建到高效数据序列化》​

ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1&#xff1a;创建.proto文件3.2、步骤2&#xff1a;编译contacts.proto文件&#xff0c;生成C文件3.3、步骤3&#xff1a;序列化…...

【含文档+PPT+源码】基于微信小程序连锁药店商城

项目介绍 本课程演示的是一款基于微信小程序连锁药店商城&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…...

再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除

在开发应用程序时&#xff0c;我们经常会遇到需要删除数据的场景。但直接从数据库中物理删除&#xff08;DELETE​&#xff09;数据有时并非最佳选择。为什么呢&#xff1f; 数据恢复: 一旦物理删除&#xff0c;数据通常难以恢复&#xff0c;误操作可能导致灾难性后果。审计追…...

uni-app中获取用户实时位置完整指南:解决权限报错问题

uni-app中获取用户实时位置完整指南&#xff1a;解决权限报错问题 在uni-app开发运行在微信小程序时&#xff0c;获取用户位置信息是一个常见的需求&#xff0c;无论是用于地图导航、附近推荐还是其他基于位置的服务。然而&#xff0c;许多开发者在调用位置相关API时会遇到各种…...

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提问&#xff1a;对选中的文本内容进行AI分析&#xff0c;通过侧边栏聊天界面与AI交互&#xff0c;实现多轮对话、问题解答或代码生成。对话式提问&#xff1a;独…...

UnityEditor - 调用编辑器菜单功能

例如: 调用Edit/Frame Selected In Scene EditorApplication.ExecuteMenuItem("Edit/Frame Selected in Scene"); EditorApplication.ExecuteMenuItem("Edit/Lock view to Selected");...

OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;十&#xff09; 十四、魔法键使用方法 使用场景 在系统运行出现无响应等情况时&#xff0c;可以通过魔法键功能确定系统是否被锁中断&#xff08;魔法键也无响应&#xff09;或者查看系统任务运行状态…...

在 Vue3 中封装的 Axios 实例中,若需要为部分接口提供手动取消请求的功能

核心思路 封装接口时返回 Promise 和 abort 方法&#xff1a; 为需要支持取消的接口返回一个对象&#xff0c;包含 promise 和 abort 方法&#xff0c;用户可通过 abort 主动中断请求。使用 AbortController 或 CancelToken&#xff1a; 推荐 AbortController&#xff08;浏览…...

QuecPython+audio:实现音频的录制与播放

概述 QuecPython 作为专为物联网设计的开发框架&#xff0c;通过高度封装的 Python 接口为嵌入式设备提供了完整的音频处理能力。本文主要介绍如何利用 QuecPython 快速实现音频功能的开发。 核心优势 极简开发&#xff1a;3行代码完成基础音频录制与播放。快速上手&#xf…...

Langchain入门介绍

[声明] 本文参考:Langchain官方文档 什么是LangChain? LangChain 是一个开源的、用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。它的核心目标是将强大的 LLM&#xff08;如 GPT-4, Claude, Llama 等&#xff09;与外部数据源、计算资源和工具连接起来&#xff0c;从…...

WebUI可视化:第4章:Streamlit数据可视化实战

学习目标 ✅ 掌握Streamlit的安装与基础配置 ✅ 能够创建数据驱动的交互式界面 ✅ 实现常见图表(折线图、柱状图等)的绘制 ✅ 开发完整的业务数据分析应用 4.1 Streamlit快速入门 4.1.1 环境安装 打开终端执行: bash pip install streamlit 验证安装: bash stream…...

3.4 Spring Boot异常处理

本实战项目通过Spring Boot实现了一个简单的用户信息查询功能&#xff0c;并展示了如何自定义异常处理机制。项目中创建了用户实体类User和用户控制器UserController&#xff0c;在控制器中通过isValidUserId方法校验用户ID是否有效&#xff0c;若无效则抛出自定义异常InvalidU…...

期货有哪些种类?什么是股指、利率和外汇期货?

期货主要可以分成两大类&#xff1a;商品期货和金融期货。商品期货&#xff0c;顾名思义&#xff0c;就是跟实物商品有关的期货&#xff0c;比如农产品、金属、能源这些。金融期货呢&#xff0c;就是跟金融产品有关的期货&#xff0c;比如外汇、利率、股票指数这些。 一、商品…...

Golang | 位运算

位运算比常规运算快&#xff0c;常用于搜索引擎的筛选功能。例如&#xff0c;数字除以二等价于向右移位&#xff0c;位移运算比除法快。...

[论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models

ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models ICLR 2023 这是一篇在2022年挂出来的论文&#xff0c;不要以现在更加强大且性能综合的LLM来对这篇文章进行批判。 思想来源于作者对…...

拥有600+门店的宠物连锁医院,实现核心业务系统上云

瑞派宠物医院管理股份有限公司&#xff08;以下简称“瑞派宠物“&#xff09;从2017年开始数字化转型之路。瑞派宠物在全国有600连锁门店&#xff0c;随着业务量增加&#xff0c;线下部署的财务系统存在设备老旧、机房环境差等问题&#xff0c;部分在公有云上的业务&#xff0c…...