RK3588 linux RGA初探

在這里插入圖片描述

概述

RGA (Raster Graphic Acceleration Unit)是一個獨立的2D硬件加速器,可用于加速點/線繪制,執行圖像縮放、旋轉、bitBlt、alpha混合等常見的2D圖形操作。

本文基于以下版本編寫:
commit fb5f019ea0191ec1c34f49ac8be447ac8921aadd (HEAD -> main, origin/main, origin/HEAD)
Author: Yu Qiaowei cerf.yu@rock-chips.com
Date: Wed Apr 3 18:24:42 2024 +0800

fix network disk link cannot be opened

Signed-off-by: Yu Qiaowei cerf.yu@rock-chips.com
Change-Id: I7dae60823917713bb1a5e64bb47c894db5c44cc8

librga/CHANGELOG.mdCOPYINGdocs/ 文檔include/ 頭文件libs/ so庫README.md*samples/ 參考例子toolchains/ 交叉編譯鏈tools/

基本使用

參考文檔: docs/Rockchip_Developer_Guide_RGA_CN.md
軟件支持庫提供以下API,異步模式僅支持C++實現。

  • querystring: 查詢獲取當前芯片平臺RGA硬件版本與功能支持信息,以字符串的形式返回。
  • imcheckHeader: 校驗當前使用頭文件版本與librga版本差異。
  • importbuffer_T: 將外部內存(dma_fd、虛擬地址、物理地址)導入RGA驅動內部,實現硬件快速訪問物理連續/非物理連續的內存。
  • releasebuffer_handle: 將外部buffer從RGA驅動內部解除引用與映射。
  • wrapbuffer_handle: 快速封裝圖像緩沖區結構(rga_buffer_t)。
  • imbeginJob:創建RGA圖像處理任務。
  • imendJob: 提交并執行RGA圖像處理任務。
  • imcancelJob: 取消并刪除RGA圖像處理任務。
  • imcopy: 調用RGA實現快速圖像拷貝操作。
  • imcopyTask: 向RGA圖像任務中添加快速圖像拷貝操作。
  • imresize: 調用RGA實現快速圖像縮放操作。
  • imresizeTask: 向RGA圖像任務中添加快速圖像縮放操作。
  • impyramind: 調用RGA實現快速圖像金字塔操作。
  • imcrop: 調用RGA實現快速圖像裁剪操作。
  • imcropTask: 向RGA圖像任務中添加快速圖像裁剪操作。
  • imtranslate: 調用RGA實現快速圖像平移操作。
  • imtranslateTask: 向RGA圖像任務中添加快速圖像平移操作。
  • imcvtcolor: 調用RGA實現快速圖像格式轉換。
  • imcvtcolorTask: 向RGA圖像任務中添加快速圖像格式轉換。
  • imrotate: 調用RGA實現快速圖像旋轉操作。
  • imrotateTask: 向RGA圖像任務中添加快速圖像旋轉操作。
  • imflip: 調用RGA實現快速圖像翻轉操作。
  • imflipTask: 向RGA圖像任務中添加快速圖像翻轉操作。
  • imblend: 調用RGA實現雙通道快速圖像合成操作。
  • imblendTask: 向RGA圖像任務中添加雙通道快速圖像合成操作。
  • imcomposite: 調用RGA實現三通道快速圖像合成操作。
  • imcompositeTask: 向RGA圖像任務中添加三通道快速圖像合成操作。
  • imcolorkey: 調用RGA實現快速圖像顏色鍵操作。
  • imcolorkeyTask: 向RGA圖像任務中添加快速圖像顏色鍵操作。
  • imosd:調用RGA實現快速圖像OSD字幕疊加。
  • imosdTask:向RGA圖像任務中添加快速圖像OSD字幕疊加。
  • imquantize: 調用RGA實現快速圖像運算點前處理(量化)操作。
  • imquantizeTask: 向RGA圖像任務中添加快速圖像運算點前處理(量化)操作。
  • imrop: 調用RGA實現快速圖像光柵操作。
  • imropTask: 向RGA圖像任務中添加快速圖像光柵操作。
  • imfill: 調用RGA實現快速圖像填充操作。
  • imfillArray: 調用RGA實現多組快速圖像填充操作。
  • imfillTask: 向RGA圖像任務中添加快速圖像填充操作。
  • imfillTaskArray: 向RGA圖像任務中添加多組快速圖像填充操作。
  • imrectangle: 調用RGA實現等距矩形邊框快速繪制操作。
  • imrectangleArray: 調用RGA實現多組等距矩形邊框快速繪制操作。
  • imrectangleTask: 向RGA圖像任務中添加等距矩形邊框快速繪制操作。
  • imrectangleTaskArray: 向RGA圖像任務中添加多組等距矩形邊框快速繪制操作。
  • immakeBorder: 調用RGA實現矩形邊框快速繪制操作。
  • immosaic:調用RGA實現快速圖像馬賽克遮蓋。
  • immosaicArray:調用RGA實現快速圖像馬賽克遮蓋。
  • immosaicTask:向RGA圖像任務中添加快速圖像馬賽克遮蓋。
  • immosaicTaskArray:向RGA圖像任務中添加快速圖像馬賽克遮蓋。
  • improcess: 調用RGA實現快速圖像復合處理操作。
  • improcessTask: 向RGA圖像任務中添加快速圖像復合處理操作。
  • imcheck: 校驗參數是否合法,以及當前硬件是否支持該操作。
  • imsync: 用于異步模式時,同步任務完成狀態。
  • imconfig: 向當前線程上下文添加默認配置。

