gpt4 book ai didi

java - 使用或不使用 JavaFX 从中间播放 mp3

转载 作者:行者123 更新时间:2023-12-01 17:32:05 25 4
gpt4 key购买 nike

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

我正在使用 Eclipse。

编辑:我使用 JavaFX 的经验:

  • 我安装了 e(fx)clipse。

  • 我将他们所有的 jar 添加到构建路径中。

  • 我将其添加到虚拟机参数中:


--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 的任何具体原因是什么?

关于java - 使用或不使用 JavaFX 从中间播放 mp3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61099455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com