/* * Copyright 2012 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.mand.movie; 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.util.concurrent.TimeUnit; import com.xuggle.mediatool.IMediaWriter; import com.xuggle.mediatool.ToolFactory; import com.xuggle.xuggler.ICodec; /** * * @author Uwe Krueger */ public class ScreenMovie { private static final double FRAME_RATE=50; private static final int SECONDS_TO_RUN_FOR=20; private static final String outputFilename="mydesktop.mp4"; private static Dimension screenBounds; public static void main(String[] args) { // let's make a IMediaWriter to write the file. final IMediaWriter writer=ToolFactory.makeWriter(outputFilename); screenBounds=Toolkit.getDefaultToolkit().getScreenSize(); // We tell it we're going to add one video stream, with id 0, // at position 0, and that it will have a fixed frame rate of FRAME_RATE. writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, screenBounds.width/2, screenBounds.height/2); long startTime=System.nanoTime(); for (int index=0; index<SECONDS_TO_RUN_FOR*FRAME_RATE; index++) { // take the screen shot BufferedImage screen=getDesktopScreenshot(); // convert to the right image type BufferedImage bgrScreen=convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); // encode the image to stream #0 writer.encodeVideo(0, bgrScreen, System.nanoTime()-startTime, TimeUnit.NANOSECONDS); // sleep for frame rate milliseconds try { Thread.sleep((long)(1000/FRAME_RATE)); } catch (InterruptedException e) { // ignore } } // tell the writer to close and write the trailer if needed writer.close(); } public static BufferedImage convertToType(BufferedImage sourceImage, int targetType) { BufferedImage image; // if the source image is already the target type, return the source image if (sourceImage.getType()==targetType) { image=sourceImage; } // otherwise create a new image of the target type and draw the new image else { image=new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), targetType); image.getGraphics().drawImage(sourceImage, 0, 0, null); } return image; } private static BufferedImage getDesktopScreenshot() { try { Robot robot=new Robot(); Rectangle captureSize=new Rectangle(screenBounds); return robot.createScreenCapture(captureSize); } catch (AWTException e) { e.printStackTrace(); return null; } } }