XP系統安裝Android Studio 3.5.3并建立Java或Native C++工程,然后在安卓手機上運行

第一節 安裝Android Studio 3.5.3

Android Studio 3.5.3下載地址:

Android Studio 3.5.3 December 5, 2019
Windows (32-bit): android-studio-ide-191.6010548-windows32.zip (756.1 MB)
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.5.3.0/android-studio-ide-191.6010548-windows32.zip
解壓后運行bin/studio.exe。Windows (64-bit): android-studio-ide-191.6010548-windows.zip (756.6 MB)
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.5.3.0/android-studio-ide-191.6010548-windows.zip
解壓后運行bin/studio64.exe。

Android Studio自帶JRE,不需要事先安裝Java。

Android Studio 3.5.3可以在Win7 SP1系統下直接解壓使用。
如果是XP SP3或者64位XP SP2系統的話就必須要先安裝one core api 4.0.1,否則運行不了studio.exe或者studio64.exe。
one core api 4.0.1下載地址:https://github.com/shorthorn-project/One-Core-API-Binaries/releases/download/4.0.1/One-Core-API-Binaries-4.0.1.zip
安裝完成后重啟電腦。

本人用的是64位Windows XP SP2系統,one core api 4.0.1安裝完成后就可以成功運行studio64.exe了。

出現下面的窗口時點Cancel就行。

默認的Android SDK下載路徑C:\Documents and Settings\Administrator\AppData\Local\Android\Sdk是有空格的,必須要改。
例如改成D:\Android\Sdk,路徑中一定不能有空格。

下載過程中如果失敗就多Retry幾次。本人就遇到過幾次域名解析失敗,但過幾分鐘又能下載了。

下載完點擊Finish按鈕,就可以安裝成功了。

第二節 建立普通Java安卓工程并運行

點擊Start a new Android Studio project。

選擇Empty Activity。

Save location要改成一個沒有空格的路徑,默認的路徑C:\Documents and Settings\Administrator\AndroidStudioProjects\MyApplication是有空格的,是不能使用的。
Language要改成Java。
改完后點擊Finish按鈕。

進入工程后會下載gradle-5.4.1-all.zip,但是下載要很長時間。為了避免每次創建新工程都要下載一遍,可以在瀏覽器中下載https://services.gradle.org/distributions/gradle-5.4.1-all.zip,保存到D:\Android文件夾中。
修改工程里面的gradle-wrapper.properties文件(如F:\Projects\AndroidStudioProjects\MyApplication\gradle\wrapper\gradle-wrapper.properties)
把里面的distributionUrl改成file:///D:/Android/gradle-5.4.1-all.zip。
重啟Android Studio,點擊菜單欄里面的File->Sync Project with Gradle Files,就可以立即下載完成了。

點擊解除阻止:

完了之后報了一個錯誤:ERROR: Cause: unable to find valid certification path to requested target
解決辦法是打開Gradle Scripts下面的build.gradle (Project: My Application)文件,將里面的兩處google()修改成maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' },兩處jcenter()修改成maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'},改完后點擊一下上面的Try Again。

adb解除一下阻止:

sync成功:

sync成功后,就可以打開app/res/layout/activity_main.xml,看到可視化設計界面了。

現在我們嘗試生成一下apk安裝包。點擊菜單欄的Build -> Make Project命令。
build失敗,報錯:
AAPT: aapt2.exe E 08-22 19:42:48? 2296? 2152 LoadedArsc.cpp:112] RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.
aapt2.exe E 08-22 19:42:48? 2296? 2152 ApkAssets.cpp:157] Failed to load 'resources.arsc' in APK 'D:\Android\Sdk\platforms\android-36\android.jar'.
error: failed to load include path D:\Android\Sdk\platforms\android-36\android.jar.

解決辦法是打開Gradle Scripts下面的build.gradle (Module: app)文件。
compileSdkVersion改成28
buildToolsVersion改成"28.0.3"
targetSdkVersion改成28

