有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    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的接口,我建议注册一个自定义UrlStreamHandler和一个从内存读取的自定义协议。但是假设JavaDoc是正确的,JavaFX使用它自己的解析,所以这可能不起作用

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

    1)按照Quick Start Guide启动码头

    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();    
    
  2. # 2 楼答案

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

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