You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在面向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:30:57