2.2 Windows MSYS2編譯FFmpeg 4.4.1

一、安裝編譯工具

# 更換pacman源
sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
pacman -Sy# 安裝依賴
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-yasm
pacman -S git pkg-config

說明:

  • base-devel:提供編譯和開發軟件所需的基礎工具集,包含 常用的工具如 make, patch, autoconf, automake, libtool, gettext, texinfo 等
  • mingw-w64-x86_64-toolchain :MinGW-w64 的完整工具鏈,用于在 Windows 上編譯 64 位應用程序,包含 編譯器(如 gcc, g++)、鏈接器、調試器(gdb)以及相關的開發庫和頭文件。
  • mingw-w64-x86_64-nasm:NASM(Netwide Assembler)是一個開源的 x86 和 x86-64 匯編器。
  • mingw-w64-x86_64-yasm:YASM 是一個模塊化的匯編器,支持 x86 和 x86-64 架構,兼容 NASM 語法。
  • git:用于從 Git 倉庫下載源碼(如 git clone)。
  • pkg-config:用于檢索已安裝庫的編譯和鏈接信息。

二、通過pacman安裝依賴

2.1 常見依賴庫

查詢包名 網址:packages.msys2.org/queue

分類庫名稱用途FFmpeg 配置選項pacman 安裝命令
視頻編碼libx264H.264 視頻編碼(高效、廣泛使用的視頻編碼標準)--enable-libx264pacman -S mingw-w64-x86_64-x264
libx265H.265/HEVC 視頻編碼(高壓縮率,適用于 4K/8K 視頻)--enable-libx265pacman -S mingw-w64-x86_64-x265
libvpxVP8/VP9 視頻編碼(WebM 格式,適用于網絡視頻)--enable-libvpxpacman -S mingw-w64-x86_64-libvpx
libtheoraTheora 視頻編碼(開源視頻格式)--enable-libtheorapacman -S mingw-w64-x86_64-libtheora
libwebpWebP 圖像和視頻編碼(高效圖像壓縮格式)--enable-libwebppacman -S mingw-w64-x86_64-libwebp
libaomAV1 視頻編碼(下一代開源視頻編碼,高效壓縮)--enable-libaompacman -S mingw-w64-x86_64-libaom
libdav1dAV1 視頻解碼(高性能 AV1 解碼器,適合播放)--enable-libdav1dpacman -S mingw-w64-x86_64-dav1d
libxvidMPEG-4 視頻編碼(老式但仍使用的視頻編碼標準)--enable-libxvidpacman -S mingw-w64-x86_64-xvidcore
音頻編碼libfdk-aacAAC 音頻編碼(高質量音頻編碼,支持 HE-AAC)--enable-libfdk-aacpacman -S mingw-w64-x86_64-fdk-aac
libmp3lameMP3 音頻編碼(廣泛使用的音頻格式)--enable-libmp3lamepacman -S mingw-w64-x86_64-lame
libopusOpus 音頻編碼(低延遲、高質量,適合網絡傳輸)--enable-libopuspacman -S mingw-w64-x86_64-opus
libvorbisVorbis 音頻編碼(開源音頻格式,常用于 Ogg 容器)--enable-libvorbispacman -S mingw-w64-x86_64-libvorbis
libspeexSpeex 音頻編碼(針對語音優化的壓縮格式)--enable-libspeexpacman -S mingw-w64-x86_64-speex
libflacFLAC 音頻編碼(無損音頻壓縮格式)--enable-libflacpacman -S mingw-w64-x86_64-flac
其他常用功能libass字幕渲染(支持 ASS/SSA 字幕格式)--enable-libasspacman -S mingw-w64-x86_64-libass
zlib數據壓縮(用于壓縮和解壓文件或流)--enable-zlibpacman -S mingw-w64-x86_64-zlib
freetype字體渲染(用于字幕和文本繪制)--enable-libfreetypepacman -S mingw-w64-x86_64-freetype
fontconfig字體管理(優化字體選擇和配置)--enable-fontconfigpacman -S mingw-w64-x86_64-fontconfig
openal音頻處理(支持 3D 音頻和空間音效)--enable-openalpacman -S mingw-w64-x86_64-openal
libsdl2多媒體交互(用于 ffplay 的圖形界面和音頻輸出)--enable-sdl2pacman -S mingw-w64-x86_64-libsdl2
openssl支持 HTTPS 和其他加密協議(如 RTMPS)--enable-opensslpacman -S mingw-w64-x86_64-openssl
librtmpRTMP 流媒體協議支持(用于直播推流/拉流)--enable-librtmppacman -S mingw-w64-x86_64-librtmp
libpngPNG 圖像支持(用于圖像處理和幀提取)--enable-libpngpacman -S mingw-w64-x86_64-libpng
libjpeg-turboJPEG 圖像支持(加速 JPEG 編碼/解碼)--enable-libjpegpacman -S mingw-w64-x86_64-libjpeg-turbo

