从输入流播放JavaFx中的mp3文件

从输入流播放JavaFx中的mp3文件,java,streaming,mp3,javafx-2,javafx,Java,Streaming,Mp3,Javafx 2,Javafx,我使用JavaFX媒体播放器播放mp3文件,使用以下代码 new MediaPlayer(new Media(FileObject.toURI().toString())).play(); 然而,现在我有一个要求,我在内存中有mp3字节数据,而不是一个文件对象。原因是mp3文件经过加密,然后随程序一起提供。因此,我需要解密内存或输入流中的mp3文件 我可以将mp3文件解密为临时目录中的临时文件,但这会造成性能开销,而且音频内容不安全 不幸的是,作为媒体构造器,我认为除了临时文件方法之外,没有

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

 new MediaPlayer(new Media(FileObject.toURI().toString())).play();
然而,现在我有一个要求,我在内存中有mp3字节数据,而不是一个文件对象。原因是mp3文件经过加密,然后随程序一起提供。因此,我需要解密内存或输入流中的mp3文件


我可以将mp3文件解密为临时目录中的临时文件,但这会造成性能开销,而且音频内容不安全

不幸的是,作为媒体构造器,我认为除了临时文件方法之外,没有其他简单的方法可以做到这一点。请注意,虽然我同意性能会有开销,但如果文件不太大,大多数mp3文件通常不会太大,那么从这个意义上讲,开销应该是最小的。从技术上讲,将内容解码到内存也会使其变得不安全,尽管提取起来要困难得多

我确实想到了一个有点疯狂的方法,那就是使用套接字。您可以在应用程序中设置一个单独的部分,对未加密的内容进行解密,然后通过localhost上的某个端口将原始mp3字节流式传输。然后,您可以将其作为HTTP URI提供给媒体构造函数。

仅支持HTTP、文件和JAR URL。如果提供的URL无效,则将引发异常。如果发生异步错误,将设置error属性。侦听此属性以获得任何此类错误的通知

我个人对JavaFX并不熟悉,但这对我来说意味着,如果不借助讨厌的黑客,您将无法直接从内存中读取媒体。通常,对于这种仅限URI的接口,我建议注册一个自定义和一个从内存读取的自定义协议。但是假设JavaDoc是正确的,JavaFX使用它自己的解析,所以这可能不起作用

考虑到这一点,我怀疑实现这一功能的唯一方法是通过HTTP提供对内存中MP3的访问。您可以使用或任何类似的可嵌入servlet容器来实现这一点。大致如下:

1根据图纸启动码头

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();    

EdC:我正试图实施你的建议,但我被困在这个问题上:你能帮我解决吗?在将内容解码到内存时,你是指硬盘上的临时文件?