首页 > 解决方案 > 使用或不使用 JavaFX 从中间播放 mp3

问题描述

有没有办法在不使用 JavaFX 的情况下从特定的起点在 java 中播放 mp3?我尝试了许多库,但那些我可以开始工作的库不提供启动、暂停、停止之外的功能。

我正在使用 Eclipse。

编辑:我对 JavaFX 的体验:


    --module-path "C:\my\path\to\External Libraries\javafx-sdk-14\lib" --add-modules javafx.controls,javafx.fxml


    package application;

    import java.io.File;
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;

    public class Game {

        public Game() {

            String songPath = "C:\\Users\\Dustin\\Meine Dateien\\Musik\\EDM\\1991 - Jungle Cats.mp3";

            Media hit = new Media(new File(songPath).toURI().toString());
            MediaPlayer mediaPlayer = new MediaPlayer(hit);
            mediaPlayer.play();
        }

    }


    Exception in Application start method
    java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
    Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:830)
    Caused by: java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x69d159f0) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x69d159f0
        at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:110)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
        at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
        at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
        at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
        at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
        at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:239)
        at javafx.scene.media.Media.<init>(Media.java:393)
        at application.Game.<init>(Game.java:18)
        at application.Main.start(Main.java:21)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        ... 1 more
    Exception running application application.Main

标签: javaaudiomp3playback

解决方案


如果您的库公开了允许您读取每个缓冲区的特定帧数的功能,那么到达特定时间的一种方法是在不播放的情况下读取,同时计算相应的帧数,丢弃数据。这有时会起作用,因为音频处理比播放该数据要快得多。延迟将与您必须跳过以到达所需位置的音乐量成正比。

另一种策略是将整个文件加载到内存中并使用剪辑的定位能力。如果您正在处理长达数分钟的流,这可能是不可行的。

您不想使用 JavaFX 的任何特殊原因?


推荐阅读