2.2 ffmpeg編譯安裝

最小化配置:x264、x265、fdk-aac 和 lame

安裝依賴

pacman -S mingw-w64-x86_64-x264 mingw-w64-x86_64-x265 mingw-w64-x86_64-fdk-aac mingw-w64-x86_64-lame

ffmpeg 4.4.1 編譯:

wget https://ffmpeg.org/releases/ffmpeg-4.4.1.tar.xz
tar xf ffmpeg-4.4.1.tar.xz && cd ffmpeg-4.4.1./configure \
--prefix=$(pwd)/../ffmpeg_build \
--disable-everything \
--disable-doc \
--enable-shared \
--enable-muxer=mp4,flv,mp3,wav \
--enable-demuxer=mp4,mov,mp3,aac \
--enable-encoder=libx264,libx265,libfdk_aac,libmp3lame \
--enable-decoder=aac,h264,hevc,mp3 \
--enable-protocol=file,http \
--enable-filter=aresample \
--enable-bsf=aac_adtstoasc \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libmp3lame \
--extra-cflags="-I$(pwd)/../3rdparty_mingw64/include" \
--extra-ldflags="-L$(pwd)/../3rdparty_mingw64/lib"# 可能報shr錯誤,修改完再編譯。
make -j$(nproc) && make install

編譯錯誤:“Error: operand type mismatch for shr” 是由于匯編代碼中存在類型不匹配的錯誤,導致無法通過匯編階段編譯。
在這里插入圖片描述

解決辦法:修改libavcodec/x86/mathops.h代碼

  • ci改為c
  • ic改為c
#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{int rt, dummy;__asm__ ("imull %3               \n\t""shrdl %4, %%edx, %%eax \n\t":"=a"(rt), "=d"(dummy)//:"a"(a), "rm"(b), "ci"((uint8_t)shift):"a"(a), "rm"(b), "c"((uint8_t)shift));return rt;
}
#define NEG_SSR32 NEG_SSR32
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){__asm__ ("sarl %1, %0\n\t": "+r" (a)//: "ic" ((uint8_t)(-s)): "c" ((uint8_t)(-s)));return a;
}#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){__asm__ ("shrl %1, %0\n\t": "+r" (a)//: "ic" ((uint8_t)(-s)): "c" ((uint8_t)(-s)));return a;
}

參考:https://blog.csdn.net/qq_47733361/article/details/132901423

這是編譯后的庫文件:

./
├── bin  # dll動態庫、x.lib動態庫導入庫
│   ├── avcodec-58.dll
│   ├── avcodec.lib
│   ├── ...
│   └── swscale.lib
├── include
│   ├── ....
│   └── libswscale
├── lib                    # .def庫的函數導出文件,.dll.a 是動態庫導入庫
│   ├── avcodec-58.def
│   ├── libavcodec.dll.a
│   ├── .....
│   └── swscale-5.def
└── share└── ffmpeg

三、ffmpeg依賴庫(手動編譯安裝)

庫類型:依賴庫為動態庫+ffmpeg為動態庫

3.1 編譯依賴庫

設置終端代理(僅當前會話有效):

export http_proxy="http://127.0.0.1:11819"
export https_proxy="http://127.0.0.1:11819"

(1)編譯x264

