Files
From_Kotlin_to_Kotlin-Multi…/Extra/我做了一个KMP的FFmpeg库.md
2026-09-12 21:15:20 +08:00

3.3 KiB

我做了一个 KMP 的 FFmpeg 库

目前支持:

X86 X64 Arm32 Arm64
Android ✅ ✅ ✅
IOS
Windows ✅
Linux ✅
MacOS ✅

开源地址

https://github.com/SOR2171/FFmpeg-Kit_KMP

经过

具体的流程还是很顺畅的,就是 Gralde 的设置卡了我好久。

各个平台的库文件

首先是把 akashskypatel 大佬做的 FFmpegKit 的库下载下来,这是已经做好包装的,使用起来非常方便。

唯一需要注意的一点是 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

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)
        }
    }
}