Trattare con video (DVD, .avi .mkv) in Java

Dopo aver cercato una libreria decente per riprodurre video in Java, mi sono sbloccato. Tutti intorno stanno urlando per non usare JMF perché è obsoleto, vecchio e richiede all’utente di installarlo, altre alternative come VLCJ sembrano buone se funzionano, ma sono ancora relativamente instabili e si basano su una notevole quantità di codice nativo, e come trattare con DVD, sembra polvere d’oro da trovare in una libreria gratuita!

Opzioni attuali:

  • Ora JavaFX 2 sta guadagnando slancio è stato qualcosa che stavo guardando seriamente (da qui la mia domanda qui ) ma finora non ho avuto fortuna nel cercare di capire come far suonare qualcosa di più del video FLV standard.
  • VLCJ sta lavorando bene per quello che fa (vedi la mia risposta attuale) e al momento è quello che sto andando avanti. Usa libvlc per fare praticamente qualsiasi cosa, dato che può riprodurre praticamente qualsiasi file e anche riprodurre i DVD fuori dalla scatola. Il grosso problema è che devi usare più VM per ogni giocatore per farlo funzionare stabilmente, e questo significa che la risposta è relativamente lenta. Non ho ancora avuto questo approccio per lavorare su un Mac ancora.
  • JMF è ridicolmente obsoleto, orribile e non proprio un’opzione, per quanto mi riguarda. Ci ho giocato in passato, e l’esperienza non è stata buona!
  • FMJ dice che è una sostituzione per JMF. Devo ancora farlo funzionare, come la maggior parte delle altre persone con cui ho parlato, e questo di per sé mi rende stanco della sua qualità e comprensione anche se riesco a farlo funzionare!
  • Xuggler è ottimo per quello che fa, ha tutorial brillanti ed è molto ben scritto. Ma mentre è ottimo per il lavoro di transcodifica di basso livello, riprodurre un video e ottenere i frame nell’ordine giusto e in sincrono e così via è solo un incubo per funzionare correttamente, e aggiunge ancora più codice che significa più manutenzione, potenzialmente più bug ecc. ecc …
  • Non ho ancora provato GStreamer-Java con nessuna rabbia, anche se non sembra supportare la riproduzione di DVD (è un’app open source su cui sto lavorando in modo che anche i plugin commerciali non siano un’opzione) e il supporto per i codec non lo fa t sembra essere il più largo
  • JCodec è uno sforzo interessante, l’unico che ho visto per implementare il supporto video da una prospettiva Java pura, ma al momento il supporto per i formati è carente e si tratta di un progetto relativamente nuovo.
  • Scrivere qualcosa io stesso in una libreria nativa diversa per ogni piattaforma che voglio supportare. Questa è l’opzione di ultima istanza assoluta a causa della maggiore manutenzione e dei tempi di programmazione necessari.

Sulla base di quanto sopra (o di qualsiasi altra cosa tu possa pensare), quali opzioni raccomanderebbero le persone e ce ne sono altre ragionevoli che ho perso? O altre persone pensano che potrebbero essere disponibili nel prossimo futuro?

Dopo aver fatto un sacco di ricerche su diverse opzioni e provandone alcune, sono andato con VLCJ dopo tutto, ma ecco il trucco: tutte le cose VLCJ sono fatte in VM fuori processo. È un po ‘più complicato da configurare (vedi qui per come l’ho fatto) ma dopo puoi lanciare tutto ciò che ti piace e funziona perfettamente (attualmente usa 3 giocatori fuori processo senza problemi di stabilità).

Xuggler è stato grandioso, ma sfortunatamente troppo basso per me: l’enorme quantità di re-inventare la ruota (e una ruota peggiore in quel caso) richiesta solo per ottenere la riproduzione con la ricerca del lavoro mi ha un po ‘spiazzato; Sentivo che ci sarebbe voluto un tempo per risolvere tutti i problemi. Per la codifica / transcodifica / altri lavori video di basso livello, tuttavia, lo consiglio caldamente, senza dubbio.