# 下載源碼
git clone https://code.videolan.org/videolan/x264.git# 配置
./configure \
--prefix=$(pwd)/../3rdparty_mingw64 \
--enable-shared \
--disable-cli# 編譯安裝
make -j$(nproc) && make install

(2)編譯x265

注意: 不要使用pacman安裝的cmake,因為無法生成指定構建系統文件。

# 如果已安裝,則重命名cmake
mv /usr/bin/cmake /usr/bin/cmake_bak# 設置環境變量,系統安裝的cmake路徑是:D:\Program\Program Files\CMake\bin
export PATH="/d/Program/Program Files/CMake/bin:$PATH"
# 下載源碼
git clone https://bitbucket.org/multicoreware/x265_git.git# 配置(只編譯靜態庫,而且設定運行時庫為靜態庫)
mkdir tmp && cd tmp# 不能使用cmake -G "MinGW Makefiles" 會卡死
cmake -G "MSYS Makefiles" \
-DCMAKE_INSTALL_PREFIX=$(pwd)/../../3rdparty_mingw64 \
-DENABLE_SHARED=ON \
-DENABLE_CLI=OFF \
../source# 編譯安裝
make -j$(nproc) && make install

(3)編譯fdk-aac

# 下載源碼
wget https://sourceforge.net/projects/opencore-amr/files/fdk-aac/fdk-aac-2.0.1.tar.gz
tar -xf fdk-aac-2.0.1.tar.gz && cd fdk-aac-2.0.1/# 生成configure腳本(可選)
./autogen.sh# 配置
./configure \
--prefix=$(pwd)/../3rdparty_mingw64 \
--enable-shared=yes \
--enable-static=no# 編譯安裝
make -j$(nproc) && make install

(4)編譯lame

# 下載源碼
wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz# 配置
./configure \
--prefix=$(pwd)/../3rdparty_mingw64 \
--enable-shared=yes \
--enable-static=no \
--disable-frontend# 編譯安裝
make -j$(nproc) && make install

編譯問題:無法導出lame_init_old函數
在這里插入圖片描述
解決辦法:在include/libmp3lame.sym文件刪除lame_init_old函數。

3.2 編譯ffmpeg

# 下載源碼
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg-4.4.1
cd ffmpeg-4.4.1
git checkout n4.4.1# 設置.pc文件搜索路徑
export PKG_CONFIG_PATH=$(pwd)/../3rdparty_mingw64/lib/pkgconfig:$PKG_CONFIG_PATH# 配置
./configure \
--prefix=$(pwd)/../ffmpeg_build \
--disable-everything \
--disable-doc \
--enable-shared \
--enable-muxer=mp4,flv,mp3,wav \
--enable-demuxer=mp4,mov,mp3,aac \
--enable-encoder=libx264,libx265,libfdk_aac,libmp3lame \
--enable-decoder=aac,h264,hevc,mp3 \
--enable-protocol=file,http \
--enable-filter=aresample \
--enable-bsf=aac_adtstoasc \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libmp3lame \
--extra-cflags="-I$(pwd)/../3rdparty_mingw64/include" \
--extra-ldflags="-L$(pwd)/../3rdparty_mingw64/lib"# 編譯安裝
make -j$(nproc) && make install

四、vscode使用ffmpeg庫

項目目錄結構:

./
├── 3rd               # 第三方依賴庫
│   └── ffmpeg_4.4.1 
│       ├── include   # 頭文件
│       ├── lib       # 靜態庫庫
│       └── share
├── build			  # 編譯目錄
├── CMakeLists.txt    # cmake配置文件
├── set_env.ps1       # msys2配置腳本(使我們能在powershell上使用msys2)
└── src               # 源碼目錄└── main.c

CMakeLists.txt文件內容:

cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test VERSION 1.0)set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED True)# 設置可執行文件輸出目錄為 bin  
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)# 配置FFmpeg(avcodec.lib時動態庫的導入庫)
set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ffmpeg-4.4.1)
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS
${FFMPEG_DIR}/bin/avdevice.lib
${FFMPEG_DIR}/bin/avfilter.lib
${FFMPEG_DIR}/bin/avformat.lib
${FFMPEG_DIR}/bin/avcodec.lib
${FFMPEG_DIR}/bin/swscale.lib
${FFMPEG_DIR}/bin/swresample.lib
${FFMPEG_DIR}/bin/avutil.lib
)# 編譯和鏈接依賴庫
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} PRIVATE ${FFMPEG_LIBS} )# 使用file(GLOB)獲取所有DLL文件
file(GLOB FFMPEG_DLLS "${FFMPEG_DIR}/bin/*.dll")# 添加自定義命令,在構建后復制DLL文件到輸出目錄
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${FFMPEG_DLLS}"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)

set_env.ps1腳本內容:

# =============================================================================
#                          MSYS2 配置參數(可修改)
# =============================================================================
# MSYS2安裝路徑
$MSYS2_DIR = "D:\Program\msys64"# 選擇MSYS2子系統: MINGW64, MINGW32, MSYS, CLANG64
$MSYSTEM = "MINGW64"# 是否繼承當前環境變量PATH (yes=繼承, no=不繼承)
$MSYS2_PATH_TYPE = "inherit"
# =============================================================================
#                          以下內容請勿修改
# =============================================================================
# 設置輸出編碼為 UTF-8
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8# 檢查 MSYS2 目錄是否存在
if (-not (Test-Path $MSYS2_DIR)) {Write-Error "Error: MSYS2 directory not found at $MSYS2_DIR"Write-Error "Please update MSYS2_DIR in this script to your MSYS2 installation path."exit 1
}# 設置基本環境變量
$env:MSYS = "winsymlinks:nativestrict"
$env:MSYS2_ARG_CONV_EXCL = "*"
$env:MSYSTEM = $MSYSTEM
$env:MSYS2_PATH_TYPE = $MSYS2_PATH_TYPE# 更新 PATH 環境變量
$env:Path = "$MSYS2_DIR\$MSYSTEM\bin;$MSYS2_DIR\usr\bin;$env:Path"Write-Host "MSYS2 $MSYSTEM environment loaded successfully."
Write-Host ""# 驗證環境
$bashPath = "$MSYS2_DIR\usr\bin\bash.exe"
if (Test-Path $bashPath) {Write-Host ""Write-Host "MSYS2 Environment Information:"Write-Host "----------------------------"try {$unameOutput = & $bashPath -c "uname -a"if ($LASTEXITCODE -eq 0) {Write-Host $unameOutput} else {Write-Warning "Failed to execute uname command"exit 1}} catch {Write-Warning "Failed to execute uname command"exit 1}Write-Host "----------------------------"Write-Host "MSYS2 environment loaded successfully."Write-Host ""
} else {Write-Error "Error: bash.exe not found at $bashPath"exit 1
}# 查看 系統上所有環境變量
# Get-ChildItem Env:# 查看powershell配置文件內容
# notepad $PROFILE

main.c文件內容:

#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>int main() {// 待檢查的編解碼器列表const char *codecs[] = {"libx264",    // H.264 編碼器"libx265",    // HEVC 編碼器"libfdk_aac", // AAC 編碼器"libmp3lame", // MP3 編碼器NULL          // 結束標記};printf("FFmpeg 集成編解碼器狀態檢查:\n");printf("===========================\n");// 遍歷并檢查每個編解碼器for (int i = 0; codecs[i] != NULL; i++) {const AVCodec *codec = avcodec_find_encoder_by_name(codecs[i]);if (!codec) {// 若編碼器未找到,嘗試查找解碼器codec = avcodec_find_decoder_by_name(codecs[i]);}if (codec) {printf("[?] %-12s : 已啟用 (類型: %s)\n", codecs[i], codec->type == AVMEDIA_TYPE_VIDEO ? "視頻" : "音頻");} else {printf("[?] %-12s : 未啟用或未編譯\n", codecs[i]);}}return 0;
}

構建命令

# 在vscode的powershell 執行set_env.ps1腳本,配置msys2
.\set_env.ps1# 生成構建系統(在項目根目錄下執行)
cmake .. -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++# 編譯(在build目錄下執行)
cmake --build . --config Release

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85268.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

