Copyright 2012-04-26 Werner Randelshofer

org.monte.screenrecorder
Class ScreenRecorder

java.lang.Object
  extended by org.monte.media.beans.AbstractStateModel
      extended by org.monte.screenrecorder.ScreenRecorder

public class ScreenRecorder
extends AbstractStateModel

A screen recorder written in pure Java.

Captures the screen, the mouse cursor and audio.

This recorder uses four threads. Three capture threads for screen, mouse cursor and audio, and one output thread for the movie writer.

FIXME - This class is a horrible mess.

Version:
$Id: ScreenRecorder.java 210 2012-04-26 08:34:24Z werner $
Author:
Werner Randelshofer

Nested Class Summary
static class ScreenRecorder.State
           
 
Field Summary
protected  int audioTrack
          Id of the audio track.
static java.lang.String ENCODING_BLACK_CURSOR
          "Encoding" for black mouse cursor.
static java.lang.String ENCODING_WHITE_CURSOR
          "Encoding" for white mouse cursor.
protected  int videoTrack
          Id of the video track.
 
Fields inherited from class org.monte.media.beans.AbstractStateModel
changeEvent, listenerList
 
Constructor Summary
ScreenRecorder(java.awt.GraphicsConfiguration cfg)
          Creates a screen recorder.
ScreenRecorder(java.awt.GraphicsConfiguration cfg, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat)
          Creates a screen recorder.
ScreenRecorder(java.awt.GraphicsConfiguration cfg, java.awt.Rectangle captureArea, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat)
          Creates a screen recorder.
 
Method Summary
protected  java.io.File createMovieFile(Format fileFormat)
          Creates a file for recording the movie.
protected  void createMovieWriter()
           
 java.util.List<java.io.File> getCreatedMovieFiles()
          Returns a list of all files that the screen recorder created.
 ScreenRecorder.State getState()
          Returns the state of the recorder.
 void start()
          Starts the screen recorder.
 void stop()
          Stops the screen recorder.
protected  void write(Buffer buf)
          Writes a buffer into the movie.
 
Methods inherited from class org.monte.media.beans.AbstractStateModel
addChangeListener, fireStateChanged, removeChangeListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ENCODING_BLACK_CURSOR

public static final java.lang.String ENCODING_BLACK_CURSOR
"Encoding" for black mouse cursor.

See Also:
Constant Field Values

ENCODING_WHITE_CURSOR

public static final java.lang.String ENCODING_WHITE_CURSOR
"Encoding" for white mouse cursor.

See Also:
Constant Field Values

videoTrack

protected int videoTrack
Id of the video track.


audioTrack

protected int audioTrack
Id of the audio track.

Constructor Detail

ScreenRecorder

public ScreenRecorder(java.awt.GraphicsConfiguration cfg)
               throws java.io.IOException,
                      java.awt.AWTException
Creates a screen recorder.

Parameters:
cfg - Graphics configuration of the capture screen.
Throws:
java.io.IOException
java.awt.AWTException

ScreenRecorder

public ScreenRecorder(java.awt.GraphicsConfiguration cfg,
                      Format fileFormat,
                      Format screenFormat,
                      Format mouseFormat,
                      Format audioFormat)
               throws java.io.IOException,
                      java.awt.AWTException
Creates a screen recorder.

Parameters:
cfg - Graphics configuration of the capture screen.
fileFormat - The file format "AVI" or "QuickTime".
screenFormat - The video format for screen capture.
mouseFormat - The video format for mouse capture. The EncodingKey must be ENCODING_BLACK_CURSOR or ENCODING_WHITE_CURSOR. The SampleRateKey can be independent from the screenFormat. Specify null if you don't want to capture the mouse cursor.
audioFormat - The audio format for audio capture. Specify null if you don't want audio capture.
Throws:
java.io.IOException
java.awt.AWTException

ScreenRecorder

public ScreenRecorder(java.awt.GraphicsConfiguration cfg,
                      java.awt.Rectangle captureArea,
                      Format fileFormat,
                      Format screenFormat,
                      Format mouseFormat,
                      Format audioFormat)
               throws java.io.IOException,
                      java.awt.AWTException
Creates a screen recorder.

Parameters:
cfg - Graphics configuration of the capture screen.
captureArea - Defines the area of the screen that shall be captured.
fileFormat - The file format "AVI" or "QuickTime".
screenFormat - The video format for screen capture.
mouseFormat - The video format for mouse capture. The EncodingKey must be ENCODING_BLACK_CURSOR or ENCODING_WHITE_CURSOR. The SampleRateKey can be independent from the screenFormat. Specify null if you don't want to capture the mouse cursor.
audioFormat - The audio format for audio capture. Specify null if you don't want audio capture.
Throws:
java.io.IOException
java.awt.AWTException
Method Detail

createMovieWriter

protected void createMovieWriter()
                          throws java.io.IOException
Throws:
java.io.IOException

getCreatedMovieFiles

public java.util.List<java.io.File> getCreatedMovieFiles()
Returns a list of all files that the screen recorder created.


createMovieFile

protected java.io.File createMovieFile(Format fileFormat)
                                throws java.io.IOException
Creates a file for recording the movie.

This implementation creates a file in the users "Video" folder on Windows, or in the users "Movies" folders on Mac OS X.

You can override this method, if you would like to create a movie file at a different location.

Parameters:
fileFormat -
Returns:
the file
Throws:
java.io.IOException

getState

public ScreenRecorder.State getState()
Returns the state of the recorder.


start

public void start()
           throws java.io.IOException
Starts the screen recorder.

Throws:
java.io.IOException

stop

public void stop()
          throws java.io.IOException
Stops the screen recorder.

Stopping the screen recorder may take several seconds, because audio capture uses a large capture buffer. Also, the MovieWriter has to finish up a movie file which may take some time depending on the amount of meta-data that needs to be written.

Throws:
java.io.IOException

write

protected void write(Buffer buf)
              throws java.io.IOException,
                     java.lang.InterruptedException
Writes a buffer into the movie. Since the file system may not be immediately available at all times, we do this asynchronously.

The buffer is copied and passed to the writer queue, which is consumed by the writer thread. See method startWriter().

AVI does not support a variable frame rate for the video track. Since we can not capture frames at a fixed frame rate we have to resend the same captured screen multiple times to the writer.

This method is called asynchronously from different threads.

You can override this method if you wish to process the media data.

Parameters:
buf - A buffer with un-encoded media data. If buf.track==videoTrack, then the buffer contains a BufferedImage in buffer.data and a Point in buffer.header with the recorded mouse location. The header is null if the mouse is outside the capture area, or mouse recording has not been enabled.
Throws:
java.io.IOException
java.lang.InterruptedException

Copyright 2012-04-26 Werner Randelshofer