1.HBuilder X版本 
2.Android Studio 版本 
3.导入我提供的 HBuilder-Integrate-AS 工程,这个工程是根据uniappSDK中的同名工程扩展来的
uniappSDK下载地址 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html
4.
5.先测试simpleDemo项目可以正常跑通在手机上,在开发arr原生插件,在将插件放在simpleDemo中本地离线打包,测试arr插件功能是否正常,在将arr插件复制到uniapp项目中,测试云打包后arr插件是否正常
6.运行simpleDemo项目,文档地址 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android.html
7.开发arr原生插件
在我提供的压缩包HBuilder-Integrate-AS 工程内,因为运行simpleDemo模块和AeroFFmpegModule模块所需要的gradle版本不一样,gradle8.x不能使用fat-aar包,fat-aar的功能是在运行AeroFFmpegModule模块时,可已加载本地的其他arr模块,并可打包进咱们自己制作的aar原生插件中,gradle8.x不能这样做,但是运行simpleDemo模块又需要gradle8.x的环境,所以需要切换
如果运行simpleDemo模块
项目根目录的 settings.gradle 文件内容
//如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将 //include ':simpleDemo' 这行注释
//如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将 //include ':AeroFFmpegModule' 这行注释
include ':simpleDemo'
//include ':AeroFFmpegModule'
项目根目录/gradle/wrapper/gradle-wrapper.properties 文件内容
#Mon Dec 28 18:07:31 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将gradle-7.3-bin.zip中的7.3替换进去 7.3
#如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将gradle-8.11.1-bin.zip中的8.11.1替换进去 8.11.1
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip
项目根目录/build.gradle
dependencies {
classpath 'com.android.tools.build:gradle:8.7.3'//8.7.3 7.1.0
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.github.kezong:fat-aar:1.3.8'
}
如果运行AeroFFmpegModule模块
项目根目录的 settings.gradle 文件内容
//如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将 //include ':simpleDemo' 这行注释
//如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将 //include ':AeroFFmpegModule' 这行注释
//include ':simpleDemo'
include ':AeroFFmpegModule'
项目根目录/gradle/wrapper/gradle-wrapper.properties 文件内容
#Mon Dec 28 18:07:31 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将gradle-7.3-bin.zip中的7.3替换进去 7.3
#如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将gradle-8.11.1-bin.zip中的8.11.1替换进去 8.11.1
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.3-bin.zip
项目根目录/build.gradle
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0'//8.7.3 7.1.0
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.github.kezong:fat-aar:1.3.8'
}
按照上述配置后

编写完成后

在以下位置找到自己制作的uniapp原生插件
8.aar原生插件在本地离线打包中测试功能,为什么不直接用云打包测试呢,因为云打包不好看异常

根据第7条,切换到运行simpleDemo模块需要的gradle版本,
并在新建的uniapp项目中使用已经注册的AeroFFmpegModule模块


将打好的包放进这个位置
其他配置参考 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android.html
运行simpleDemo模块,观察是否调用到自己的原生插件

9.自己的原生插件集成到uniapp项目中,使用云打包,为什么不用本地离线打包生成最后的apk,因为uniapp很多其他原生插件配置太多,所以走先制作测试好原生插件,在真实项目中直接使用

package.json文件内容
{
"name": "AeroFFmpeg",
"id": "AeroFFmpeg",
"version": "1.0.0",
"description": "AeroFFmpeg 视频处理插件",
"_dp_type": "nativeplugin",
"_dp_nativeplugin": {
"android": {
"plugins": [
{
"type": "module",
"name": "AeroFFmpegModule",
"class": "com.mmwz.aeroffmpegmodule.AeroFFmpegModule"
}
],
"integrateType": "aar",
"libs": ["AeroFFmpegModule-release.aar"]
}
}
}
配置使用这个原生插件

然后打自定义基座

然后运行到真机

在uniapp前端通过使用原生插件
// 引入原生插件
const ffmpegModule = uni.requireNativePlugin('AeroFFmpegModule');
10.我的资源包下载
通过网盘分享的文件:unisdk5.06_制作uniapp原生插件.rar
链接: https://pan.baidu.com/s/1T4lZw23Tf7MTMe4COCEZjQ?pwd=vktd 提取码: vktd

里面有AeroFFmpeg的uniapp原生插件,可以直接使用

使用方式
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<view class="container">
<button @click="compressVideo">压缩视频</button>
<button @click="cancelTask">取消任务</button>
<view class="status">{{ status }}</view>
</view>
</view>
</template>
<script>
// 引入原生插件
const ffmpegModule = uni.requireNativePlugin('AeroFFmpegModule');//AeroFFmpegPlugin
export default {
data() {
return {
title: 'Hello',
status: '等待操作'
}
},
onLoad() {
},
methods: {
compressVideo() {
this.status = '处理中...';
// 在页面 onLoad 或 mounted 中测试
console.log('插件对象:', ffmpegModule);
if (!ffmpegModule) {
uni.showToast({
title: '插件加载失败,请检查自定义基座',
icon: 'none'
});
} else {
uni.showToast({
title: '插件对象已获取',
icon: 'success'
});
}
// 获取文件路径(示例:应用私有目录)
const inputPath = plus.io.convertLocalFileSystemURL('_doc/input.mp4');
const outputPath = plus.io.convertLocalFileSystemURL('_doc/output.mp4');
// 构造 FFmpeg 命令
const command = `ffmpeg -i ${inputPath} -c:v copy -c:a copy ${outputPath}`;
// 调用插件执行
ffmpegModule.execute(command, (result) => {
console.log('执行结果:', result);
if (result.code === 0) {
this.status = '压缩完成!';
// 处理输出文件...
} else {
this.status = '失败: ' + result.message;
}
});
},
cancelTask() {
ffmpegModule.cancelTask((result) => {
this.status = '任务已取消';
});
},
getProgress() {
ffmpegModule.getProgressTime((result) => {
console.log('进度:', result.progressMs + 'ms');
});
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>