KMP纯桌面项目本地视频播放方案咨询,JavaFX集成遇阻
桌面端KMP本地视频播放方案
方案一:修复JavaFX集成问题
多数集成失败是因为KMP桌面模块的配置疏漏,按以下步骤重新配置:
桌面模块
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") }编写视频播放代码
在桌面模块主类中,用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,支持几乎所有本地视频格式:
桌面模块
build.gradle.kts配置kotlin { jvm("desktop") { // 保留原有JVM配置 } sourceSets { val desktopMain by getting { dependencies { implementation("org.bytedeco:javacv-platform:1.5.9") } } } }编写播放代码
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无缝集成,且原生支持视频播放:
桌面模块
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") } } } }编写播放代码
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
相关产品推荐
相关产品推荐

