web-dev-qa-db-fra.com

Java: Comment créer un film à partir d'un tableau d'images?

J'ai essentiellement une matrice d'octets. Chaque ligne (signifiant octet []) représente une image. Comment puis-je créer un film à partir de cela (n'importe quel format - avi, mpeg, peu importe) et l'enregistrer en tant que fichier? Chaque image peut être l'une des suivantes:

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.

Je peux choisir le format de ce que je veux, tant que je peux créer le film.

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

Je n'ai pas besoin de l'implémentation réelle, faites-moi simplement savoir l'idée et les bibliothèques externes dont j'ai besoin (si j'en ai besoin).

J'ai également besoin de modifier certaines images (le flux d'octets) avant de créer le film (pour ajouter du texte). Comment puis je faire ça?

La solution doit être "Java uniquement"! Pas de programmes externes, pas de commandes externes (mais je peux utiliser des pots externes).

Merci!

33
user361676

La solution semble être d'utiliser Mencoder (ou du moins, cela semble être un choix semi-populaire).

Voici un lien qui traite spécifiquement des capacités images-to-movies dans Mencoder.

Quant au rendu du texte sur les images avant de les encoder dans le cadre de la vidéo, vous pouvez utiliser les bibliothèques de manipulation d'images de Java2D pour simplement dessiner du texte au-dessus des images au préalable Par exemple:

C'est une façon de le faire, et cette FAQ devrait vous aider à démarrer dans cette direction avec Java2D, le rendu des polices, etc., et offrir des pointeurs vers d'autres ressources.

La bibliothèque ImageIO vous permet également de lire/écrire un certain nombre de formats d'image, vous permettant efficacement de transcoder des images à partir, par exemple, .jpg -> BufferedImage -> .png, ou de toute autre manière dont vous avez besoin pour le faire, si vous le souhaitez stocker les fichiers d'image temporairement pendant le processus de conversion et/ou convertir toutes les images dans un seul format lors de leur importation pour le projet de conversion, etc.

Selon le nombre de formats de sortie que vous souhaitez prendre en charge, vous ferez probablement quelque chose comme

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

... où "destinationFormat" est quelque chose comme "m4v", "mpeg2", "h.264", "gif", etc.

8
jefflunt

Avez-vous entendu parler de JMF (Java Media Framework), à partir de l'exemple, vous pouvez trouver cet exemple: Génération d'un fichier vidéo à partir d'une liste de ( JPEG) Images

5
webpat

Vous pouvez essayer de faire un gif avec ceci encodeur gif .

2
gpojd

J'ai écrit un lecteur et un écrivain MJPEG pour lire des vidéos à l'intérieur de Java. MJPEG n'est pas le format vidéo le plus avancé mais il est très facile à manipuler. Le code fait partie de ma bibliothèque de vision par ordinateur - BoofCV , mais vous pouvez simplement extraire cette classe pour vos propres besoins.

  1. Téléchargez ce fichier: CreateMJpeg.Java
  2. Regardez la fonction principale. Où il se lit dans les images jpeg, mettez vos données byte [], mais vous devrez d'abord les convertir en jpeg.
    • Vous pouvez le convertir en jpeg en utilisant la bibliothèque standard Java
  3. Exécutez le code modifié et profitez de votre film

Désolé, ce n'est pas dans un format plus convivial, mais au moins vous n'avez pas besoin de jouer avec JNI comme d'autres solutions.

1
lessthanoptimal