Estou tentando reproduzir mídia em javafx usando MediaView, MediaPlayer e Media. A classe Media parece aceitar apenas uma fonte de URL para criar Media (que é usada para passar para o MediaPlayer). Gostaria de passar uma matriz de bytes em cache para criar o objeto Media. Isso é compatível?
Consegui reproduzir mídia usando um URL e um arquivo, mas não uma matriz de bytes.
Do documento de mídia “Apenas URIs HTTP, HTTPS, FILE e JAR são suportados.”. Então você precisa servir seus bytes de um provedor em um desses protocolos.
Você pode executar um servidor http incorporado e servir os bytes dele usando o protocolo http.
Ou você pode usar um sistema de arquivos na memória, servindo os bytes usando os protocolos file ou jar.
Exemplo de servidor http incorporado servindo conteúdo de bytes na memória .
O exemplo serve tipos MIME de imagem, mas servir outros tipos de conteúdo para mídia funcionaria desde que o fluxo de entrada estivesse correto (por exemplo, representa dados mp3 ou mp4 codificados corretamente).
A opção mais simples seria gravar os bytes em um arquivo e depois passar um
file
URI para oMedia
construtor.No entanto, se você quiser manter os bytes da mídia na memória, acho que a solução mais fácil seria uma das sugestões da resposta do Jewelsea : Crie um servidor incorporado para servir a mídia por HTTP. Você pode usar o
jdk.httpserver
módulo para isso. Um exemplo usando esse módulo é dado nesta outra resposta do Jewelsea (vinculada na resposta a esta pergunta). Mas aqui está outro exemplo mais específico para o seu caso de uso.Código do servidor
Observe que este servidor de exemplo não está implementado para lidar com o
Range
cabeçalho HTTP. Acredito que a implementação de mídia JavaFX usará esse cabeçalho, pelo menos em alguns casos. Você pode querer implementar a funcionalidade no servidor.Além disso, pode ser mais fácil encontrar uma biblioteca de servidor HTTP com mais recursos e adicioná-la ao seu projeto como uma dependência, em vez de usar o
jdk.httpserver
módulo. Embora o último deva ser suficiente para um servidor simples e básico que existe apenas para servirbyte[]
matrizes por HTTP no host local.InMemoryMedia.java
InMemoryMediaServer.java
InMemoryMediaHandler.java
Código do aplicativo
Algum código mostrando como usar a
InMemoryMediaServer
classe.Principal.java