如何在面向Android与桌面的Kotlin Multiplatform项目中播放音频?
Kotlin Multiplatform(Android+桌面端)音频播放实现方案
一、原生平台适配实现
通过KMP的expect/actual机制,为Android和JVM桌面端分别实现音频播放逻辑,无需依赖第三方库。
1. 定义通用接口(Common源集)
先在common模块里定义统一的音频播放器接口:
interface AudioPlayer { fun play(audioFilePath: String) fun stop() fun pause() } expect fun createAudioPlayer(): AudioPlayer
2. Android端实现(Android源集)
使用Android系统自带的MediaPlayer或ExoPlayer,这里以MediaPlayer为例:
actual fun createAudioPlayer(): AudioPlayer = AndroidMediaPlayer() class AndroidMediaPlayer : AudioPlayer { private var mediaPlayer: MediaPlayer? = null override fun play(audioFilePath: String) { mediaPlayer?.release() mediaPlayer = MediaPlayer().apply { setDataSource(audioFilePath) prepareAsync() setOnPreparedListener { start() } } } override fun stop() { mediaPlayer?.stop() mediaPlayer?.release() mediaPlayer = null } override fun pause() { mediaPlayer?.pause() } }
如果需要支持更多格式、流媒体或更复杂的播放控制,推荐替换为ExoPlayer。
3. JVM桌面端实现(JVM源集)
使用Java标准库的javax.sound.sampled API:
actual fun createAudioPlayer(): AudioPlayer = JvmAudioPlayer() class JvmAudioPlayer : AudioPlayer { private var clip: Clip? = null override fun play(audioFilePath: String) { clip?.close() val audioStream = AudioSystem.getAudioInputStream(File(audioFilePath)) clip = AudioSystem.getClip().apply { open(audioStream) start() } } override fun stop() { clip?.stop() clip?.close() clip = null } override fun pause() { clip?.stop() // Java Sound的Clip无直接pause方法,可通过记录播放位置实现暂停续播 } }
注意:javax.sound.sampled仅支持WAV、AU等有限格式,若需支持MP3,可引入mp3spi等扩展库。
二、推荐第三方KMP音频库
1. KMP-Audio
轻量级KMP音频库,专为Android和JVM桌面端设计,提供统一的播放、暂停、停止、进度监听API,无需手动适配原生逻辑,上手成本低。
// Common层示例 val player = KmpAudioPlayer() player.load("file:///path/to/audio.mp3") player.play() player.pause() player.stop()
2. kotlinx.audio(JetBrains实验库)
JetBrains官方推出的实验性KMP音频库,支持Android和JVM,提供统一的音频播放、录制、格式处理API,功能更全面,适合需要高级音频操作的场景(注意:目前处于实验阶段,API可能变更)。
3. 自定义封装ExoPlayer+VLCJ
如果需要支持更多格式或复杂播放需求,可自行封装:Android端用ExoPlayer(支持几乎所有音频格式),JVM桌面端用VLCJ(基于VLC,支持全格式),通过KMP的expect/actual统一对外接口。
内容的提问来源于stack exchange,提问作者SHUBHASAI MOHAPATRA
相关产品推荐
相关产品推荐

