之前做了流媒体服务器,想用HbuilderX开发个APP,做直播推流,HB提供的插件LivePusher功能少了点,所以想到了FFMPEG。在这里打包的就是mobile-ffmpeg4.4版本。下面是工具传送门:
1.mobile-ffmpeg4.4的releases版本,用的是mini版aar文件,因为HB的云打包限制是40M。
2.android-studio-2020.3.1.22-windows.exe,采坑:低于这个版本构建的时候会报错,而且在新建moudle的时候无法创建,稍后还有不少坑,一个一个过。
3.HbuliderX,下个最新版本,没坑,简单。
4.HB的工程包(安卓的),里面有示例工程和SDK
准备工作做好了---------------------------------------------------------------------------------------------
一、android studio的工作
1.import Project
也就是我们上面准备的第四个
2. 然后将下载的 FFMPEG的aar文件放入到:
app/libs下面
采坑:如果你没有看到 libs目录,需要以下操作:
3.创建新的moudle工程
4.修改新建工程下的build.gradle
原文如下:
plugins {
id 'com.android.library'
}
android {
compileSdk 30
defaultConfig {
minSdk 16
targetSdk 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
修改为:
apply plugin: 'com.android.library'
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])
compileOnly fileTree(dir: '../app/libs', include: ['mobile-ffmpeg-min-4.4.LTS.aar'])
compileOnly "com.android.support:recyclerview-v7:28.0.0"
compileOnly "com.android.support:support-v4:28.0.0"
compileOnly "com.android.support:appcompat-v7:28.0.0"
implementation 'com.alibaba:fastjson:1.1.46.android'
implementation 'com.facebook.fresco:fresco:1.13.0'
}
其实两个配置文件的主要差异就在dependencies 这里,HB要使用compileOnly 的方式引用三方包
配置文件编写完了sync 同步下。这样接下来创建CLASS文件的引用就都有了,否则引用不到的。
5. 创建UniMoudle文件
相关FFMPEG的执行命令,在GITHUB上的DOC里都有,可以自行翻阅。
package com.muearfm.hbffmpeg44min;
import com.arthenica.mobileffmpeg.ExecuteCallback;
import com.arthenica.mobileffmpeg.FFmpeg;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
public class HBffmpeg44minModule extends UniModule {
//全局变量 执行ID
public long executionId = 0;
//同步执行
@UniJSMethod(uiThread = true)
public void FFexecute(String command, UniJSCallback callback) {
if(callback != null) {
//执行ffmpeg的命令行
int backdata = FFmpeg.execute(command);
//0 on successful execution, 255 on user cancel
callback.invoke(backdata);
}
}
//同步取消
@UniJSMethod(uiThread = true)
public void FFcancel() {
FFmpeg.cancel();
}
//异步执行
@UniJSMethod(uiThread = true)
public void FFexecuteAsync(String command, UniJSCallback callback, ExecuteCallback executeCallback) {
if(callback != null) {
//执行ffmpeg的命令行
executionId = FFmpeg.executeAsync(command,executeCallback);
//0 on successful execution, 255 on user cancel
callback.invoke(executionId);
}
}
//异步取消
@UniJSMethod(uiThread = true)
public void FFcancel(long executionId) {
FFmpeg.cancel(executionId);
}
}
6.修改dcloud_uniplugins.json文件,将插件加入,路径app/src/main/assets
name我是按照HB官方的命名要求写的,怕到时候引用错误。
{
"plugins": [
{
"type": "module",
"name": "muearfm-HBffmpeg44Modulemin",
"class": "com.muearfm.hbffmpeg44.HBffmpeg44minModule"
}
]
}
7.打包aar
过坑A:Gradle的控制台找不到,在下图里
对,就是左下角那个小方块。点击就出现了
过坑B:看不到task里的内容的时候,在设置里 关闭不编译
现在可以 双击assemble进行编译了。
第一层:是主目录,一般用来标记版本号
第二层:插件名称,不加版本号
第三层:包涵android目录、IOS目录和package.json
第四层:android目录包涵libs和刚才生成的aar
第五层:libs目录包涵项目要引用的三方SDK
文件目录配置完了,放入文件,开始编辑package.json
{
"name": "mobileffmpeg44min",
"id": "muearfm-HBffmpeg44minModule",
"version": "1.0.0",
"description": "移动端FFMPEG4.4min同步",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"android": {
"plugins": [
{
"type": "module",
"name": "muearfm-HBffmpeg44minModule",
"class": "com.muearfm.hbffmpeg44min.HBffmpeg44minModule"
}
],
"integrateType": "aar",
"minSdkVersion" : 16
}
}
}
选填参数没有,就不写。IOS没有也不写。参数说明参考官网
9.用HB加载插件
10.打包自定义基座(HB)
打包基座不超过40M,否则要本地打包,挺麻烦的。今天先写到这,我还没试好不好用。。。
略略略略略略略略略略略略......试验好了再写,