2012-01-13 14 views
31

Fondamentalmente ho una matrice di byte. Ogni riga (che significa byte []) rappresenta un'immagine. Come posso creare un film da questo (qualsiasi formato - avi, mpeg, qualunque cosa) e salvarlo come file? Ogni immagine può essere uno dei seguenti:Java: come posso creare un film da una serie di immagini?

int JPEG Encoded formats. 
int NV16 YCbCr format, used for video. 
int NV21 YCrCb format used for images, which uses the NV21 encoding format. 
int RGB_565 RGB format used for pictures encoded as RGB_565. 
int YUY2 YCbCr format used for images, which uses YUYV (YUY2) encoding format. 
int YV12 Android YUV format: This format is exposed to software decoders and applications. 

posso scegliere il formato a tutto ciò che mi piace, a patto che riesco a creare il filmato.

public void createMovie(byte[][] images) { 
    // and ideas on what to write here? 
} 

non ho bisogno l'effettiva attuazione, fammelo sapere l'idea e quali librerie esterne ho bisogno (se ho bisogno di alcuna).

Ho anche bisogno di modificare alcune delle immagini (il flusso di byte) prima di creare il film (per aggiungere del testo). Come lo posso fare?

La soluzione deve essere "solo Java"! Nessun programma esterno, nessun comando esterno (ma posso usare jar esterni).

Grazie!

+3

+1, per una domanda straordinaria. Vorrei poter rispondere a questo, ma la mia tazza è totalmente vuota su questo. Spero che qualcuno lo farà. Cordiali saluti –

risposta

8

La soluzione sembra essere quella di utilizzare Mencoder (o almeno, sembra essere una scelta semi-popolare).

Ecco un link che indirizza specificamente le funzionalità di images-to-movies in Mencoder.

Per quanto riguarda il rendering del testo sui telai prima di codificarli come parte del video, è possibile utilizzare le librerie di manipolazione delle immagini di Java2D per disegnare semplicemente il testo sulla parte superiore delle immagini in anticipo, ad esempio:

Questo è un modo per farlo, e this FAQ dovrebbe iniziare in t hat direction con Java2D, rendering dei font, ecc. e offrono indicazioni su ulteriori risorse.

La libreria ImageIO consente inoltre di leggere/scrivere un numero di formati immagine, consentendo in effetti di transcodificare immagini da, ad esempio, .jpg -> BufferedImage -> .png, o qualsiasi altro modo in cui è necessario farlo, se si desidera memorizzare temporaneamente i file immagine durante il processo di conversione e/o convertire tutte le immagini in un unico formato durante l'importazione per il progetto di conversione, ecc.

A seconda del numero di formati di output che si desidera supportare, probabilmente fare qualcosa di simile

public void createMovie(BufferedImage[] frames, String destinationFormat) 

... dove "destinationFormat" è qualcosa come "m4v", "mpeg2", "h .264 "," gif ", ecc.

+0

Grazie per la risposta! La tua soluzione suona alla grande! Ma Mencoder sembra essere un programma esterno. Ho già detto che ho bisogno di questo solo in Java? :) Non l'ho fatto ... – user361676

+0

Oh, non me ne sono reso conto. Se non vuoi utilizzare librerie/programmi esterni tramite chiamate di sistema, non ho soluzioni alternative, temo. – jefflunt

+0

Almeno la mia domanda su come scrivere il testo sopra le immagini è stata risposta. Grazie per questo! – user361676

2

Puoi provare a fare una gif con questo gif encoder.

+0

Grazie, ma ho bisogno di un avi o mpeg, compresso o non compresso. – user361676

4

Avete sentito parlare JMF (Java Media Framework), dal campione si possono trovare questo esempio: Generating a Movie File from a List of (JPEG) Images

+0

Questa sarebbe una soluzione ideale, ma non sono riuscito a trovare alcun tutorial che descriva come scrivere un file video usando JMF. Quel thread non ha risposte che posso leggere ... – user361676

+0

Ci scusiamo per il link precedente, non ho visto che era irrisolto. Questo esempio proviene dalla documentazione JMF, dovrebbe essere migliore. – webpat

1

ho scritto un lettore e scrittore MJPEG per la riproduzione di video all'interno delle applet Java. MJPEG non è il formato video più avanzato ma è molto facile da manipolare.Il codice fa parte della mia biblioteca di visione del computer BoofCV, ma potresti semplicemente estrarre questa classe per i tuoi scopi.

  1. Scarica questo file: CreateMJpeg.java
  2. Guardate funzione principale. Dove legge in immagini jpeg metti i tuoi dati byte [], ma dovrai prima convertirli in jpeg.
    • È possibile convertire in un formato JPEG utilizzando la libreria Java Standard
  3. Run modificato il codice e vedere il filmato

dispiace la sua non è in un formato più facile da usare, ma almeno si non ho bisogno di scherzare con JNI come alcune altre soluzioni.

+0

L'ho provato, ma il mio lettore non è stato in grado di aprire il file di output anche se lo avessi rinominato come "avi". – user361676

+0

quale giocatore? Sul mio sistema Ubuntu funziona bene in mplayer. –

+0

Ho provato MX Video Player e Mobo, nessuno dei due poteva giocarci. – user361676