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

标签 java streaming mp3 javafx-2 javafx

我正在使用 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/

相关文章:

java - Apache POI - 无法让折线图值出现在辅助轴中

java - 部署 war spring 失败 - 无法启动组件

python - Spark 流。从 Kafka 并行读取导致重复数据

python - 在python中均衡mp3文件的正确方法

java - 无法读取 MP3 帧头字节?

java - 是否有简单的正则表达式将 Java String List 转换为 Oracle IN 条件?

java - Android Twilio "make an HTTP POST to your Messages list resource URI"是什么意思?

android - Android 的这个音频流播放代码有什么问题?

java - 在哪里可以从适用于 Android 的相机示例应用程序获取流式(实时)视频和音频?

python - Mutagen 的 save() 不会设置或更改 MP3 文件的封面