Создание видео из набора изображений с помощью xuggler
Я искал решение везде! На этом сайте и на других. Я нашел некоторые интересные вещи, но они не решили мою проблему. Я объясню это.
У меня есть одно видео, я оцениваю каждый кадр с помощью xuggler. Когда я получаю все кадры, я редактирую их все с помощью цветового алгоритма. Также я храню аудио в mp3-файле.
Теперь мне нужно создать видео из всех кадров, это видео, конечно же, должно иметь те же характеристики, что и частота кадров e длительность. После этого я должен слить аудио.
Я сделал первую часть, но я не знаю, как создать видео с такими же характеристиками. Я следую этому коду:
http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html
Не могу закодировать видео с помощью 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;
}
Мож кто нибудь выручит?
3 ответа
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;
}
}
}
Быстрый взгляд на ваш код показывает, что вы не устанавливаете частоту кадров. Я не знаю, какую версию 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);
Или, может быть, вы делаете это, захватывая контейнер первого, а затем захватывая формат. Я сделал это только для потоковой передачи данных, а не для архивирования данных.
Попробуйте это для частоты кадров:
final long frameRate =DEFAULT_TIME_UNIT.convert(25, MILLISECONDS);