java - 使用或不使用 JavaFX 从中间播放 mp3
问题描述
有没有办法在不使用 JavaFX 的情况下从特定的起点在 java 中播放 mp3?我尝试了许多库,但那些我可以开始工作的库不提供启动、暂停、停止之外的功能。
我正在使用 Eclipse。
编辑:我对 JavaFX 的体验:
我安装了 e(fx)clipse。
我将他们所有的 jar 添加到 Build Path 中。
我将此添加到 VM 参数中:
--module-path "C:\my\path\to\External Libraries\javafx-sdk-14\lib" --add-modules javafx.controls,javafx.fxml
- Main 的 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
解决方案
如果您的库公开了允许您读取每个缓冲区的特定帧数的功能,那么到达特定时间的一种方法是在不播放的情况下读取,同时计算相应的帧数,丢弃数据。这有时会起作用,因为音频处理比播放该数据要快得多。延迟将与您必须跳过以到达所需位置的音乐量成正比。
另一种策略是将整个文件加载到内存中并使用剪辑的定位能力。如果您正在处理长达数分钟的流,这可能是不可行的。
您不想使用 JavaFX 的任何特殊原因?
推荐阅读
- javascript - 在 React JS useState 中再次更新相同状态时如何保持对象值的更新状态数组?
- wordpress-theming - Themosis 1.3 侦察模板循环
- javascript - firebase firestore 嵌套请求
- mysql - Angular JS 响应
- audio - 如何禁用对 VMware 工作站中麦克风的访问?
- json - 适用于 Visio 2019 的 Vba
- databricks - 我们如何访问附加笔记本中的 databricks 作业参数?
- reactjs - 如何将样式应用于 DataGridFilter 面板?
- javascript - Firebase onBackgroundMessage 在 React 中显示未定义的重复消息
- javascript - 为什么分号会影响我的 javascript 代码的行为?