驅動開發,隊列,環形緩沖區:以GD32 CAN 消息處理為例

對環形緩沖區進行進一步的優化和功能擴展&#xff0c;以應對更復雜的實際應用場景&#xff0c;特別是針對 CAN 總線消息處理的場景。 一、優化點 1&#xff1a;動態配置環形緩沖區大小在原始實現中&#xff0c;我們固定了緩沖區大小為 RINGBUFF_LEN 64。這種方式雖然簡單&am…

SQL基礎知識,MySQL學習(長期更新)

1、基本操作&#xff0c;增刪查改 INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...); DELETE FROM 表名 WHERE 條件 SELECT * FROM 表名 WHERE 條件 UPDATE 表名 SET 字段1 值, 字段2 值, ... WHERE 條件; SELECT * INTO 新表 FROM 舊表 WHERE… INSERT INTO 語…

Git(一):初識Git

文章目錄 Git(一)&#xff1a;初識GitGit簡介核心功能分布式特性結構與操作優勢與適用場景 創建本地倉庫git init配置name與email--global 工作區、暫存區與版本庫git addgit commitcommit后.git的變化 Git(一)&#xff1a;初識Git Git簡介 Git 是一個分布式版本控制系統&…

第19天:初級數據庫學習筆記3

分組函數&#xff08;多行處理函數&#xff09; 即多個輸入對應一個輸出。前面講的數據處理函數是單行處理函數。&#xff08;在公司中常說單&#xff0c;多行處理函數&#xff09; 分組函數包括五個&#xff1a; max&#xff1a;最大值min&#xff1a;最小值avg&#xff1a…

Windows11下搭建Raspberry Pi Pico編譯環境

1. 系統與工具要求 PC平臺&#xff1a; Windows 11 專業版 Windows GCC: gcc-15.1.0-64.exe GNU Make: 4.3 Git: 2.49.0 cmake: 4.0.2 python:3.12.11 Arm GNU Toolchain Downloads – Arm Developer 2. 工具安裝與驗證 2.1 工具安裝 winget安裝依賴工具&#xff08;Windows …

【C語言極簡自學筆記】重講運算符

一、算術操作符 算術操作符描述把兩個操作數相加-第一個操作數減去第二個操作數*把兩個操作數相乘/分子除以分母%取模運算符&#xff0c;整除后的余數 注意&#xff1a;1.除號的兩端都是整數的時候執行的是整數的除法&#xff0c;兩端只要有一個浮點數&#xff0c;就執行浮點…

持續集成 CI/CD-Jenkins持續集成GitLab項目打包docker鏡像推送k8s集群并部署至rancher

Jenkins持續集成GitLab項目 GitLab提交分支后觸發Jenkis任務 之前是通過jar包在shell服務器上進行手動部署&#xff0c;麻煩且耗時。現通過Jenkins進行持續集成實現CI/CD。以test分支為例 提交即部署。 由于是根據自己實際使用過程 具體使用到了 gitlabjenkinsdockerharborra…

Apache Iceberg與Hive集成:非分區表篇

引言 在大數據處理領域&#xff0c;Apache Iceberg憑借其先進的表格式設計&#xff0c;為大規模數據分析帶來了新的可能。當Iceberg與Hive集成時&#xff0c;這種強強聯合為數據管理與分析流程提供了更高的靈活性和效率。本文將聚焦于Iceberg與Hive集成中的非分區表場景&#…

webpack 如何區分開發環境和生產環境

第一種方法: 方法出處&#xff1a;命令行接口&#xff08;CLI&#xff09; | webpack 中文文檔 1.利用webpack.config.js 返回的是個函數&#xff0c;利用函數的參數&#xff0c;來區分環境 具體步驟 1&#xff09; package.json文件&#xff1a;在npm scripts 命令后面追加 …

React組件通信——context(提供者/消費者)

Context 是 React 提供的一種組件間通信方式&#xff0c;主要用于解決跨層級組件 props 傳遞的問題。它允許數據在組件樹中"跨級"傳遞&#xff0c;無需顯式地通過每一層 props 向下傳遞。 一、Context 核心概念 1. 基本組成 React.createContext&#xff1a;創建 C…

