Copyright 2013-01-06 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 class records mouse clicks occurring on other Java Windows running in the same JVM. Mouse clicks occurring in other JVM's and other processes are not recorded. This ability is useful for performing in-JVM recordings of an application that is being tested.

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 303 2013-01-03 07:43:37Z werner $
Author:
Werner Randelshofer

Nested Class Summary
protected static class ScreenRecorder.MouseGrabber
           
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.
static java.lang.String ENCODING_YELLOW_CURSOR
          "Encoding" for yellow mouse cursor.
protected  java.util.concurrent.ScheduledThreadPoolExecutor mouseCaptureTimer
          Timer for mouse captures.
protected  Format mouseFormat
          The input video format for cursor capture.
protected  java.util.concurrent.ScheduledFuture mouseFuture
           
protected  ScreenRecorder.MouseGrabber mouseGrabber
           
protected  java.io.File movieFolder
          Where to store the movie.
protected  long recordingStartTime
          The start time of the recording.
protected  long recordingStopTime
          The stop time of the recording.
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.
ScreenRecorder(java.awt.GraphicsConfiguration cfg, java.awt.Rectangle captureArea, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat, java.io.File movieFolder)
          Creates a screen recorder.
 
Method Summary
protected  java.io.File createMovieFile(Format fileFormat)
          Creates a file for recording the movie.
protected  MovieWriter createMovieWriter()
           
 float getAudioLevelLeft()
          Returns the audio level of the left channel or of the mono channel.
 float getAudioLevelRight()
          Returns the audio level of the right channel.
 javax.sound.sampled.Mixer getAudioMixer()
          Gets the audio mixer used for sound input.
 java.util.List<java.io.File> getCreatedMovieFiles()
          Returns a list of all files that the screen recorder created.
 long getMaxFileSize()
          Maximal file size.
 long getMaxRecordingTime()
          Maximal recording time in milliseconds.
 long getStartTime()
           
 ScreenRecorder.State getState()
          Returns the state of the recorder.
 java.lang.String getStateMessage()
          Returns the state of the recorder.
 void setAudioMixer(javax.sound.sampled.Mixer mixer)
          Sets the audio mixer for sound input.
 void setMaxFileSize(long maxFileSize)
           
 void setMaxRecordingTime(long maxRecordingTime)
          Maximal recording time in milliseconds.
 void start()
          Starts the screen recorder.
protected  void startMouseCapture()
          Starts mouse capture.
 void stop()
          Stops the screen recorder.
protected  void stopMouseCapture()
          Stops mouse capturing.
protected  void waitUntilMouseCaptureStopped()
          Waits until mouse capturing stopped.
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

ENCODING_YELLOW_CURSOR

public static final java.lang.String ENCODING_YELLOW_CURSOR
"Encoding" for yellow mouse cursor.

See Also:
Constant Field Values

mouseFormat

protected Format mouseFormat
The input video format for cursor capture. "black" or "white".


recordingStartTime

protected long recordingStartTime
The start time of the recording.


recordingStopTime

protected volatile long recordingStopTime
The stop time of the recording.


mouseCaptureTimer

protected java.util.concurrent.ScheduledThreadPoolExecutor mouseCaptureTimer
Timer for mouse captures.


videoTrack

protected int videoTrack
Id of the video track.


audioTrack

protected int audioTrack
Id of the audio track.


mouseGrabber

protected ScreenRecorder.MouseGrabber mouseGrabber

mouseFuture

protected java.util.concurrent.ScheduledFuture mouseFuture

movieFolder

protected java.io.File movieFolder
Where to store the movie.

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

ScreenRecorder

public ScreenRecorder(java.awt.GraphicsConfiguration cfg,
                      java.awt.Rectangle captureArea,
                      Format fileFormat,
                      Format screenFormat,
                      Format mouseFormat,
                      Format audioFormat,
                      java.io.File movieFolder)
               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.
movieFolder - Where to store the movie
Throws:
java.io.IOException
java.awt.AWTException
Method Detail

createMovieWriter

protected MovieWriter 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.


getStateMessage

public java.lang.String getStateMessage()
Returns the state of the recorder.


getStartTime

public long getStartTime()

start

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

Throws:
java.io.IOException

startMouseCapture

protected void startMouseCapture()
                          throws java.io.IOException
Starts mouse capture.

Throws:
java.io.IOException

stopMouseCapture

protected void stopMouseCapture()
Stops mouse capturing. Use method waitUntilMouseCaptureStopped() to wait until the capturing stopped.


waitUntilMouseCaptureStopped

protected void waitUntilMouseCaptureStopped()
                                     throws java.lang.InterruptedException
Waits until mouse capturing stopped. Invoke this method only after you invoked stopMouseCapture().

Throws:
java.lang.InterruptedException

getAudioLevelLeft

public float getAudioLevelLeft()
Returns the audio level of the left channel or of the mono channel.

Returns:
A value in the range [0.0,1.0] or AudioSystem.NOT_SPECIFIED.

getAudioLevelRight

public float getAudioLevelRight()
Returns the audio level of the right channel.

Returns:
A value in the range [0.0,1.0] or AudioSystem.NOT_SPECIFIED.

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

getMaxRecordingTime

public long getMaxRecordingTime()
Maximal recording time in milliseconds. If this time is exceeded, the recorder creates a new file.


setMaxRecordingTime

public void setMaxRecordingTime(long maxRecordingTime)
Maximal recording time in milliseconds.


getMaxFileSize

public long getMaxFileSize()
Maximal file size. If this size is exceeded, the recorder creates a new file.


setMaxFileSize

public void setMaxFileSize(long maxFileSize)

getAudioMixer

public javax.sound.sampled.Mixer getAudioMixer()
Gets the audio mixer used for sound input. Returns null, if the default mixer is used.


setAudioMixer

public void setAudioMixer(javax.sound.sampled.Mixer mixer)
Sets the audio mixer for sound input. Set to null for the default audio mixer.


Copyright 2013-01-06 Werner Randelshofer