2012-02-07 2 views
2

Я искал решение повсюду! На этом сайте и на других. Я нашел несколько интересных вещей, но они не решили мою проблему. Я объясню это.Создание видео с помощью набора изображений с xuggler

У меня есть одно видео, я разбиваю каждый кадр с помощью xuggler. Когда я получаю все кадры, я редактирую их с помощью цветового алгоритма. Кроме того, я храню аудио в mp3-файле.

Теперь мне нужно создать видеоролик из всех кадров, это видео, конечно же, должно иметь те же характеристики, что и длительность кадра. После этого мне нужно объединить аудио.

Я сделал первую часть, но я не знаю, как создать видео с теми же характеристиками. Я выполняю этот код:

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

Can't encode video with Xuggler

Но это берет снимок и использует странный цикл:

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

Я не могу понять, как установить право характеристика. Это должно быть легко, потому что я знаю все о видео! размер, частоту кадров и количество кадров.

Мой код:

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 кто поможет мне?

ответ

0

попробовать это для частоты кадров:

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

Быстрый взгляд на ваш код показывает мне, что вы не устанавливать частоту кадров. Я не знаю, какую версию Xuggler вы используете, но для меня установить частоту кадров при добавлении видеопотока:

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

Теперь другой (вероятно, более уместно) подход был бы создать IMediaWriter, открыв оригинальное видео.

IMediaReader reader = ToolFactory.makeReader("inputFile.mp4"); 
    IMediaWriter writer = ToolFactory.makeWriter("outputFile.mp4", reader); 

Возможно, вы сделали это, захватив контейнер первого, а затем захватив формат. Я сделал это только для потоковой передачи данных, а не для архивированных данных.

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; 

     } 

    } 

} 
Смежные вопросы