This paper is structured as a technical brief suitable for developers integrating advanced playback capabilities into KMP applications (Android/iOS/Desktop). 1. Introduction Kotlin Multiplatform (KMP) allows sharing business logic across Android, iOS, and Desktop JVM targets. However, media playback with support for proprietary or less common codecs (e.g., E-AC-3, DTS, RV40, some MPEG-4 variants) remains a challenge because native platform players (ExoPlayer, AVFoundation, MediaPlayer) rely on system codecs.
implementation("org.videolan.android:libvlc-all:3.5.0") This includes libvlcjni.so (armeabi-v7a, arm64-v8a, x86, x86_64) automatically.
// androidMain/kotlin/PlatformMediaPlayer.kt import org.videolan.libvlc.LibVLC import org.videolan.libvlc.MediaPlayer import org.videolan.libvlc.Media actual class PlatformMediaPlayer private lateinit var libVLC: LibVLC private lateinit var mediaPlayer: MediaPlayer kmp external codec libvlcjni.so
val args = arrayOf("-vvv", "--codec=avcodec") // force ffmpeg decoders libVLC = LibVLC(context, args) Look for logcat output:
libvlc: using decoder module "avcodec" avcodec: using FFmpeg decoder for codec 'eac3' | Aspect | libvlcjni.so (Software) | MediaCodec (Hardware) | |--------|------------------------|------------------------| | CPU usage | High for 4K/HEVC | Low (GPU/DSP) | | Codec support | Full (hundreds) | Limited by device | | External codecs | Yes (built-in) | Rarely | | KMP compatibility | Works on Android, Linux, Windows | Android-only | This paper is structured as a technical brief
On Android, the libvlcjni.so ‑backed player will output audio correctly, whereas ExoPlayer would fail with No decoder for: audio/ac3 . libvlcjni.so provides KMP developers with a powerful, unified way to handle external codecs that are absent from platform decoders. By wrapping VLC’s engine in a KMP expect/actual pattern, you can achieve cross-platform playback with near‑identical behavior and extensive format support.
// shared logic fun playExternalCodecFile(player: PlatformMediaPlayer) player.setDataSource("content://com.example/external_codec_sample.mkv") player.play() However, media playback with support for proprietary or
The engine, via libvlcjni.so – its Android JNI bridge – provides a solution by bundling ffmpeg with hundreds of built-in external codecs, decoupled from the OS.