2012-02-07 1 views
2

Je cherchais une solution partout! Sur ce site et sur d'autres. J'ai trouvé des choses intéressantes, mais elles n'ont pas résolu mon problème. Je vais l'expliquer.Création vidéo à partir d'un ensemble d'images avec xuggler

J'ai une vidéo, j'en ai gradué chaque image avec xuggler. Quand j'obtiens tous les cadres, je les édite tous avec un algorithme de couleur. Aussi, je stocke l'audio dans un fichier mp3.

Maintenant, j'ai besoin de créer une vidéo à partir de toutes les images, cette vidéo, bien sûr, devrait avoir les mêmes caractéristiques que la durée d'image et la durée. Après cela, je dois fusionner l'audio.

J'ai fait la première partie, mais je ne sais pas comment créer une vidéo avec les mêmes caractéristiques. Je suivais ce code:

http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html

Can't encode video with Xuggler

Mais il faut l'instantané et il utilise une boucle étrange:

for (int index = 0; index < SECONDS_TO_RUN_FOR * FRAME_RATE; index++) 

Je ne peux pas comprendre comment définir le droit caractéristiques. Ca devrait être facile car je sais tout de la vidéo! taille, fréquence d'images et nombre d'images.

Mon code:

public static void main(String[] args) throws IOException { 

    final IMediaWriter writer = ToolFactory.makeWriter(outputFilename); 
    writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, 
       720, 304); 
    long nextFrameTime = 0; 
    final long frameRate =25/1000; 
    long startTime = System.nanoTime(); 
    while (indexVideo<1597) { 
     BufferedImage videoImage = null; 
     try { 
      videoImage = getVideoImage(); 
     } catch (AWTException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     writer.encodeVideo(0, videoImage,nextFrameTime, 
       TimeUnit.MILLISECONDS); 
     nextFrameTime += frameRate; 

} 
    writer.close(); 
} 

private static BufferedImage getVideoImage() throws IOException, AWTException { 

    File imgLoc = new File("D:/Gianfranco/Sample/"+indexVideo+".png"); 
    BufferedImage img; 
    img = ImageIO.read(imgLoc); 
    System.out.println(imgLoc.getName()); 
    indexVideo++; 
    return img; 

} 

Ca quelqu'un me aider?

Répondre

0

essayer cela pour frame rate:

final long frameRate =DEFAULT_TIME_UNIT.convert(25, MILLISECONDS); 
1

Un rapide coup d'œil à votre code me montre que vous ne définissez pas la fréquence d'images. Je ne sais pas quelle version de xuggler que vous utilisez, mais pour moi, je mets le frame rate lors de l'ajout flux vidéo:

writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, IRational.make(<frames>/<per second>), 720, 304); 

Maintenant, une autre approche (probablement plus approprié) serait de créer votre IMediaWriter en ouvrant votre vidéo originale Ou peut-être vous le faites en saisissant le conteneur de la première, puis en saisissant le format. Je l'ai seulement fait pour le streaming des données et non des données archivées.

0
package com.Raamji.Work; 

import java.awt.AWTException; 
import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.concurrent.TimeUnit; 

import javax.imageio.ImageIO; 

import com.xuggle.mediatool.IMediaWriter; 
import com.xuggle.mediatool.ToolFactory; 
import com.xuggle.xuggler.ICodec; 

public class VideoGenerator { 

    private static final double FRAME_RATE = 20; 

    private static final int SECONDS_TO_RUN_FOR = 20; 

    private static final String outputFilename = "C:/myVideo.mp4"; 

    private static Dimension screenBounds; 

    private static Map<String, File> imageMap = new HashMap<String, File>(); 

    public static void main(String[] args) { 

     final IMediaWriter writer = ToolFactory.makeWriter(outputFilename); 

     screenBounds = Toolkit.getDefaultToolkit().getScreenSize(); 

     writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4,screenBounds.width/2, screenBounds.height/2); 

     File folder = new File("C:/Users/arsingh/Desktop/tempo/video"); 
     File[] listOfFiles = folder.listFiles(); 

     int indexVal = 0; 
     for (File file : listOfFiles) { 
      if (file.isFile()) { 
       indexVal++; 
       System.out.println("file.getName() :"+file.getName()); 
       imageMap.put(file.getName(), file); 
      } 
     } 

     //for (int index = 0; index < SECONDS_TO_RUN_FOR * FRAME_RATE; index++) { 
     for (int index = 1; index <= listOfFiles.length; index++) { 
      BufferedImage screen = getImage(index); 
      BufferedImage bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); 
      writer.encodeVideo(0, bgrScreen, 300*index, TimeUnit.MILLISECONDS); 

     } 
     // tell the writer to close and write the trailer if needed 
     writer.close(); 
     System.out.println("Video Created"); 

    } 

    public static BufferedImage convertToType(BufferedImage sourceImage, int targetType) { 
     BufferedImage image; 
     if (sourceImage.getType() == targetType) { 
      image = sourceImage; 
     } 
     else { 
      image = new BufferedImage(sourceImage.getWidth(), 
      sourceImage.getHeight(), targetType); 
      image.getGraphics().drawImage(sourceImage, 0, 0, null); 
     } 
     return image; 
    } 

    private static BufferedImage getImage(int index) { 

     try { 
      String fileName=index+".jpg"; 
      System.out.println("fileName :" + fileName); 
      File img = imageMap.get(fileName); 

      BufferedImage in=null; 
      if (img != null) { 
       System.out.println("img :"+img.getName()); 
       in = ImageIO.read(img); 
      }else 
      { 
       System.out.println("++++++++++++++++++++++++++++++++++++++index :" + index); 
       img = imageMap.get(1); 
       in = ImageIO.read(img); 
      } 
      return in; 

     } 

     catch (Exception e) { 

      e.printStackTrace(); 

      return null; 

     } 

    } 

} 
Questions connexes