改完后點擊右上角的Sync Now,等一會后報錯:
ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.
build-tools;28.0.3 Android SDK Build-Tools 28.0.3
platforms;android-28 Android SDK Platform 28
To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

Using Android SDK: D:\Android\Sdk
Install missing SDK package(s)

點擊Install missing SDK package(s),接受一下協議。

點擊Finish后,再點擊一下Build->Make Project菜單,就成功了。
可以在F:\Projects\AndroidStudioProjects\MyApplication\app\build\outputs\apk\debug下成功生成app-debug.apk。

現在我們嘗試一下在命令行中安裝這個apk到手機上運行。

安卓手機USB驅動下載地址:https://www.onlinedown.net/soft/1116709.htm
ADB Interface驅動所在文件夾:1510571328_36999_ysy\adb_interface_usb_driver
這個驅動適用于32位和64位的XP和Win7系統。

首先用USB數據線連接手機和電腦,電腦提示發現新硬件。

開始->運行->cmd打開命令行窗口,運行命令:
D:\Android\Sdk\platform-tools\adb.exe install -t F:\Projects\AndroidStudioProjects\MyApplication\app\build\outputs\apk\debug\app-debug.apk
手機上要允許一下USB Debugging。

進度一直卡住不動,什么都不輸出。這是因為,最新版本的Android SDK Platform-Tools 36.0.0已經不支持XP和Win7系統了,無法正常運行。
去網上下載舊版本的platform-tools:https://dl.google.com/android/repository/platform-tools_r23.1.0-windows.zip。
下載完后先關閉Android Studio,重啟一下電腦。
重啟電腦后先不要打開Android Studio,先把D:\Android\Sdk\platform-tools文件夾刪除掉,把剛剛下載的platform-tools_r23.1.0-windows.zip里面的platform-tools文件夾解壓到D:\Android\Sdk。

再在命令行中運行一下D:\Android\Sdk\platform-tools\adb.exe install -t F:\Projects\AndroidStudioProjects\MyApplication\app\build\outputs\apk\debug\app-debug.apk命令,就成功了。

這個時候再打開Android Studio,點擊Run -> Run 'app'菜單,也能成功安裝apk到手機上運行。

可以看到手機上的logcat:

因為XP系統沒有Powershell,所以Terminal窗格無法使用,要Win7下才能使用。

在SDK Manager里面可以看到,Android SDK Platform-Tools的版本號是23.1。

第三節 建立Native C++安卓工程并運行

先把上一節的工程關了:

然后新建一個Native C++工程:

進去之后還是一樣的先把distributionUrl改成file:///D:/Android/gradle-5.4.1-all.zip,因為從網上下載會失敗。改完后一定要重啟Android Studio,點擊菜單欄里面的File->Sync Project with Gradle Files。

ERROR: Cause: unable to find valid certification path to requested target
一樣的解決方法,打開Gradle Scripts下面的build.gradle (Project: My Application)文件,將里面的兩處google()修改成maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' },兩處jcenter()修改成maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'},改完后點擊一下上面的Try Again。

完了之后會要求我們安裝NDK。
ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.
ndk;29.0.13846066 NDK (Side by side) 29.0.13846066
To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

Using Android SDK: D:\Android\Sdk

NDK 29.0.13846066版本太高,與Android Studio 3.5.3不匹配,一定要安裝低版本的NDK。
在當前工程Sync失敗的情況下,Tools菜單下是沒有SDK Manager命令的,只能從File -> Settings菜單打開。
從File -> Settings菜單打開Settings窗口后,左邊展開Apperance & Behavior -> System Settings -> Android SDK。
右邊打開SDK Tools選項卡,勾選下面的Show Package Details,然后勾選安裝NDK (Side by side) 21.0.6113669版本。

裝完NDK后,點擊File -> Project Structure菜單。

