changeset 59:5afa49c5a7d3

adding wiki readme goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Dec 2011 22:14:21 -0600
parents f2c5f1fca9a7
children 42bbb176b90f
files README src/com/aurellem/capture/IsoTimer.java
diffstat 2 files changed, 117 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/README	Sat Dec 03 22:14:21 2011 -0600
     1.3 @@ -0,0 +1,116 @@
     1.4 +======Capture Audio/Video to a File======
     1.5 +
     1.6 +So you've made your cool new JMonkeyEngine3 game and you want to
     1.7 +create a demo video to show off your hard work. Or maybe you want to
     1.8 +make a cutscene for your game using the physics and characters in the
     1.9 +game itself.  Screen capturing is the most straightforward way to do
    1.10 +this, but it can slow down your game and produce low-quality video and
    1.11 +audio as a result. A better way is to record video and audio directly
    1.12 +from the game while it is running.
    1.13 +
    1.14 +There's a full solution for doing this already made for you here:
    1.15 +
    1.16 +http://www.aurellem.com/releases/jmeCapture-latest.zip
    1.17 +http://www.aurellem.com/releases/jmeCapture-latest.tar.bz2
    1.18 +
    1.19 +Download the archive in your preferred format, extract,
    1.20 +add the jars to your project, and you are ready to go.
    1.21 +
    1.22 +The javadoc is here:
    1.23 +http://www.aurellem.com/jmeCapture/docs/
    1.24 +
    1.25 +Here is a complete example showing how to capture both audio and video
    1.26 +from one of jMonkeyEngine3's advenced demo applications.
    1.27 +
    1.28 +<code java>
    1.29 +import java.io.File;
    1.30 +import java.io.IOException;
    1.31 +
    1.32 +import jme3test.water.TestPostWater;
    1.33 +
    1.34 +import com.aurellem.capture.Capture;
    1.35 +import com.aurellem.capture.IsoTimer;
    1.36 +import com.jme3.app.SimpleApplication;
    1.37 +
    1.38 +
    1.39 +/**
    1.40 + * Demonstrates how to use basic Audio/Video capture with a
    1.41 + * jMonkeyEngine application. You can use these techniques to make
    1.42 + * high quality cutscenes or demo videos, even on very slow laptops.
    1.43 + * 
    1.44 + * @author Robert McIntyre
    1.45 + */
    1.46 +
    1.47 +public class Basic {
    1.48 +	
    1.49 +    public static void main(String[] ignore) throws IOException{
    1.50 +	File video = File.createTempFile("JME-water-video", ".avi");
    1.51 +	File audio = File.createTempFile("JME-water-audio", ".wav");
    1.52 +		
    1.53 +	SimpleApplication app = new TestPostWater();
    1.54 +	app.setTimer(new IsoTimer(60));
    1.55 +	app.setShowSettings(false);
    1.56 +		
    1.57 +	Capture.captureVideo(app, video);
    1.58 +	Capture.captureAudio(app, audio);
    1.59 +		
    1.60 +	app.start();
    1.61 +		
    1.62 +	System.out.println(video.getCanonicalPath());
    1.63 +	System.out.println(audio.getCanonicalPath());
    1.64 +    }
    1.65 +}
    1.66 +</java>
    1.67 +
    1.68 +
    1.69 +As you can see, to capture video and audio you use the
    1.70 +''com.aurellem.capture.Capture'' class, which has two methods,
    1.71 +''captureAudio'' and ''captureVideo'', and the
    1.72 +''com.aurellem.capture.IsoTimer class'', which sets the audio and
    1.73 +video framerate. 
    1.74 +
    1.75 +The steps are as simple as:
    1.76 +
    1.77 +<code java>
    1.78 +yourApp.setTimer(new IsoTimer(desiredFramesPerSecond));
    1.79 +</code>
    1.80 +
    1.81 +This causes jMonkeyEngine to take as much time as it needs to fully
    1.82 +calculate every frame of the video and audio.  You will see your game
    1.83 +speed up and slow down depending on how computationally demanding your
    1.84 +game is, but the final recorded audio and video will be perfectly
    1.85 +sychronized and will run at exactly the fps which you specified.
    1.86 +
    1.87 +<code java>
    1.88 +captureVideo(yourApp, targetVideoFile);
    1.89 +captureAudio(yourApp, targetAudioFile);
    1.90 +</code>
    1.91 +
    1.92 +These will cause the app to record audio and video when it is run.
    1.93 +Audio and video will stop being recorded when the app stops. Your
    1.94 +audio will be recorded as a 44,100 Hz linear PCM wav file, while the
    1.95 +video will be recorded according to the following rules:
    1.96 +
    1.97 +1.) (Preferred) If you supply an empty directory as the file, then
    1.98 +    the video will be saved as a sequence of .png files, one file per
    1.99 +    frame.  The files start at 0000000.png and increment from there.
   1.100 +    You can then combine the frames into your preferred
   1.101 +    container/codec. If the directory is not empty, then writing
   1.102 +    video frames to it will fail, and nothing will be written.
   1.103 +    
   1.104 +2.) If the filename ends in ".avi" then the frames will be encoded as
   1.105 +    a RAW stream inside an AVI 1.0 container.  The resulting file
   1.106 +    will be quite large and you will probably want to re-encode it to
   1.107 +    your preferred container/codec format.  Be advised that some
   1.108 +    video payers cannot process AVI with a RAW stream, and that AVI
   1.109 +    1.0 files generated by this method that exceed 2.0GB are invalid
   1.110 +    according to the AVI 1.0 spec (but many programs can still deal
   1.111 +    with them.)  Thanks to Werner Randelshofer for his excellent work
   1.112 +    which made AVI file writer option possible.
   1.113 + 
   1.114 +3.) Any non-directory file ending in anything other than ".avi" will
   1.115 +    be processed through Xuggle.  Xuggle provides the option to use
   1.116 +    many codecs/containers, but you will have to install it on your
   1.117 +    system yourself in order to use this option. Please visit
   1.118 +    http://www.xuggle.com/ to learn how to do this.
   1.119 +
     2.1 --- a/src/com/aurellem/capture/IsoTimer.java	Sat Dec 03 21:53:52 2011 -0600
     2.2 +++ b/src/com/aurellem/capture/IsoTimer.java	Sat Dec 03 22:14:21 2011 -0600
     2.3 @@ -27,7 +27,7 @@
     2.4   * the high-quality recording.  If an Application uses this IsoTimer
     2.5   * instead of the normal one, we can be sure that every call to
     2.6   * simpleUpdate, for example, corresponds to exactly (1 / fps) seconds
     2.7 - * of game-time. This let's us record perfect video and audio even on
     2.8 + * of game-time. This lets us record perfect video and audio even on
     2.9   * a slow computer.
    2.10   *
    2.11   * @author Robert McIntyre