gpt4 book ai didi

java - 从输入流在 JavaFx 中播放 mp3 文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:12 26 4
gpt4 key购买 nike

我正在使用 JavaFX 媒体播放器使用以下代码播放 mp3 文件

 new MediaPlayer(new Media(FileObject.toURI().toString())).play();

但是现在我有一个要求,我在内存中有 mp3 字节数据而不是文件对象。原因是 mp3 文件是加密的,然后随程序一起提供。因此我需要解密内存或输入流中的 mp3 文件。

我可以将 mp3 文件解密为 temp 目录中的一个临时文件,但这会产生性能开销并且音频内容会不安全。

最佳答案

来自Media Javadoc

Only HTTP, FILE, and JAR URLs are supported. If the provided URL is invalid then an exception will be thrown. If an asynchronous error occurs, the error property will be set. Listen to this property to be notified of any such errors.

我个人对 JavaFX 并不熟悉,但这对我来说意味着如果不借助讨厌的黑客手段,您将无法直接从内存中读取媒体。通常对于这种只有 URI 的接口(interface),我建议注册一个自定义的 UrlStreamHandler以及从内存中读取的自定义协议(protocol)。但是假设 JavaDoc 是正确的,JavaFX 使用它自己的分辨率,所以这可能是行不通的。

鉴于此,我怀疑使这项工作有效的唯一方法是通过 HTTP 提供对内存中 MP3 的访问。你可以使用 Jetty 来做到这一点或任何类似的可嵌入 servlet 容器。大致如下:

1) 根据 Quick Start Guide 启动 Jetty

2) 注册一个如下所示的 servlet。此 servlet 将公开您的内存中数据:

public class MagicAccessServlet extends HttpServlet {
private static final Map<String, byte[]> mediaMap = new ConcurrentHashMap();

public static String registerMedia(byte[] media) {
String key = UUID.randomUUID().toString();
mediaMap.put(key, media);
return key;
}

public static deregisterMedia(String key) {
mediaMap.remove(key);
}

public void doGet(HttpServletRequest req, HttpServletResponse resp) {
String key = req.get("key");
byte[] media = mediaMap.get(key);
resp.setContentLength(media.length);
resp.getOutputStream().write(media);
}
}

然后您可以使用 http url 从您的应用程序中访问。例如。像

MagicAccessServlet.registerMedia(decodedMp3);
new MediaPlayer(new Media("http://localhost:<port>/<context>/<servlet>?key=" + key)).play();

关于java - 从输入流在 JavaFx 中播放 mp3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539814/

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