Class ScreenRecorder

java.lang.Object
org.monte.media.beans.AbstractStateModel
org.monte.media.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.

Author:
Werner Randelshofer
  • Field Details

    • ENCODING_BLACK_CURSOR

      public static final String ENCODING_BLACK_CURSOR
      "Encoding" for black mouse cursor.
      See Also:
    • ENCODING_WHITE_CURSOR

      public static final String ENCODING_WHITE_CURSOR
      "Encoding" for white mouse cursor.
      See Also:
    • ENCODING_YELLOW_CURSOR

      public static final String ENCODING_YELLOW_CURSOR
      "Encoding" for yellow mouse cursor.
      See Also:
    • 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 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 ScheduledFuture<?> mouseFuture
    • movieFolder

      protected File movieFolder
      Where to store the movie.
  • Constructor Details

    • ScreenRecorder

      public ScreenRecorder(GraphicsConfiguration cfg) throws IOException, AWTException
      Creates a screen recorder.
      Parameters:
      cfg - Graphics configuration of the capture screen.
      Throws:
      IOException
      AWTException
    • ScreenRecorder

      public ScreenRecorder(GraphicsConfiguration cfg, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat) throws IOException, 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:
      IOException
      AWTException
    • ScreenRecorder

      public ScreenRecorder(GraphicsConfiguration cfg, Rectangle captureArea, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat) throws IOException, 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:
      IOException
      AWTException
    • ScreenRecorder

      public ScreenRecorder(GraphicsConfiguration cfg, Rectangle captureArea, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat, File movieFolder) throws IOException, 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:
      IOException
      AWTException
  • Method Details

    • createMovieWriter

      protected MovieWriter createMovieWriter() throws IOException
      Throws:
      IOException
    • getCreatedMovieFiles

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

      protected File createMovieFile(Format fileFormat) throws 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:
      IOException
    • getState

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

      public Throwable getStateMessage()
      Returns the state of the recorder.
    • getStartTime

      public long getStartTime()
    • start

      public void start() throws IOException
      Starts the screen recorder.
      Throws:
      IOException
    • startMouseCapture

      protected void startMouseCapture() throws IOException
      Starts mouse capture.
      Throws:
      IOException
    • stopMouseCapture

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

      protected void waitUntilMouseCaptureStopped() throws InterruptedException
      Waits until mouse capturing stopped. Invoke this method only after you invoked stopMouseCapture().
      Throws:
      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 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:
      IOException
    • abort

      public void abort() throws IOException
      Aborts the screen recorder.

      Aborting the screen recorder may take some time, but is generally faster than stopping the recorder. All recorded files are deleted.

      Throws:
      IOException
    • write

      protected void write(Buffer buf) throws IOException, 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:
      IOException
      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 Mixer getAudioMixer()
      Gets the audio mixer used for sound input. Returns null, if the default mixer is used.
    • setAudioMixer

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