左邊選擇SDK Location,右邊Android NDK location選擇NDK的路徑D:\Android\Sdk\ndk\21.0.6113669。

ERROR: CMake '3.10.2' was not found in PATH or by cmake.dir property.
Install CMake 3.10.2
點擊Install CMake 3.10.2鏈接安裝cmake。

ERROR: CMake '3.10.2' was not found in PATH or by cmake.dir property.
Set cmake.dir in local.properties to D:\Android\Sdk\cmake\3.10.2.4988404
點擊Set cmake.dir in local.properties to D:\Android\Sdk\cmake\3.10.2.4988404鏈接,就可以成功了。
上面的Unable to execute Clang-Tidy: Cannot create property=Diagnostics for JavaBean=com.jetbrains.cidr.lang.daemon.clang.tidy.ClangTidyYamlLoader$YamlData@9aedf45 in 'string', line 2, column 1:? ? MainSourceFile:? ?'F:\Projects\An不用管,不影響工程的編譯和運行。

Build -> Make Project生成apk安裝包。

AAPT: aapt2.exe E 08-22 20:53:53? 2724? 1520 LoadedArsc.cpp:112] RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.
aapt2.exe E 08-22 20:53:53? 2724? 1520 ApkAssets.cpp:157] Failed to load 'resources.arsc' in APK 'D:\Android\Sdk\platforms\android-36\android.jar'.
error: failed to load include path D:\Android\Sdk\platforms\android-36\android.jar.

修改build.gradle (Module: app)文件。
compileSdkVersion改成28
buildToolsVersion改成"28.0.3"
targetSdkVersion改成28
Sync一下,然后再次Make Project,成功。

Run -> Run 'app',成功。

第四節 下載并使用C++ Oboe音頻庫

Android Studio 3.5.3可以成功導入oboe-1.9.0,但無法成功導入最新版的oboe-1.9.3。
https://github.com/google/oboe/archive/refs/tags/1.9.0.zip(Jun 26, 2024)
https://github.com/google/oboe/archive/refs/tags/1.9.3.zip(Dec 18, 2024)
把oboe-1.9.0.zip下載下來,然后解壓到一個沒有空格的文件夾里面,如D:\Android。

打開app/src/main/cpp/CMakeLists.txt文件,找到末尾的target_link_libraries,在括號里面添加oboe。
然后在下面添加:
set(OBOE_DIR D:\\Android\\oboe-1.9.0)
add_subdirectory(${OBOE_DIR} ./oboe)
include_directories(${OBOE_DIR}/include)

修改完成后,點擊菜單欄里面的Build -> Refresh Linked C++ Projects,然后再Build -> Make Project。

修改代碼。
【com/example/myapplication/MainActivity.java】

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodtextView = findViewById(R.id.sample_text);}@Overrideprotected void onPause() {super.onPause();stringFromJNI("stop");textView.setText(stringFromJNI("log"));}@Overrideprotected void onResume() {super.onResume();stringFromJNI("start");}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI(String message);// Used to load the 'native-lib' library on application startup.static {System.loadLibrary("native-lib");}
}

【native-lib.cpp】

