JMF Solutions

Video Capture Utility with Monitoring

 
Problem
How to monitor video while capturing to disk or transmitting over the network. A Capture Processor typically monitors video only when it is started. How does one monitor the captured video while waiting for the right instant in the video to start writing to the disk or to start transmitting?

Solution
There are several ways to monitor the captured video while saving or transmitting it simultaneously. One way is to create a clone of the capture datasource, so that one datasource can be monitored while the other is being processed. This can be slow due to data cloning and also response time of the first datasource consumer.

A second way to monitor the video is to use a MonitorControl provided by the DataSource. On Windows, this monitor is a native window that does not interact well with Java AWT/Swing components and cannot be finely controlled in terms of preview rate.

A third way is to use the MonitorControl provided by the Processor. This monitor, unfortunately, only works while the Processor is in the Started state because of the data flow semantics.

Another technique, which is slightly more involved, and is the one we will explore in this example, is to intercept the data carried from the capture data source to the Processor. Since the Processor only takes a DataSource as an input, the intercepting object needs to be a DataSource.

The solution program consists of several classes: CaptureUtil, MonitorCDS, MonitorStream and JVidCap.

MonitorCDS is a DataSource wrapper that intercepts the actual capture DataSource and becomes the new DataSource for the transcoding Processor.

MonitorStream is the SourceStream contained in MonitorCDS. This class does the actual interception of the data buffers from the capture device, displays them and passes them along to the Processor. MonitorStream also exports a MonitorControl object that the developer can use to monitor the captured video.

CaptureUtil is a utility class that provides a capture datasource, given an AudioFormat and a VideoFormat object. It creates the original capture datasources, wraps the video capture datasource with MonitorCDS and creates a merged datasource of the audio and video streams.

JVidCap is a sample capture-to-disk program that shows how to use the CaptureUtil and MonitorStream classes. The JVidCap GUI allows the user to select approximate audio and video capture formats. The user can start/pause/resume/end the capture using the provided buttons.

Everytime a format attribute is changed, the capture datasource is re-initialized and a new Processor is created. When the user hits Start, a DataSink to write the data is also created and captured data is written to disk. The file is always saved in the current directory as "capture.mov" or "capture.avi" based on the selected file type.

Please read the source code for further explanations and comments.
 
Requirements
 
Platform: JDK 1.1.6 or later
JMF API: 2.0 or later
Implementation: WPP, SPP *
Hardware: Video capture card and sound card


* WPP = Windows Performance Pack, SPP = Solaris Performance Pack
 
Related Classes
 
 
How to run this sample
 
  1. Download and unzip the  ZIP file that contains the source and compiled classes.
  2. Add the directory where you unzipped the classes to your CLASSPATH
  3. Run the JVidCap program:
  4. java jmfsample.JVidCap
 
Source Code
 
 
See Also
 
  • JMF 2.0 Programmer's Guide
Left Curve
Java SDKs and Tools
Right Curve
Left Curve
Java Resources
Right Curve

Java 8 banner (182) IoT banner RHS (160)