我正在尝试使用 MediaView、MediaPlayer 和 Media 在 javafx 中播放媒体。Media 类似乎只接受 URL 源来创建媒体(用于传递给 MediaPlayer)。我想传递缓存的字节数组来创建媒体对象。这支持吗?
我能够使用 URL 和文件播放媒体,但不能使用字节数组播放。
我正在尝试使用 MediaView、MediaPlayer 和 Media 在 javafx 中播放媒体。Media 类似乎只接受 URL 源来创建媒体(用于传递给 MediaPlayer)。我想传递缓存的字节数组来创建媒体对象。这支持吗?
我能够使用 URL 和文件播放媒体,但不能使用字节数组播放。
来自媒体文档“仅支持 HTTP、HTTPS、FILE 和 JAR URI。”。因此,您需要从使用其中一种协议的提供商处获取字节。
您可以运行嵌入式 http 服务器并使用 http 协议提供该服务器的字节。
或者您可以使用内存文件系统,使用文件或 jar 协议提供字节。
示例嵌入式 http 服务器从内存中的字节提供内容。
该示例提供图像 MIME 类型,但只要输入流正确(例如,代表正确编码的 mp3 或 mp4 数据),为媒体提供其他内容类型也可以。
最简单的选择是将字节写入文件,然后将
file
URI 传递给Media
构造函数。但是,如果您想将媒体的字节保留在内存中,那么我认为最简单的解决方案将是jewelsea 的答案中的建议之一:创建一个嵌入式服务器以通过 HTTP 提供媒体。您可以使用模块来实现这一点。另一个 jewelsea 答案
jdk.httpserver
中给出了使用该模块的示例(链接到他们对这个问题的回答)。但这是另一个更适合您用例的示例。服务器代码
请注意,此示例服务器未实现处理
Range
HTTP 标头的功能。我相信 JavaFX 媒体实现将使用该标头,至少在某些情况下如此。您可能希望在服务器中实现该功能。此外,找到功能更丰富的 HTTP 服务器库并将其作为依赖项添加到项目中可能比使用模块更容易。尽管后者对于仅用于在本地主机上通过 HTTP 提供数组
jdk.httpserver
服务的简单、基本服务器来说已经足够了。byte[]
内存媒体.java
内存媒体服务器.java
内存媒体处理程序.java
应用程序代码
一些代码展示了如何使用该类
InMemoryMediaServer
。主程序