#include <jni.h>
#include <string>
#include <oboe/Oboe.h>class OboeSinePlayer: public oboe::AudioStreamDataCallback {
public:OboeSinePlayer() : logCount(0) {}virtual ~OboeSinePlayer() = default;// Call this from Activity onResume()int32_t startAudio() {std::lock_guard<std::mutex> lock(mLock);oboe::AudioStreamBuilder builder;// The builder set methods can be chained for convenience.oboe::Result result = builder.setSharingMode(oboe::SharingMode::Exclusive)->setPerformanceMode(oboe::PerformanceMode::LowLatency)->setChannelCount(kChannelCount)->setSampleRate(kSampleRate)->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)->setFormat(oboe::AudioFormat::Float)->setDataCallback(this)->openStream(mStream);if (result != oboe::Result::OK) return (int32_t) result;// Typically, start the stream after querying some stream information, as well as some input from the userresult = mStream->requestStart();return (int32_t) result;}// Call this from Activity onPause()void stopAudio() {// Stop, close and delete in case not already closed.std::lock_guard<std::mutex> lock(mLock);if (mStream) {mStream->stop();mStream->close();mStream.reset();}}oboe::DataCallbackResult onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) override {println("onAudioReady: numFrames=%d", numFrames);float *floatData = (float *) audioData;for (int i = 0; i < numFrames; ++i) {float sampleValue = kAmplitude * sinf(mPhase);for (int j = 0; j < kChannelCount; j++) {floatData[i * kChannelCount + j] = sampleValue;}mPhase += mPhaseIncrement;if (mPhase >= kTwoPi) mPhase -= kTwoPi;}return oboe::DataCallbackResult::Continue;}std::string getLog() {std::string log = this->log;this->log.clear();return log;}private:std::mutex         mLock;std::shared_ptr<oboe::AudioStream> mStream;// Stream paramsstatic int constexpr kChannelCount = 2;static int constexpr kSampleRate = 48000;// Wave params, these could be instance variables in order to modify at runtimestatic float constexpr kAmplitude = 0.5f;static float constexpr kFrequency = 440;static float constexpr kPI = M_PI;static float constexpr kTwoPi = kPI * 2;static double constexpr mPhaseIncrement = kFrequency * kTwoPi / (double) kSampleRate;// Keeps track of where the wave isfloat mPhase = 0.0;std::string log;int logCount;void println(const char *fmt, ...) {char header[30];char buffer[256];va_list list;va_start(list, fmt);vsnprintf(buffer, sizeof(buffer), fmt, list);va_end(list);if (log.empty() || logCount % 100 != 0) {if (!log.empty()) {log += "\n";}snprintf(header, sizeof(header), "[%d] ", logCount);log += header;log += buffer;logCount++;}}
};OboeSinePlayer player;extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(JNIEnv* env,jobject that , jstring message) {std::string hello = "Hello from C++";const char *messageCstr = env->GetStringUTFChars(message, nullptr);if (messageCstr != nullptr) {if (strcmp(messageCstr, "start") == 0) {player.startAudio();} else if (strcmp(messageCstr, "stop") == 0) {player.stopAudio();} else if (strcmp(messageCstr, "log") == 0) {hello = player.getLog();}env->ReleaseStringUTFChars(message, messageCstr);}return env->NewStringUTF(hello.c_str());
}

【layout/activity_main.xml】

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/sample_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World!" /></ScrollView></androidx.constraintlayout.widget.ConstraintLayout>

改完代碼,Build -> Make Project,然后Run -> Run 'app',在手機上運行。

APP運行后,在手機上能聽到Oboe發出的聲音,是一段蜂鳴聲。
按HOME鍵(不是返回鍵)關閉APP,停止播放聲音。再重新打開APP,又開始播放聲音了,而且APP上會有日志顯示,每次顯示100條。這個日志是C++代碼里面的println("onAudioReady: numFrames=%d", numFrames);語句打印的。

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

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

相關文章

calchash.exe和chckhash.exe計算pe文件hash值的兩個實用小工具

第一部分&#xff1a; C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\NT5.CAT t部分內容B B D 0 2 2 2 1 A A 6 5 5 6 2 8 F 4 9 5 F 6 C D 3 0 3 9 0 8 B B E 0 0 F 9 5 9 5 第二部分&#xff1a; D:\>calchash.exe pidgen.dll BB D0 22 21 AA 65 …

lanczso算法中的額外正交化代碼解釋

額外正交化 定義&#xff1a;在Lanczos算法中&#xff0c;由于浮點誤差&#xff0c;生成的向量可能不完全正交&#xff0c;需要額外正交化步驟。代碼實現&#xff1a;def extra_orthogonalization(v, basis):for u in basis:v - u * (v.dot(u) / u.dot(u))

