git init
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
assets/** filter=lfs diff=lfs merge=lfs -text
|
||||
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.ico filter=lfs diff=lfs merge=lfs -text
|
||||
*.icns filter=lfs diff=lfs merge=lfs -text
|
||||
*.webp filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||
@@ -0,0 +1,111 @@
|
||||
# 我做了一个 KMP 的 FFmpeg 库
|
||||
|
||||
目前支持:
|
||||
|
||||
| | X86 | X64 | Arm32 | Arm64 |
|
||||
| ------- | :---: | :---: | :---: | :---: |
|
||||
| Android | | ✅ | ✅ | ✅ |
|
||||
| IOS | | | | |
|
||||
| Windows | | ✅ | | |
|
||||
| Linux | | ✅ | | |
|
||||
| MacOS | | | | ✅ |
|
||||
|
||||
## 开源地址
|
||||
|
||||
https://github.com/SOR2171/FFmpeg-Kit_KMP
|
||||
|
||||
## 经过
|
||||
|
||||
具体的流程还是很顺畅的,就是 Gralde 的设置卡了我好久。
|
||||
|
||||
### 各个平台的库文件
|
||||
|
||||
首先是把 akashskypatel 大佬做的 [FFmpegKit](https://github.com/akashskypatel/ffmpeg-kit-builders) 的库下载下来,这是已经做好包装的,使用起来非常方便。
|
||||
|
||||
唯一需要注意的一点是 MacOS 的库是没有扩展名的,因为没有也能用,可以自己命名为 `.dylib`
|
||||
|
||||
### 把 Android aar 包一并打包进 assemble 输出
|
||||
|
||||
按照 Google 的设置,Gradle 打包 aar 时,是不会把所依赖的 aar 一起打包进去的,所里这里要先做一个 `FFmpegKitKmp/ffmpeg-aar-wrapper` 然后在同目录的 `build.gradle.kts` 里面写
|
||||
|
||||
```kotlin
|
||||
configurations.maybeCreate("default")
|
||||
artifacts.add("default", file("libs/bundle-base-shared-lgpl-release.aar"))
|
||||
```
|
||||
|
||||
再在 `FFmpegKitKmp/settings.gradle.kts` 中加入一句 `include(":ffmpeg-aar-wrapper")`,再在 `FFmpegKitKmp/shared/settings.gradle.kts` 中的 Android 依赖中加入一句 `implementation(project(":ffmpeg-aar-wrapper"))`,就可以实现把 Android aar 包一并打包进 assemble 输出。
|
||||
|
||||
### assemble 输出库文件
|
||||
|
||||
执行 `:shared:assemble` 即可在所示位置拿到输出结果。
|
||||
|
||||
`FFmpegKitKmp/shared/build/outputs/aar/ffmpeg-kit-kmp.aar`
|
||||
`FFmpegKitKmp/shared/build/libs/ffmpeg-kit-kmp-jvm-dev.jar`
|
||||
|
||||
### 清理 Gradle 多余依赖
|
||||
|
||||
因为 Android Studio 的默认配置是给配齐所有的扩展的,但实际的库开发根本用不到那么多东西,需要删掉特别多东西,这里给一下最后留下来的东西。
|
||||
|
||||
`FFmpegKitKmp/shared/build.gradle.kts`
|
||||
|
||||
```kotlin
|
||||
plugins {
|
||||
id("com.vanniktech.maven.publish") version "0.37.0"
|
||||
alias(libs.plugins.kotlinMultiplatform)
|
||||
alias(libs.plugins.androidMultiplatformLibrary)
|
||||
}
|
||||
|
||||
kotlin {
|
||||
jvm()
|
||||
|
||||
android {
|
||||
namespace = "io.github.sor2171.ffmpegkitkmp"
|
||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
|
||||
compilerOptions {
|
||||
jvmTarget = JvmTarget.JVM_11
|
||||
}
|
||||
androidResources {
|
||||
enable = true
|
||||
}
|
||||
withDeviceTestBuilder {
|
||||
sourceSetTreeName = "test"
|
||||
}.configure {
|
||||
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
androidMain.dependencies {
|
||||
// https://github.com/akashskypatel/ffmpeg-kit-builders
|
||||
implementation(project(":ffmpeg-aar-wrapper"))
|
||||
|
||||
//noinspection UseTomlInstead
|
||||
implementation("net.java.dev.jna:jna:5.19.1@aar")
|
||||
implementation(libs.androidx.espresso.core)
|
||||
}
|
||||
commonMain.dependencies {
|
||||
}
|
||||
commonTest.dependencies {
|
||||
implementation(libs.kotlin.test)
|
||||
}
|
||||
jvmMain.dependencies {
|
||||
implementation(libs.jna)
|
||||
implementation(libs.slf4j.simple)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 目前仍存在的问题
|
||||
|
||||
如果直接在gradle中添加我的依赖,那么,可能会出现这样的问题
|
||||
|
||||
```bash
|
||||
C:\Users\32721\AppData\Local\Temp\ffmpegkit_2621802206663535111.dll: %1 不是有效的 Win32 应用程序。
|
||||
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
|
||||
......
|
||||
```
|
||||
|
||||
目前,我还不知道如何解决,但可以确认的是,拿编译输出的 jar 包直接用作依赖不会出现这样的问题。
|
||||
@@ -0,0 +1,57 @@
|
||||
# 引入 Kotlin
|
||||
|
||||
预计时间 1h
|
||||
|
||||
> 如果您会写 Java,那么事情将会**非常**简单。
|
||||
|
||||
## 基本语法
|
||||
|
||||
### 顶层函数
|
||||
|
||||
Kotlin 程序也从 main 函数开始,你可以直接这么写
|
||||
|
||||
```kotlin
|
||||
fun main() {
|
||||
println("Hello World!")
|
||||
}
|
||||
```
|
||||
|
||||
可以看到,它有很多 C++ 与 Python 的特点。
|
||||
|
||||
### 定义变量
|
||||
|
||||
这里不会列举所有写法,只写明最常用的写法。
|
||||
|
||||
#### 普通变量和类成员变量
|
||||
|
||||
```kotlin
|
||||
val a: Int // 可以注意到,所有类都以大写开头
|
||||
val a = 0 // 支持先声明,再赋值
|
||||
|
||||
val b = "abc" // 直接赋值省略显式变量类型
|
||||
|
||||
var c = 3.0f // 可变变量
|
||||
|
||||
const val STR = "常值变量支持String,推荐大写下划线"
|
||||
```
|
||||
|
||||
### 定义普通函数
|
||||
|
||||
在 Kotlin 里面,cpp 的 void $\Leftrightarrow$ Kotlin 的 Unit
|
||||
|
||||
```kotlin
|
||||
fun oneFuntion(): Unit {
|
||||
// do something...
|
||||
}
|
||||
```
|
||||
|
||||
在函数定义明确的时候是不需要指明返回值的,除非是接口或用作 lambda 变量。
|
||||
|
||||
|
||||
### 定义类与接口
|
||||
|
||||
## 高级一点
|
||||
|
||||
### lambda变量与复杂函数
|
||||
|
||||
## 某些独到的 Kotlin 小特性
|
||||
@@ -0,0 +1,27 @@
|
||||
# 引入 Kotlin
|
||||
|
||||
预计时间 1d
|
||||
|
||||
> 个人认为,Kotlin 是最好的 JVM 语言。
|
||||
|
||||
## 如果你会写 Java
|
||||
|
||||
请看 [为会写 Java 的朋友们设计的引入](./引入Kotlin_Java.md)
|
||||
|
||||
## 推荐 IDE
|
||||
|
||||
这边推荐 Jetbrains 的 [`IntelliJ IDEA`](https://www.jetbrains.com/idea/download/)
|
||||
|
||||
当然,各种类型的 VS Code,Neo Vim 也是很不错的,这边不提供具体教学。
|
||||
|
||||
## Hello World!
|
||||
|
||||
先创建一个完全空的 Kotlin 项目/文件,在里面写:
|
||||
|
||||
```kotlin
|
||||
fun main() {
|
||||
println("Hello World!")
|
||||
}
|
||||
```
|
||||
|
||||
编译运行。
|
||||
@@ -0,0 +1,8 @@
|
||||
# 进入KMP
|
||||
|
||||
> Kotlin Multiplatform 是基于 Jetpack Compose 框架的多平台应用编译技术,目前支持 Android,所有 JVM 平台,IOS,JS 网页(已被抛弃),WASM 网页。
|
||||
|
||||
## 选择一个 IDE
|
||||
|
||||
这可能感觉上很怪,但是 **Android Stuidio 对KMP的支持确实是最好的**。
|
||||
如果你不想做 Android 的部分,用 IDEA 也影响不大,而且 IDEA 有官方中文,Android Stuidio 没有。
|
||||
Reference in New Issue
Block a user