从输入流播放JavaFx中的mp3文件
我使用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文件解密为临时目录中的临时文件,但这会造成性能开销,而且音频内容不安全 不幸的是,作为媒体构造器,我认为除了临时文件方法之外,没有
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:我正试图实施你的建议,但我被困在这个问题上:你能帮我解决吗?在将内容解码到内存时,你是指硬盘上的临时文件?