Rabbit 實戰指南-學習筆記

第 4 章 RabbitMQ 進階 mandatory 參數 Returning | RabbitMQ 當 mandatory 參數設為 true 時&#xff0c;交換器無法根據自身的類型和路由鍵找到一個符合條件的隊列&#xff0c;那么RabbitMQ 會調用 Basic.Return 命令將消息返回給生產者,通過調用channel.addReturnListener …

BEVDet4D

1. BEVDet4D算法動機及開創性思路 1&#xff09;BEVDet算法概述輸入輸出&#xff1a;輸入為6視角圖像&#xff08;NuScenes數據集&#xff09;&#xff0c;輸出為3D檢測結果核心模塊&#xff1a; 圖像編碼器&#xff1a;由Backbone網絡和多尺度特征融合網絡組成&#xff0c;處理…

當 AI 學會 “理解” 人類:自然語言處理的進化與倫理邊界

大家可以去我的資源看看&#xff0c;有很多關于AI的免費資源可以下載&#xff0c;不下載也可以看看&#xff0c;真的對你有用引言&#xff1a;從 “對話” 到 “理解”——AI 語言能力的時代躍遷現實錨點&#xff1a;以日常場景切入&#xff08;如 ChatGPT 流暢回應復雜問題、A…

WPF控件隨窗體大寬度高度改變而改變

前臺控件中&#xff1a;Width"{Binding RelativeSource{RelativeSource AncestorTypeWindow}, PathWidth}"后臺代碼&#xff1a;定義在加載事件里面this.SizeChanged ProductData_SizeChanged;private void ProductData_SizeChanged(object sender, SizeChangedEven…

E10 通過RPC實現賬號批量鎖定與解鎖

需求背景&#xff1a;賬號信息由三方系統管理&#xff0c;包含賬號狀態&#xff0c;所以需要通過提供給三方的 Rest 接口中&#xff0c;實現賬號鎖定與解鎖。參考基線版本&#xff1a;10.0.2506.01&#xff0c;過低的版本可能無法使用。 鎖定分為兩種&#xff1a; &#xff08;…

什么是AI寵物

什么是AI寵物AI寵物是由AI大腦驅動的生命體AI產品。它能主動產生情緒和意圖&#xff0c;并通過情緒和意圖去驅動自己的動作和行為。它根據自己的意愿和用戶互動&#xff0c;不受用戶控制。從一定意義上講&#xff0c;它擁有了人工生命和自由意志。它有自己的行為邏輯&#xff0…

簡單AI:搜狐公司旗下AI繪畫產品

本文轉載自&#xff1a;簡單AI&#xff1a;搜狐公司旗下AI繪畫產品 - Hello123工具導航 ** 一、平臺定位與技術特性 搜狐簡單 AI 是搜狐推出的多模態 AI 創作平臺&#xff0c;基于自研大模型提供文生圖、文生文等能力。它專注于零門檻內容生成&#xff0c;用戶無需專業技能即…

vue3 3d餅圖

完整3D餅圖項目下載 https://download.csdn.net/download/weixin_54645059/91716476 只有一個vue文件 直接下滑到完整代碼就闊以 本文介紹了如何使用ECharts和ECharts-GL插件實現3D餅圖效果&#xff0c;并提出了數值顯示未解決的問題。主要包含以下內容&#xff1a; 安裝所需…

全球電商業財一體化趨勢加速,巨益科技助力品牌出海精細化運營

行業背景&#xff1a;跨境電商進入品牌化發展新階段隨著國內電商市場競爭日趨激烈&#xff0c;跨境電商已成為中國品牌尋求增長突破的重要賽道&#xff0c;在TikTok、Temu等平臺出海浪潮推動下&#xff0c;越來越多的中國品牌開始布局全球市場。然而&#xff0c;從單一市場的鋪…

【序列晉升】13 Spring Cloud Bus微服務架構中的消息總線

