package org.jcodec.samples.api; import org.jcodec.api.awt.AWTSequenceEncoder8Bit; import org.jcodec.common.io.FileChannelWrapper; import org.jcodec.common.io.NIOUtils; import org.jcodec.common.model.Rational; import org.jcodec.common.tools.MainUtils; import org.jcodec.common.tools.MainUtils.Cmd; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import javax.imageio.ImageIO; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * @author Stanislav Vitvitskyy * */ public class SequenceEncoderDemo { private static final String FLAG_NUM_FRAMES = "num-frames"; private static final String FLAG_IN_PATTERN = "in-pattern"; private static final String FLAG_FPS = "fps"; public static void main(String[] args) throws IOException { Cmd cmd = MainUtils.parseArguments(args); if (cmd.argsLength() < 1) { MainUtils.printHelpVarArgs(new HashMap<String, String>() { { put(FLAG_NUM_FRAMES, "Maximum frames to encode."); put(FLAG_IN_PATTERN, "Output folder for the frames."); put(FLAG_FPS, "Rational fps, i.e 25:1 (for 25fps), 30:1 (for 30fps), 30000:1001 (for 29.97fps), etc."); } }, "output file name"); return; } int maxFrames = cmd.getIntegerFlagD(FLAG_NUM_FRAMES, Integer.MAX_VALUE); String fpsRaw = cmd.getStringFlagD(FLAG_FPS, "25:1"); String outDir = cmd.getStringFlagD(FLAG_IN_PATTERN, new File(System.getProperty("user.home"), "frame%08d.jpg").getAbsolutePath()); FileChannelWrapper out = null; try { out = NIOUtils.writableChannel(MainUtils.tildeExpand(cmd.getArg(0))); AWTSequenceEncoder8Bit encoder = new AWTSequenceEncoder8Bit(out, Rational.parse(fpsRaw)); for (int i = 0; i < maxFrames; i++) { File file = new File(String.format(outDir, i)); if (!file.exists()) break; BufferedImage image = ImageIO.read(file); encoder.encodeImage(image); } encoder.finish(); } finally { NIOUtils.closeQuietly(out); } } }