2009-02-02 47 views
19

Attualmente sto lavorando ad un'applicazione web che deve accettare video caricati dagli utenti in qualsiasi formato (.avi, .mov, ecc.) E convertirli in flv per giocare in un flash-based giocatore.Conversione programmata di un video in FLV

Poiché il sito è basato su OpenCms, la soluzione migliore sarebbe un plug-in pronto per OpenCms che consentisse di caricare e riprodurre video facendo l'operazione di transcodifica in background, ma solo un set di classi Java per eseguire la transcodifica essere grandi e quindi potrei rendere il modulo di caricamento e la parte di riproduzione da solo.

risposta

10

Hai sostanzialmente due scelte, se si desidera ospitare, transcodificare e lo streaming di file FLV (e non vogliono acquistare un applicazione video transcoding): è possibile chiamare fuori a FFMpeg/MEncoder o è possibile utilizzare un servizio Web esterno. Puoi anche eludere completamente il problema consentendo loro di incorporare video di YouTube sul tuo sito.

Se si utilizza la "route FFMpeg locale", suggerirei semplicemente di utilizzare ProcessBuilder e di costruire una riga di comando per eseguire FFMpeg. In questo modo hai il pieno controllo su ciò che viene eseguito, eviti JNI, che è un incubo assoluto con cui lavorare, e tieni il codice specifico del sistema operativo fuori dalla tua app. Puoi trovare FFMPeg con tutti i campanelli e fischietti per quasi tutte le piattaforme. C'è una buona possibilità che sia già sul tuo server.

La cosa bella del percorso "Local FFMPeg" è che non devi pagare per nessun hosting extra, e tutto è in esecuzione a livello locale, anche se il tuo amministratore di hosting potrebbe iniziare a lamentarsi se stai utilizzando una quantità pazzesca di disco e CPU. Esistono altre domande StackOverflow che parlano di alcuni degli gotchas using FFMpeg per creare flv che è possibile riprodurre in Flash Player.

Il percorso del servizio Web è bello perché è necessario meno impostazioni. Non ho usato Hey!Watch ma sembra promettente. PandaStream è facile da configurare e funziona bene, inoltre ottieni tutti i tuoi video su S3 senza ulteriori sforzi.

+0

L'utilizzo della CPU è sicuramente qualcosa che dovresti fare attenzione se stai utilizzando un ambiente di hosting condiviso. La maggior parte dei piani offre molto spazio su disco e larghezza di banda, ma è molto avara della potenza della CPU che si utilizza. – Kibbee

21

C'è un ottimo strumento open source chiamato FFmpeg che uso per transcodificare i miei video. Io uso PHP facendo chiamate alla shell per farlo prendere vita, ma non posso immaginare che sarebbe troppo difficile farlo giocare con Java. (Maybe this could be a good starting point for you.)

Alimento la mia installazione più di 30 lotti di gig ogni settimana e viene sempre fuori come materiale di qualità. L'unica parte delicata per me è stata la compilazione per gestire un'ampia varietà di formati video. Dal lato positivo, questo mi ha fornito un sollevamento pesante di cui ho bisogno.

+0

Conosco FFMpeg, ma non sono sicuro di poter effettuare una chiamata shell sul mio server web (soprattutto perché non conosco il sistema operativo su cui gira e vorrei che la mia app fosse indipendente dal sistema operativo), speravo di trovare qualcosa di puro java – Raibaz

+0

FFMpeg è purtroppo l'unico giocatore REALE nel gioco gratuitamente. FFmpeg è comunemente usato su Linux, ma c'è anche un binario di Windows se sei così inclinato. – UltimateBrent

+0

assicurati di ottenere/compilare un binario con il supporto LAME, in quanto FLV tipicamente usa MP3 per il suo flusso audio –

1

Si può provare a utilizzare un servizio online come HeyWatch per convertire il video. Mai usato ma sostengono

"caricati trasparente, inviare video in modo trasparente dal tuo sito web"

Non

una soluzione Java, ma non avrebbe dovuto preoccuparsi di quale sistema operativo l'applicazione web è sopra.

Se il sistema operativo non era un problema, sono d'accordo con la risposta fornita da theBadDawg. Non lo so e non ho avuto fortuna nel trovare una soluzione java pura.

1

La codifica dei file in un formato a un altro richiede molto tempo di sviluppo per essere corretta, motivo per cui c'è così poco in termini di decodificatori/codificatori che sono in grado di realizzare tali imprese. Quelli che sono ben noti e usati di più sono ffmpeg e mencoder.

È possibile verificare se la piattaforma su cui si sta eseguendo (Windows/Mac OS X/Other unix) ha un set sottostante di chiamate API che è possibile utilizzare per decodificare i file e ricodificarli. Windows ha DirectShow e Mac OS X ha Quicktime. Non sono sicuro se puoi accedere a quelle API usando Java però.