Spring Cloud Bus作為微服務架構中的關鍵組件&#xff0c;通過消息代理實現分布式系統中各節點的事件廣播與狀態同步&#xff0c;解決了傳統微服務架構中配置刷新效率低下、系統級事件傳播復雜等問題。它本質上是一個輕量級的事件總線&#xff0c;將Spring Boot Actuator的端點…

[激光原理與應用-314]:光學設計 - 光學系統設計與電子電路設計的相似或相同點

光學系統設計與電子電路設計雖分屬不同工程領域&#xff0c;但在設計理念、方法論和工程實踐中存在諸多相似或相同點。這些共性源于兩者均需解決復雜系統的優化問題&#xff0c;并遵循工程設計的通用規律。以下是具體分析&#xff1a;一、設計流程的相似性需求分析與規格定義光…

Linux學習:信號的保存

目錄1. 進程的異常終止與core dump標志位1.1 進程終止的方式1.2 core方案的作用與使用方式2. 信號的保存2.1 信號的阻塞2.2 操作系統中的sigset_t信號集類型2.3 進程PCB中修改block表的系統調用接口2.4 信號阻塞的相關問題驗證1. 進程的異常終止與core dump標志位 1.1 進程終止…

數據分析編程第二步: 最簡單的數據分析嘗試

2.1 數據介紹有某公司的銷售數據表 sales.csv 如下:第一行是標題&#xff0c;解釋每一列存了什么東西。第二行開始每一行是一條數據&#xff0c;對應一個訂單。這種數據有個專業的術語&#xff0c;叫結構化數據。這是現代數據處理中最常見的數據類型。整個表格的數據統稱為一個…

UDP報文的數據結構

主要內容參照https://doc.embedfire.com/net/lwip/zh/latest/doc/chapter14/chapter14.html#id6&#xff0c;整理出來自用。 1. UDP 報文首部結構體&#xff08;udp_hdr&#xff09; 為清晰定義 UDP 報文首部的各個字段&#xff0c;LwIP 設計了udp_hdr結構體&#xff0c;其包含…

圖論與最短路學習筆記

圖論與最短路在數學建模中的應用 一、圖論模型圖 G(V,E)G(V,E)G(V,E) VVV&#xff1a;頂點集合EEE&#xff1a;邊集合每條邊 (u,v)(u,v)(u,v) 賦予權值 w(u,v)w(u,v)w(u,v)&#xff0c;可用 鄰接矩陣 或 鄰接表 表示。二、最短路問題的數學形式 目標&#xff1a;尋找從源點 sss…

第九節 Spring 基于構造函數的依賴注入

當容器調用帶有一組參數的類構造函數時&#xff0c;基于構造函數的 DI 就完成了&#xff0c;其中每個參數代表一個對其他類的依賴。接下來&#xff0c;我們將通過示例來理解 Spring 基于構造函數的依賴注入。示例&#xff1a;下面的例子顯示了一個類 TextEditor&#xff0c;只能…

【數據庫】PostgreSQL詳解:企業級關系型數據庫

文章目錄什么是PostgreSQL&#xff1f;核心特性1. 標準兼容性2. 擴展性3. 高級功能4. 可靠性數據類型1. 基本數據類型2. 高級數據類型基本操作1. 數據庫操作2. 表操作3. 數據操作高級查詢1. 連接查詢2. 子查詢3. 窗口函數JSON操作1. JSON數據類型2. JSON查詢3. JSON索引全文搜索…

FFMPEG相關解密,打水印,合并,推流,

1&#xff1a;ffmepg進行打水印解密 前提ffmepg安裝利用靜態版就可以這個什么都有&#xff0c;不用再配置其他信息&#xff1a;&#xff08;這個利用ffmpeg終端命令是沒問題的&#xff0c;但是如果要是再C中調用ffmpeg庫那么還需要從新編譯安裝下&#xff09; 各個版本 Inde…