我做了一个 KMP 的 FFmpeg 库
主要分享制作流程。
目前支持:
Android X64 Arm32 Arm64
Windows X64
Linux X64
MacOS Arm64
开源地址
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 里面写
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
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
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 = 37
minSdk = 28
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"))
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)
}
}
}