直接上手demo

圖片縮放

samples/resize_demo/
├── cmake-android.sh
├── cmake-linux.sh
├── CMakeLists.txt
└── src├── CMakeLists.txt├── rga_resize_config_interpolation_demo.cpp├── rga_resize_demo.cpp├── rga_resize_rect_demo.cpp└── rga_resize_uv_downsampling_demo.cpp

samples/resize_demo$ ./cmake-linux.sh

/work/devEnv/librga/samples/resize_demo/build/build_linux /work/devEnv/librga/samples/resize_demo
load /work/devEnv/librga/samples/resize_demo/../../toolchains/toolchain_linux.cmake
load /work/devEnv/librga/samples/resize_demo/../../libs/Linux/gcc-aarch64/librga.so
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:16 (project):The CMAKE_C_COMPILER:/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-rockchip1031-linux-gnu-gccis not a full path to an existing compiler tool.Tell CMake where to find the compiler by setting either the environmentvariable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path tothe compiler, or to the compiler name if it is in the PATH.CMake Error at CMakeLists.txt:16 (project):The CMAKE_CXX_COMPILER:/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-rockchip1031-linux-gnu-g++is not a full path to an existing compiler tool.Tell CMake where to find the compiler by setting either the environmentvariable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full pathto the compiler, or to the compiler name if it is in the PATH.-- Configuring incomplete, errors occurred!
See also "/work/devEnv/librga/samples/resize_demo/build/build_linux/CMakeFiles/CMakeOutput.log".
See also "/work/devEnv/librga/samples/resize_demo/build/build_linux/CMakeFiles/CMakeError.log".
make: *** No targets specified and no makefile found.  Stop.
make: *** No rule to make target 'install'.  Stop.

原始的代碼編譯不過… 真坎坷! /home/yqw/workspace/ 這個路徑應該是寫這個demo的工程師的
修改下交叉編譯鏈