Avvertenze con il mio approccio scelto? Bene, se le VM esterne non vengono chiuse in modo esplicito continueranno a riprodurre il video in background anche dopo che l’applicazione si sarà chiusa, e il debugging diventerà più difficile con questo approccio. Non ho ancora verificato che venga eseguito su Mac e il mio suggerimento iniziale probabilmente non è perché da quello che ho sentito MacOS non consente a un processo di controllare la finestra di un altro senza il permesso esplicito con il codice nativo. Questo dovrebbe essere ansible con un po ‘di lavoro però.

Come spunto per il progetto al quale sto lavorando al momento potrei vedere se riesco a concludere tutte queste funzionalità fuori processo in un semplice framework video Java che utilizza VLCJ sotto. Se qualcuno fosse interessato a questo (non posso promettere nulla ma più interesse ottengo, più è probabile che io ci lavori) quindi sentiti libero di farmelo sapere!

Quindi, dopo le mie ricerche e scoperte, consiglierei di andare con VLCJ (ma sicuramente usando giocatori fuori processo) se vuoi solo riprodurre / registrare / riprodurre contenuti video, e Xuggler se vuoi fare un video di basso livello con il i codec stessi Al momento della scrittura, non esiste una soluzione Java pura e semplice, e probabilmente resterà per un po ‘- fortunatamente è ansible ottenere risultati decenti con le librerie native su piattaforms diverse. Richiede solo molto più lavoro!

Ho usato jffmeg su alcuni dei miei progetti (ffmeg java bindings), finora non ho affrontato alcun problema. http://jffmpeg.sourceforge.net/documentation.html . Ho anche usato qt-jambi, ma non ho mai provato la sua libreria video (phonon), questo può anche risolvere il tuo problema.

Hai provato a utilizzare le API JavaFX ?.

Il mio modo di vedere JavaFX include il supporto per la riproduzione H.264 … e qui qualcuno mostra come riprodurre i video nel nuovo WebM / VP8 di Google open source

http://javafxplace.blogspot.com/2010/06/javafx-and-webm-on-linux.html

Prova Xuggler , avvolge le famose librerie FFmpeg in Java.

Posso raccomandare le associazioni gstreamer-java . Come suggerisce il nome, avvolge l’API di GStreamer nelle classi Java. In questo modo puoi accedere alle funzionalità di elaborazione dei media che GStreamer offre. Questo può essere davvero utile se si desidera eseguire attività più avanzate come la transcodifica.

Inoltre, se ricordo bene, esisteva un plugin commerciale per GStreamer che supportava la riproduzione di DVD e veniva fornito con una licenza per il CSS. Se questo non è importante per il tuo caso d’uso, puoi sempre andare con quello open-source (l’unico che abbia mai avuto bisogno).

Sono d’accordo con stare lontano da JMF. Soprattutto se vuoi giocare a DVD. Persino JMF si affida al codice nativo per alcune delle sue funzionalità. Probabilmente non ti libererai dall’avere comunque una sorta di dipendenza nativa. Un’altra opzione potrebbe essere FMJ. È una versione open source di JMF. Non ho avuto molta fortuna con esso comunque.

Il mio suggerimento sarebbe di andare con VLCJ. Stavo esplorando questo quando avevo bisogno di una soluzione multimediale. Sfortunatamente è rilasciato sotto GPL, quindi non posso usarlo nella mia applicazione, ma sembra che dovrebbe essere in grado di gestire quello che vuoi.

Inoltre, il mio altro post potrebbe interessarti. collegamento

Inoltre, questo potrebbe essere utile.

Attualmente sto usando la libreria OpenImaj http://openimaj.org/tutorial che ha a

 XuggleVideo and XuggleAudio class 

Ti suggerirei di usarlo e implementare i tuoi meccanismi di threading per riprodurli. Attualmente sto lavorando su un lettore multimediale con la speranza di farlo riprodurre i formati video “popolari” dal momento che

 VideoDisplay class 

nella libreria fa un buon lavoro ma la riproduzione è piuttosto mosso e la libreria è stata implementata tenendo conto dell’oscillazione e allegando il

 ImageComponent 

a un nodo swing non sembra funzionare per qualche motivo in JavaFx, ma sono in grado di ottenere immagini da un video visualizzato per ora e spero di avere un po ‘di fortuna con questo.