2012-02-07 74 views
2

我一直在尋找解決方案!在這個網站和其他人。 我發現了一些有趣的事情,但他們沒有解決我的問題。我會解釋它。使用xuggler從一組圖像中創建視頻

我有一個視頻,我用xuggler對它的每一幀進行了修改。當我得到所有的幀,我用顏色算法編輯所有的幀。另外,我將音頻存儲在mp3文件中。

現在我需要從所有幀中創建一個視頻,當然,這個視頻應該具有與幀速率e持續時間相同的特性。之後,我必須合併音頻。

我已經完成了第一部分,但我不知道如何創建具有相同特徵的視頻。我下面這段代碼:

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; 

} 

鈣誰能幫助我嗎?

回答

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; 

     } 

    } 

}