# 我做了一个 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) } } } ```