FFMpeg ha un wrapper Java disponibile: FFMPEG Java e c'è anche FOBS che ha un JNI disponibile per il proprio wrapper C++ attorno a ffmpeg. L'ultimo che ho trovato jFFmpeg, tuttavia ci sono alcuni post che ho trovato con Google che suggeriscono che il progetto potrebbe non essere più vivo.

La tua migliore scommessa potrebbe essere mencoder di mplayer o ffmpeg. Ffmpeg può essere installato come un binario separato e quindi chiamato da un altro codice usando i comandi di "shell" predefiniti. Se tuttavia non sei in grado di eseguire comandi, potresti dover consultare un sito di conversione online come suggerito da Mark Robinson.

4

Questo può essere leggermente tangenziale, ma ho trovato Panda Stream per essere una soluzione molto utile per tutti i tipi di problemi di codifica video.

Tutto quello che dovete fare è di caricare il file video a un'istanza Amazon EC2 in esecuzione Panda e sarà codificare il video ai tuoi formati e qualità desiderata e emetterà un callback al server applicazioni con i dettagli quando è fatto. Puoi quindi utilizzare il lettore Flash Video in bundle o il tuo lettore per riprodurre i video sul tuo sito.

È molto scalabile (grazie ad Amazon EC2 & S3), soluzione economica e personalizzabile rispetto al proprio.

Altamente raccomandato.

Aggiornamento:

L'architettura della Panda è la seguente:

Architecture of Panda Stream http://pandastream.com/images/panda_arch.gif

  1. pagina visualizza sotto forma di upload di Panda in un iframe o popup
  2. video Carica con AJAX barra di avanzamento
  3. Chiamata API quando la codifica è completa
  4. video streaming per l'utente
20

È possibile codificare video in Java utilizzando Xuggler, che è un'API Java che utilizza in modo nativo il codice C di FFmpeg dietro le quinte.

+1

+1 e molti altri upvotes per le tue risposte, che sono sottovalutate. Arte, grandi complimenti per il tuo lavoro nel progetto Xuggler. – cetnar

+0

Xuggler non è un puro eseguibile java - È necessario installarlo sul sistema operativo. Ciò significa che se mi piacerebbe utilizzarlo su Android, non posso. –

1

Se vuoi farlo con java, puoi farlo facilmente usando Xuggle.

Hanno un grande sito web che spiega come fare tutto

la documentazione è qui: http://build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

e un ottimo tutorial che ti dice come fare quello che vuoi è qui: http: // blog .xuggle.com/2009/06/05/introduction-to-xuggler-mediatools/

Forniscono un modo semplice per eseguire ciò che si desidera nel primo tutorial, che è semplice codifica.

Ho trovato che funziona bene per la codifica in FLV. Quello che fa dietro le quinte è usare ffmpeg, quindi tutto ciò che farà scattare ffmpeg fallirà anche con xuggle.

Il codice di esempio Java rilevante è:

// create a media reader 
IMediaReader reader = ToolFactory.makeReader("videofile.flv"); 

// add a viewer to the reader, to see the decoded media 
reader.addListener(ToolFactory.makeWriter("output.mov", reader)); 

// read and decode packets from the source file and 
// and dispatch decoded audio and video to the writer 
while (reader.readPacket() == null) 
    ; 

che ho ricevuto da http: //wiki.xuggle.com/MediaTool_Introduction

Se volete un po 'di codice clojure completamente funzionante ... qui è :)

(import '(com.xuggle.mediatool ToolFactory)) 
(import '(com.xuggle.mediatool IMediaDebugListener IMediaDebugListener$Event)) 

    (defn readerRecurse 
     "calls .readPacket until there's nothing left to do2" 
     [reader] 
     (if (not (nil? (.readPacket reader))) ; here .readPacket actually does the processing as a side-effect. 
     true         ; it returns null when it has MORE ro process, and signals an error when done... 
     (recur reader))) 


    (defn convert 
     "takes video and converts it to a new type of video" 
     [videoInput videoOutput] 
     (let [reader (ToolFactory/makeReader videoInput)] 
     (doto reader 
      (.addListener (ToolFactory/makeWriter videoOutput reader)) 
      (.addListener (ToolFactory/makeDebugListener (into-array [IMediaDebugListener$Event/META_DATA])))) 
     (readerRecurse reader))) 

ora tutto quello che dovete fare è qualcosa di simile:

(convert "/path/to/some_file.stupid_extention" "/path/to/awesome.flv") 

e il gioco è fatto!

0

Potreste anche essere interessati a sentire che ora abbiamo rilasciato Panda come servizio in hosting pure, che rende l'installazione e scalabilità più facile :)

http://pandastream.com

0

sì, ffmpeg è la migliore per questo lavoro ... Usiamo ffmpeg per convertire i video per molto tempo e funziona con tutti i formati video. Numerose opzioni ci sono ..