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

KMP纯桌面项目本地视频播放方案咨询,JavaFX集成遇阻

桌面端KMP本地视频播放方案

方案一:修复JavaFX集成问题

多数集成失败是因为KMP桌面模块的配置疏漏,按以下步骤重新配置:

  1. 桌面模块build.gradle.kts配置
    添加JavaFX插件与依赖,指定兼容的JVM版本:

    plugins {
        kotlin("multiplatform")
        id("org.openjfx.javafxplugin") version "0.0.13"
    }
    
    kotlin {
        jvm("desktop") {
            compilations.all {
                kotlinOptions.jvmTarget = "17"
            }
            withJava()
        }
        sourceSets {
            val desktopMain by getting {
                dependencies {
                    implementation("org.openjfx:javafx-controls:21")
                    implementation("org.openjfx:javafx-media:21")
                }
            }
        }
    }
    
    javafx {
        version = "21"
        modules = listOf("javafx.controls", "javafx.media")
    }
    
  2. 编写视频播放代码
    在桌面模块主类中,用JavaFX原生的MediaPlayer实现播放:

    import javafx.application.Application
    import javafx.scene.Scene
    import javafx.scene.layout.StackPane
    import javafx.scene.media.Media
    import javafx.scene.media.MediaPlayer
    import javafx.scene.media.MediaView
    import javafx.stage.Stage
    import java.io.File
    
    class VideoPlayerApp : Application() {
        override fun start(primaryStage: Stage) {
            val videoFile = File("path/to/your/local/video.mp4")
            val media = Media(videoFile.toURI().toString())
            val mediaPlayer = MediaPlayer(media)
            val mediaView = MediaView(mediaPlayer)
    
            val root = StackPane(mediaView)
            primaryStage.scene = Scene(root, 800.0, 600.0)
            primaryStage.show()
    
            mediaPlayer.play()
        }
    }
    
    fun main() {
        Application.launch(VideoPlayerApp::class.java)
    }
    

    注意:JavaFX原生支持MP4(H.264编码)、MKV等格式,若视频格式不兼容,可先转码后再播放。

方案二:使用JavaCV(基于FFmpeg)

如果JavaFX格式支持有限,或仍存在集成问题,JavaCV是更灵活的选择——它封装了FFmpeg,支持几乎所有本地视频格式:

  1. 桌面模块build.gradle.kts配置

    kotlin {
        jvm("desktop") {
            // 保留原有JVM配置
        }
        sourceSets {
            val desktopMain by getting {
                dependencies {
                    implementation("org.bytedeco:javacv-platform:1.5.9")
                }
            }
        }
    }
    
  2. 编写播放代码

    import org.bytedeco.javacv.CanvasFrame
    import org.bytedeco.javacv.FFmpegFrameGrabber
    import org.bytedeco.javacv.Frame
    import org.bytedeco.javacv.FrameConverter
    import java.awt.Dimension
    
    fun playLocalVideo(videoPath: String) {
        val grabber = FFmpegFrameGrabber(videoPath).apply { start() }
        val canvas = CanvasFrame("Local Video Player").apply {
            isVisible = true
            preferredSize = Dimension(grabber.imageWidth, grabber.imageHeight)
        }
    
        val converter = FrameConverter.ToBufferedImage()
        var frame: Frame?
        while (canvas.isVisible && grabber.grab().also { frame = it } != null) {
            canvas.showImage(converter.convert(frame))
        }
    
        grabber.stop()
        grabber.release()
        canvas.dispose()
    }
    
    fun main() {
        playLocalVideo("path/to/your/local/video.mp4")
    }
    

    该方案无需依赖JavaFX UI,直接使用AWT的CanvasFrame,KMP桌面模块原生兼容AWT。

方案三:使用LibGDX桌面模块

若项目需要复杂交互或游戏类UI,LibGDX桌面模块可与KMP无缝集成,且原生支持视频播放:

  1. 桌面模块build.gradle.kts配置

    val gdxVersion = "1.12.1"
    kotlin {
        jvm("desktop") {
            // 保留原有JVM配置
        }
        sourceSets {
            val desktopMain by getting {
                dependencies {
                    implementation("com.badlogicgames.gdx:gdx:$gdxVersion")
                    implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion")
                    implementation("com.badlogicgames.gdx:gdx-video:$gdxVersion")
                }
            }
        }
    }
    
  2. 编写播放代码

    import com.badlogic.gdx.ApplicationAdapter
    import com.badlogic.gdx.Gdx
    import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application
    import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration
    import com.badlogic.gdx.graphics.g2d.SpriteBatch
    import com.badlogic.gdx.video.VideoPlayer
    import com.badlogic.gdx.video.VideoPlayerCreator
    
    class VideoPlayerGame : ApplicationAdapter() {
        private lateinit var batch: SpriteBatch
        private lateinit var videoPlayer: VideoPlayer
    
        override fun create() {
            batch = SpriteBatch()
            videoPlayer = VideoPlayerCreator.createVideoPlayer()
            val videoFile = Gdx.files.absolute("path/to/your/local/video.mp4")
            videoPlayer.play(videoFile)
        }
    
        override fun render() {
            batch.begin()
            videoPlayer.render(batch)
            batch.end()
        }
    
        override fun dispose() {
            batch.dispose()
            videoPlayer.dispose()
        }
    }
    
    fun main() {
        val config = Lwjgl3ApplicationConfiguration().apply {
            setTitle("LibGDX Video Player")
            setWindowedMode(800, 600)
        }
        Lwjgl3Application(VideoPlayerGame(), config)
    }
    

内容的提问来源于stack exchange,提问作者Bojann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:12:10