Воспроизведение mp3 с середины или без JavaFX - PullRequest
0 голосов
/ 08 апреля 2020

Есть ли способ воспроизвести mp3 в java из указанной c начальной точки без использования JavaFX? Я перепробовал много библиотек, но те, которые я могу заставить работать, не обеспечивают функциональные возможности после запуска, паузы, остановки.

Я использую Eclipse.

Редактировать: Мой опыт работы с JavaFX:

  • Я установил e (fx) clipse.

  • Я добавил все их банки в путь сборки.

  • Я добавил это к аргументам виртуальной машины:


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

  • Основной метод Main запускает приложение javafx и впоследствии метод start, который инициализирует мой класс Game со следующим код:

    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

1 Ответ

0 голосов
/ 09 апреля 2020

Если ваша библиотека предоставляет функциональность, которая позволяет считывать определенное количество c кадров на буфер, способ добраться до определенного времени - это чтение без воспроизведения при подсчете соответствующего количества кадров, отбрасывая данные. Иногда это работает, потому что обработка звука намного быстрее, чем воспроизведение этих данных. Задержка будет пропорциональна количеству музыки c, которую необходимо пропустить, чтобы добраться до нужного места.

Другая стратегия заключается в загрузке всего файла в память и использовании силы позиционирования клипа. Это может быть неосуществимо, если вы имеете дело с потоком, который длится много минут.

Есть какая-то конкретная причина, по которой вы не хотите использовать JavaFX?

...