2012-11-24 10 views
8

Sto usando il lettore multimediale JavaFX per riprodurre un file MP3 utilizzando seguente codiceriproduzione di file MP3 in JavaFX dal flusso di input

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

Tuttavia ora ho un requisito che ho i dati mp3 byte in memoria invece di un Oggetto File. Il motivo è che il file mp3 è crittografato e quindi spedito insieme al programma. Quindi ho bisogno di decifrare il file mp3 in memoria o il flusso di input.

Potrei decodificare il file mp3 in un file temporaneo nella directory temporanea, ma questo sarebbe un overhead delle prestazioni e il contenuto audio sarebbe insicuro.

risposta

0

Sfortunatamente mentre il costruttore di supporti si trova, non vedo un modo semplice per farlo a parte l'approccio di file temporaneo. Si noti che, mentre sono d'accordo, le prestazioni avrebbero un overhead, se i file non sono troppo grandi (la maggior parte dei file mp3 in genere non lo sono), il sovraccarico dovrebbe essere minimo in questo senso. E tecnicamente, decodificare il contenuto in memoria lo rende anche non sicuro (sebbene sia molto più difficile da estrarre.)

Un approccio un po 'pazzo che ho pensato era quello di utilizzare le prese. È possibile configurare una parte separata dell'applicazione che decrittografa il contenuto non crittografato e quindi trasmette i byte mp3 grezzi su una determinata porta su localhost. È quindi possibile fornire questo come un URI HTTP al costruttore Media.

+0

Con la decodifica del contenuto in memoria si intende il file temporaneo sul disco rigido? –

2

Dalle Media Javadoc

Solo HTTP, FILE e URL JAR sono supportati. Se l'URL fornito non è valido, verrà generata un'eccezione. Se si verifica un errore asincrono, verrà impostata la proprietà dell'errore. Ascolta questa proprietà per essere avvisati di tali errori.

Non conosco personalmente JavaFX, ma ciò mi suggerisce che senza ricorrere a brutti hack, non sarai in grado di leggere i media direttamente dalla memoria. Normalmente per questo tipo di interfaccia URI solo suggerirei di registrare un custom UrlStreamHandler e un protocollo personalizzato che legge dalla memoria. Ma supponendo che JavaDoc sia corretto, JavaFX usa la propria risoluzione quindi presumibilmente questo non funzionerà.

Dato questo, ho il sospetto che l'unico modo per farlo funzionare è quello di fornire l'accesso alla memoria MP3 su HTTP. È possibile farlo utilizzando Jetty o qualsiasi contenitore di servlet embeddable simile. Qualcosa lungo le seguenti linee:

1) Start Up Jetty secondo Quick Start Guide

2) Registrare un servlet che sembra qualcosa di simile qui di seguito. Questo servlet esporrà i dati in-memory:

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); 
    } 
} 

Quindi è possibile accedere dall'interno dell'applicazione utilizzando un URL HTTP. Per esempio. qualcosa come

MagicAccessServlet.registerMedia(decodedMp3); 
new MediaPlayer(new Media("http://localhost:<port>/<context>/<servlet>?key=" + key)).play();  
+0

EdC: Sto cercando di implementare la tua proposta, tuttavia sono bloccato a questo: http://stackoverflow.com/questions/14627114/jetty-and-or-servlet-api-in-javafx-breaks-deployment potrebbe per favore aiutami? – Csabi