git diff ../../toolchains/
diff --git a/toolchains/toolchain_linux.cmake b/toolchains/toolchain_linux.cmake
index f446557..aa5f9b3 100644
--- a/toolchains/toolchain_linux.cmake
+++ b/toolchains/toolchain_linux.cmake
@@ -1,5 +1,5 @@
-SET(TOOLCHAIN_HOME "/home/yqw/workspace/linux/common/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu")
-SET(TOOLCHAIN_NAME "aarch64-rockchip1031-linux-gnu")
+SET(TOOLCHAIN_HOME "/usr")
+SET(TOOLCHAIN_NAME "aarch64-linux-gnu")# this is required#SET(CMAKE_SYSTEM_NAME Linux)

samples/resize_demo$ ./cmake-linux.sh

[ 81%] Linking CXX executable rga_resize_rect_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
[ 90%] Linking CXX executable rga_resize_uv_downsampling_demo
make[2]: *** [src/CMakeFiles/rga_resize_demo.dir/build.make:90: src/rga_resize_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:210: src/CMakeFiles/rga_resize_demo.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[100%] Linking CXX executable rga_resize_config_interpolation_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_rect_demo.dir/build.make:90: src/rga_resize_rect_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:183: src/CMakeFiles/rga_resize_rect_demo.dir/all] Error 2
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_uv_downsampling_demo.dir/build.make:90: src/rga_resize_uv_downsampling_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:156: src/CMakeFiles/rga_resize_uv_downsampling_demo.dir/all] Error 2
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_config_interpolation_demo.dir/build.make:90: src/rga_resize_config_interpolation_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:129: src/CMakeFiles/rga_resize_config_interpolation_demo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
[ 27%] Built target utils_obj
[ 36%] Linking CXX executable rga_resize_config_interpolation_demo
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lrga
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/rga_resize_config_interpolation_demo.dir/build.make:90: src/rga_resize_config_interpolation_demo] Error 1
make[1]: *** [CMakeFiles/Makefile2:129: src/CMakeFiles/rga_resize_config_interpolation_demo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

找不到librga庫, 項目的目錄結構更新了, 代碼還沒改過來

git diff cmake-linux.sh
diff --git a/samples/resize_demo/cmake-linux.sh b/samples/resize_demo/cmake-linux.sh
index 3604521..a3f2f42 100755
--- a/samples/resize_demo/cmake-linux.sh
+++ b/samples/resize_demo/cmake-linux.sh
@@ -5,7 +5,7 @@ SAMPLES_DIR=${SCRIPT_DIR}/..# The following options require configurationTOOLCHAIN_PATH=${SAMPLES_DIR}/../toolchains/toolchain_linux.cmake
-LIBRGA_PATH=${SAMPLES_DIR}/../build/build_linux/install/lib
+LIBRGA_PATH=${SAMPLES_DIR}/../libs/Linux/gcc-aarch64BUILD_DIR=build/build_linuxBUILD_TYPE=Release

編譯成功后:

build/build_linux/install/bin/
├── rga_resize_config_interpolation_demo
├── rga_resize_demo
├── rga_resize_rect_demo
└── rga_resize_uv_downsampling_demo

丟板子里測試:
代碼實現了 1280x720 縮放到 1920x1080 的RGBA 格式轉化, 測試文件路徑: librga/samples/sample_file/in0w1280-h720-rgba8888.bin

#測試程序
adb push build/build_linux/install/bin/rga_resize_demo /rga/
#測試文件
adb push ../sample_file/in0w1280-h720-rgba8888.bin /data/

進入到主板執行

root@rk3588:/rga# ./rga_resize_demo 
rga_api version 1.10.1_[0]
rga_resize_demo running success!
open /data/out0w1920-h1080-rgba8888.bin and write okroot@rk3588:/rga# ll /data/*bin
-rwxrwxrwx 1 root root 3.6M Jul  1  2024 /data/in0w1280-h720-rgba8888.bin
-rw-r--r-- 1 root root 8.0M Jan  1 00:13 /data/out0w1920-h1080-rgba8888.bin

RGBA 轉換為 BMP:

# pull 輸出圖片
adb pull /data/out0w1920-h1080-rgba8888.bin out0w1920-h1080-rgba8888.rgba
# 使用convert 轉換
# 注意: 確保你已經安裝了ImageMagick
# sudo apt-get install imagemagick
convert -depth 8 -size 1920x1080 -colors 256 -colorspace sRGB out0w1920-h1080-rgba8888.rgba -alpha off out.bmp

注意事項

  • Q1.9:為什么當搭載8G DDR時,RGA效率較于4G時性能下降嚴重?
    由于部分RGA1/RGA2的IOMMU僅支持最大32位的物理地址,而RGA Device Driver、RGA2 Device Driver中對于不滿足硬件內存要求的調用申請,默認是通過swiotlb機制進行訪問訪問受限制的內存(原理上相當于通過CPU將高位內存拷貝至復合硬件要求的低位內存中,再交由硬件進行處理,處理完畢后再通過CPU將低位內存搬運回目標的高位內存上。)因此效率十分低下,通常在正常耗時的3-4倍之間浮動,并且引入受CPU負載影響。

  • “RGA_MMU unsupported Memory larger than 4G!”報錯該如何解決?
    該報錯通常對應HAL層報錯:
    RgaBlit(1483) RGA_BLIT fail: Invalid argument
    Failed to call RockChipRga interface, please use ‘dmesg’ command to view driver error log.
    該報錯標識當前配置的圖像任務配置的內存無法滿足當前匹配到的硬件核心對內存的要求,由于不同的硬件版本的RGA的IOMMU對內存位數的要求不同,當分配的內存超過對應硬件的限制時,則會出現該該報錯,詳細的不同硬件版本RGA的限制可見《Rockchip_Developer_Guide_RGA_CN》中的概述——設計指標小節。

    當出現該報錯時,通常有以下幾種場景以及對應的解決方案:

    在搭載多種RGA的芯片平臺(例如RK3588搭載有2顆RGA3核心、1顆RGA2核心)上,沒有使用importbuffer_xx接口獲取handle,而是直接使用wrapbuffer_xx接口調用im2d api時:

    由于沒有使用importbuffer_xx來提前映射外部內存到RGA驅動內存,因此在實際任務匹配中無法提前獲知內存是否不滿足對應核心的限制,因此在高負載場景下可能會出現該報錯,建議使用importbuffer_xx提前將外部內存導入到RGA驅動內部,避免該問題。

    在搭載多種RGA的芯片平臺(例如RK3588搭載有2顆RGA3核心、1顆RGA2核心)上,使用了importbuffer_xx接口獲取handle,但是依舊存在該問題:

    可以檢查一下配置的圖像任務的參數,確認是否配置了僅有RGA2核心(內存訪問受限制的核心)支持的功能或格式,以RK3588為例,color fill功能和YUV422/420 planar格式均是RGA2核心特有的功能和格式,因此該場景下必須分配4G以內內存空間的內存調用RGA。

    常見的分配4G內存方式可以查看以下示例代碼:
    <librga_souce_path>/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp
    <librga_souce_path>/samples/allocator_demo/src/rga_allocator_graphicbuffer_demo.cpp

    如果使用的其他分配器,例如mpp_buffer、v4l2_buffer、drm_buffer等,請查詢對應分配器是否支持限制分配4G以內內存空間內存,并按照對應方式申請復合RGA硬件要求的內存。

    僅搭載一種RGA的芯片平臺(例如僅搭載RGA2的RK3399、RK3568、Rk3566)上:

    當芯片平臺上僅搭載內存訪問受限制的核心時,則調用RGA時必須申請符合搭載核心對內存要求的內存,解決方案同上場景2。

    當使用DRM、malloc、new等不支持指定分配4G以內內存空間的內存的內存分配器時,也可以通過修改uboot的內存映射范圍來解決。

    uboot相關修改可以參考SDK文檔中 uboot開發文檔->Chapter-8 調試手段->修改DDR容量 ,將內存映射范圍全局限制在0~4G內存空間以內即可。

參考

  • librga github

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

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

相關文章

服務器數據恢復—raid5陣列硬盤出現大量壞道的數據恢復案例

服務器存儲數據恢復環境&故障&#xff1a; 一臺DELL EqualLogic PS 4000存儲中有一組由12塊磁盤組建的raid5陣列&#xff0c;存儲空間劃分3個同等大小的卷&#xff0c;采用的VMFS文件系統。 兩塊硬盤指示燈亮黃色&#xff0c;raid5陣列崩潰&#xff0c;存儲變得不可用。 服…

C語言學習記錄Day2

for循環 for&#xff08;表達式1&#xff1b;表達式2&#xff1b;表達式3&#xff09; 循環語句&#xff1b; 注&#xff1a;表達式1&#xff1a;初始化部分.表達式2&#xff1a;條件判斷部分 表達式3&#xff1a;調整部分 不可再for循環體內修改循環變量&#xff0c;防止f…

廠拉拉獲清科文創天使輪投資

最新信息&#xff1a;源頭工廠測品平臺廠拉拉APP已正式獲得北京清科文創千萬級的天使輪投資。 本輪資金將主要用于測品師、品鑒官隊伍的引流&#xff0c;及APP3.0數字供應鏈和用戶購物行為算法技術、算力模型的建設。 廠拉拉APP的營運主體為廣州智邦遠見科技有限公司&#xf…

Java基礎概念

1.注釋和關鍵字 &#xff08;1&#xff09;注釋 什么是注釋&#xff1f;注釋就是對代碼進行解釋說明的文字 注釋的分類&#xff1f;單行注釋&#xff0c;多行注釋&#xff0c;文檔注釋 注釋的使用細節&#xff1f; 注釋的內容不會參與編譯和運行&#xff0c;僅僅是對代碼的…

【Linux】touch

我們在介紹ls這個命令時&#xff0c;提到每個文件在Linux下面都會記錄許多的時間參數&#xff0c;其實是有三個主要的變動時間&#xff0c;那么三個時間的意義是什么&#xff1f; 修改時間&#xff08;modification time&#xff0c;mtime)&#xff1a;當該文件的【內容數據】…

qt udp 協議鏈接舉例

在Qt框架中&#xff0c;使用UDP協議進行通信主要依賴于QUdpSocket類。以下是一個基于Qt的UDP通信示例&#xff0c;包括UDP套接字的創建、綁定端口、發送和接收數據報的步驟。 1. 創建UDP套接字 首先&#xff0c;需要創建一個QUdpSocket對象。這通常在你的類的構造函數中完成&…

【c++刷題筆記-貪心】day28: 134. 加油站 、 135. 分發糖果 、860.檸檬水找零 、 406.根據身高重建隊列

134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;算出當前的消耗的油量總數&#xff0c;如果花費大于油量表示無法到達。統計總花費最大的油耗總數&#xff0c;如果油耗總數大于或者等于0&#xff0c;表示全程沒有負花銷&#xff0c;直接從0起步。小于零…

十二、數組

1. 一維數組的創建和初始化 數組是一組相同類型元素的集合。 變長數組是不能初始化的。 數組的初始化是指&#xff0c;在創建數組的同時給數組的內容一些合理初始值&#xff08;初始化&#xff09;。 例如上圖 char ch3[ ]"abc";里面方的就是 a b c \0 char ch3[ …

EDA 2023 年世界國家suicide rate排名

文章目錄 前言:關于數據集列 導入模塊導入數據數據預處理探索性數據分析按性別劃分的自殺率 [箱線圖]相關矩陣熱圖自殺率最高的 15 個國家變化百分比最高的 15 個國家/地區2023 年世界地圖上自殺率的國家 結尾: 前言: 隨著社會的不斷發展和變遷&#xff0c;人們對于各種社會問…

揭秘:源代碼防泄密的終極秘籍

在當今信息科技高度發達的時代&#xff0c;源代碼作為企業最核心的資產之一&#xff0c;其安全性不言而喻。源代碼的泄露可能導致企業技術機密被競爭對手獲取&#xff0c;進而威脅到企業的市場競爭力和長遠發展。因此&#xff0c;源代碼防泄密成為了企業信息安全工作的重中之重…

前端JS特效第24波:jQuery輕量級響應式幻燈片插件EasyFader

jQuery輕量級響應式幻燈片插件EasyFader&#xff0c;先來看看效果&#xff1a; 部分核心的代碼如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>jQuery輕量級響應式幻燈片插件E…

C-10 凸包

凸包 數學定義 平面的一個子集S被稱為是凸的&#xff0c;當且僅當對于任意兩點A&#xff0c;B屬于S&#xff0c;線段PS都完全屬于S過于基礎就不詳細介紹了 凸包的計算 github上找到了別人的代碼&#xff0c;用4種方式實現了凸包的計算&#xff0c;把他放在這里鏈接地址htt…

可靈ai出web端了

網址 https://klingai.kuaishou.com/ 可靈ai出web端了 最近最火的莫過于老照片動態視頻了&#xff0c;現在可靈出web端了&#xff0c;更利好開發者了。

redis運維:sentinel模式如何查看所有從節點

1. 連接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 發現Redis主服務器 連接到哨兵后&#xff0c;我們可以使用SENTINEL get-master-addr-by-name命令來獲取當前的Redis主服務器的地址。 SENTINEL get-master-a…

原生JS常用方法總結

文章目錄 根據 cookie 的 key 獲取 value根據 xpath 獲取頁面元素ajax請求 根據 cookie 的 key 獲取 value // 獲取cookie function getCookie(key){var arrstr document.cookie.split("; ");for (var i 0; i < arrstr.length; i){var temp arrstr[i].split(&…

手動安裝Ruby 1.9.3并升級RubyGems

手動安裝Ruby 1.9.3并升級RubyGems ###Ruby 1.9.3 p125安裝 wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.gz \ && tar -xzvf ruby-1.9.3-p125.tar.gz \ && cd ruby-1.9.3-p125 \ && ./configure --with-openssl-dir/usr/lib/op…

Python骨架肌體運動學數學模型

&#x1f3af;要點 &#x1f3af;運動學矢量計算 | &#x1f3af;跳遠的運動學計算 | &#x1f3af;關節肢體運動最小加加速度模型 | &#x1f3af;膝關節和踝關節角度二維運動學計算 | &#x1f3af;上下肢體關節連接運動鏈數學模型 | &#x1f3af;剛體連接點速度加速度計算…

[python]Markdown圖片引用格式批處理桌面應用程序

需求 使用python編寫一個exe&#xff0c;實現批量修改圖片引用&#xff0c;將修改后的文件生成為 文件名_blog.md。有一個編輯框&#xff0c;允許接收拖動過來md文件&#xff0c;拖入文件時獲取文件路徑&#xff0c;有一個編輯框編輯修改后的文件的輸出路徑&#xff0c;用戶拖入…

Springboot實戰:AI大模型+亮數據代理助力短視頻時代

目錄 前言1.如何入門亮數據1.1、注冊登錄1.2、注冊賬號1.3、登錄1.4、購買靜態住宅代理1.5、展示購買的代理 2. 使用Springboot、AI大模型構建系統2.1 使用Springboot、AI大模型構建爬蟲2.2、在Springboot項目添加工具 3、編寫代碼&#xff0c;爬取視頻素材3.1、代碼里使用代理…

Redis核心問題總結(一)

1、為什么要使用Redis做緩存 緩存的好處 使用緩存的目的就是提升讀寫性能。而實際業務場景下&#xff0c;更多的是為了提升讀性能&#xff0c;帶來更好的性 能&#xff0c;帶來更高的并發量。Redis 的讀寫性能比 Mysql 好的多&#xff0c;我們就可以把 Mysql 中的熱點數據緩 …