“微信短劇小程序開發指南:從架構設計到上線“

1. 引言&#xff1a;短劇市場的機遇與挑戰 近年來&#xff0c;短視頻和微短劇市場呈現爆發式增長&#xff0c;用戶碎片化娛樂需求激增。短劇小程序憑借輕量化、社交傳播快、變現能力強等特點&#xff0c;成為內容創業的新風口。然而&#xff0c;開發一個穩定、流暢且具備商業價…

RPC與RESTful對比:兩種API設計風格的核心差異與實踐選擇

# RPC與RESTful對比&#xff1a;兩種API設計風格的核心差異與實踐選擇 ## 一、架構哲學與設計目標差異 1. **RPC&#xff08;Remote Procedure Call&#xff09;** - **核心思想**&#xff1a;將遠程服務調用偽裝成本地方法調用&#xff08;方法導向&#xff09; - 典型行為…

【pytest進階】pytest之鉤子函數

什么是 hook (鉤子)函數 經常會聽到鉤子函數(hook function)這個概念,最近在看目標檢測開源框架mmdetection,里面也出現大量Hook的編程方式,那到底什么是hook?hook的作用是什么? what is hook ?鉤子hook,顧名思義,可以理解是一個掛鉤,作用是有需要的時候掛一個東西…

深度學習計算——動手學深度學習5

環境&#xff1a;PyCharm python3.8 1. 層和塊 塊&#xff08;block&#xff09;可以描述 單個層、由多個層組成的組件或整個模型本身。 使用塊進行抽象的好處&#xff1a; 可將塊組合成更大的組件(這一過程通常是遞歸) 如 圖5.1.1所示。通過定義代碼來按需生成任意復雜度…

NodeJS的fs模塊的readFile和createReadStream區別以及常見方法

Node.js 本身沒有像 Java 那樣嚴格區分字符流和字節流&#xff0c;區別主要靠編碼&#xff08;encoding&#xff09;來控制數據是以 Buffer&#xff08;二進制字節&#xff09;形式還是字符串&#xff08;字符&#xff09;形式處理。 詳細解釋&#xff1a; 方面JavaNode.js字節…

基于二進制XOR運算的機器人運動軌跡與對稱圖像自動生成算法

原創&#xff1a;項道德&#xff08;daode3056,daode1212&#xff09; 新的算法出現&#xff0c;往往能給某些行業與產業帶來革命與突破。為探索機器人運動軌跡與對稱圖像自動生成算法&#xff0c;本人已經通過18種算法的測試&#xff0c;最終&#xff0c;以二進制的XOR運算為…

Spring AI 項目實戰(七):Spring Boot + Spring AI Tools + DeepSeek 智能工具平臺(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4Spring AI 項目實戰(四…

spring-webmvc @RequestHeader 典型用法

典型用法 基礎用法&#xff1a;獲取指定請求頭值 GetMapping("/info") public String getInfo(RequestHeader("User-Agent") String userAgent) {return "User-Agent: " userAgent; }如果請求中包含 User-Agent 請求頭&#xff0c;則其值將被…

Ubuntu:20.04中安裝docker

是的&#xff0c;您列出的命令是完整的安裝步驟&#xff0c;但為了確保100%可靠性和處理可能的問題&#xff0c;我建議進行以下優化和補充&#xff1a; 完整優化的安裝腳本&#xff08;包含錯誤處理和驗證&#xff09; #!/bin/bash# 1. 徹底清理舊版本和配置 sudo apt remove…

大數據實時風控引擎:Spark Streaming、Kafka、Flink與Doris的融合實踐

大數據實時風控引擎&#xff1a;Spark Streaming、Kafka、Flink與Doris的融合實踐 在數字金融、電商交易與在線服務的核心戰場&#xff0c;風險控制能力已成為業務的生命線。傳統批量風控模式在應對瞬息萬變的欺詐攻擊、信用風險時捉襟見肘。本文將深入探討如何利用**Spark St…