java从输入流在JavaFx中播放mp3文件
我使用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文件解密为临时目录中的临时文件,但这会造成性能开销,而且音频内容不安全
# 1 楼答案
从Media Javadoc
我个人对JavaFX并不熟悉,但这对我来说意味着,如果不借助讨厌的黑客,您将无法直接从内存中读取媒体。通常,对于这种仅限URI的接口,我建议注册一个自定义UrlStreamHandler和一个从内存读取的自定义协议。但是假设JavaDoc是正确的,JavaFX使用它自己的解析,所以这可能不起作用
考虑到这一点,我怀疑实现这一功能的唯一方法是通过HTTP提供对内存中MP3的访问。您可以使用Jetty或任何类似的可嵌入servlet容器来实现这一点。大致如下:
1)按照Quick Start Guide启动码头
2)注册一个如下所示的servlet。此servlet将公开内存中的数据:
然后,您可以使用http url从应用程序内部进行访问。比如说
# 2 楼答案
不幸的是,作为媒体构造器,除了临时文件方法之外,我看不到任何简单的方法可以做到这一点。请注意,虽然我同意性能会有开销,但如果文件不是太大(大多数mp3文件通常不是),那么从这个意义上讲,开销应该是最小的。从技术上讲,将内容解码到内存中也会使其变得不安全(尽管无可否认,提取起来要困难得多)
我确实想到了一个有点疯狂的方法,那就是使用套接字。您可以在应用程序中设置一个单独的部分,对未加密的内容进行解密,然后通过localhost上的某个端口将原始mp3字节流式传输。然后,您可以将其作为HTTP URI提供给媒体构造函数