YOUR FEEDBACK
Adobe Flex 2 - Answering Tough Questions About Enterprise Development
A Correct Person wrote: Denis Roebrt commented on the 21 Aug 2006 "Tough Que...


2007 West
GOLD SPONSORS:
Active Endpoints
Your SOA Needs BPEL for Orchestration
BEA
Virtualized SOA: Adaptive Infrastructure for Demanding Applications
Nexaweb
Overcoming Bandwidth Challenges with Nexaweb
TIBCO
What is Service Virtualization?
SILVER SPONSORS:
WSO2
Using Web Services Technologies and FOSS Solutions
Click For 2007 East
Event Webcasts

2008 East
PLATINUM SPONSORS:
Appcelerator
Think Fast: Accelerate AJAX Development with Appcelerator
GOLD SPONSORS:
DreamFace Interactive
The Ultimate Framework for Creating Personalized Web 2.0 Mashups
ICEsoft
AJAX and Social Computing for the Enterprise
Kaazing
Enterprise Comet: Real–Time, Real–Time, or Real–Time Web 2.0?
Nexaweb
Now Playing: Desktop Apps in the Browser!
Sun
jMaki as an AJAX Mashup Framework
POWER PANELS:
The Business Value
of RIAs
What Lies Beyond AJAX?
KEYNOTES:
Douglas Crockford
Can We Fix the Web?
Anthony Franco
2008: The Year of the RIA
Click For 2007 Event Webcasts
SYS-CON.TV
TOP THREE LINKS YOU MUST CLICK ON


Web Conferencing Using the Java Media Framework (JMF)
Broadcast and receive media streams

Digg This!

This article describes our experiences with developing a browser-based Web conferencing application with the following constraints:

  1. HTTP protocol (port 80) to broadcast and receive video/audio
  2. Broadcasters and receivers are not required to have public IP addresses
  3. Multiple users, each capable of broadcasting to and receiving feeds from many users
  4. Low-cost solution for continuous video/audio feed
Java Media Framework (JMF) is used to develop the browser-based Web conferencing application. In this architecture, the client uses two JMF applets - one for capturing video/audio from a Webcam and the other for playing video/audio feed. The capture applet continuously captures video/audio feed for a specified length of time (e.g., 10 seconds) and saves it locally in a file. This file is uploaded to a Web server using an upload servlet. The media stream is stored in MSVIDEO (AVI) or QUICKTIME (MOV) format. The player applet then continuously fetches the media clips from the Web server. The player applet uses perfecting capability to play clips from the server in a continuous manner. The advantages of this approach are that it does not require expensive streaming servers, and it satisfies the constraints mentioned earlier.

The article will start with a brief explanation about real-time streaming, followed by an introduction to JMF, a description of the capture and player applets, and a comparison with other technologies.

Introduction to Real-Time and Progressive Streaming

Real-time streaming of media allows users to play media as they receive it. Users don't have to wait for the whole media file to be downloaded before watching. To enable real-time streaming, dedicated streaming media servers and streaming protocols, such as RealTime Protocol (RTP), are required. RTP is an Internet standard for transporting real-time data. It uses the unreliable UDP protocol to transmit packets.

A variant of real-time streaming is progressive streaming, also called HTTP streaming because it uses the commonly used HTTP protocol and standard HTTP servers to deliver media files. Progressive streaming enables files to be watched as they are downloaded. When the client makes a request (HTTP) to the server for the media file, the file eventually gets stored in the client's memory buffer. The playback is allowed before the entire file gets downloaded. Most firewalls allow traffic over HTTP whereas RTP is not permitted by most firewalls. In our approach, we're emulating HTTP streaming.

Introduction to Java Media Framework

The JMF API specifies a simple, unified architecture to synchronize and control audio, video, and other time-based data within Java applications and applets. JMF software, documentation, sample programs, and the source code can be downloaded from Sun's Web site at java.sun.com/products/java-media/jmf. In this section, we'll briefly discuss the basic concepts of JMF, including a few useful classes required to build a Web conferencing application:

1.  The DataSource class is an abstraction that represents audio, video, or a combination of both. A data source can be a file or a stream and is constructed from the Manager and MediaLocator as follows:

DataSource ds = javax.media.Manager.createDataSource(mediaLocator);

Here, MediaLocator is a class that JMF uses to represent audio or video media location and is created as follows:

MediaLocator mediaLocator = new MediaLocator("vfw://0");

2.  The Player class is used to play media files or stream media. A player is constructed from MediaLocator or the media URL as follows:

Player player = Manager.createPlayer(mediaLocator);

Once the player is realized (ready to play state), you can call player.start() to play the media. A realized player can be created from the DataSource:

Player player = Manager.createRealizedPlayer(ds);

3.  A processor is a type of player. Besides playing the media, it can also output media through a DataSource to another player or processor. A processor is used to manipulate the data and convert the data from one format to another. It's created from the DataSource, MediaLocator, or a URL:

Processor processor = Manager.createProcessor(new URL("http://localhost/test.mov));

4.  A manager is one of the most important classes of JMF. It handles the construction of players, processors, and DataSources, as we have seen earlier.

Architecture Description

The architecture of our approach is shown in Figure 1. It implements a Web conferencing application over HTTP. The architecture has one centralized server and one or many distributed clients. The server has a Web server and a servlet container. Clients run two applets, one for capturing media and the other for playing the media.

The high level steps are:

1.  The applet continuously captures video and audio streams from the Webcam. These streams are saved locally in a specified format as a file every few seconds. This file is uploaded to the server over HTTP using a file upload servlet. Uploading uses a separate thread. A significant loss of frames will result if the file upload is in the same thread as file capture. Note that a more efficient method would be to write these streams directly on the server using a socket. This is currently not possible because the DataSource class provided with JMF does not contain a method to get the InputStream. A custom InputStream-based DataSource can be developed (e.g., www.extollit.com/isdsjmf.php).

2.  A server gets a new file clip from the sender and stores it in a sender-specific directory. A counter, such as filename+i, is attached to the filename.

3.  The JMF Player applet continuously downloads new files from the Web server. It uses JMF's perfecting capability to play these clips in a continuous manner. When the current clip is being played, a new instance of Player is created for the next clip and the next clip is downloaded from the server. This makes the playing of clips continuous, as the next clip to be played has already been prefetched. Note that the entire clip is downloaded by the player applet before playing it.

At the start of playing and during the process of fetching a new clip, the player applet checks new file availability for n seconds before timing out.

Computation of Parameters

First, we'll do an approximate mathematical analysis for bandwidth consideration and demonstrate the usability of our approach with a few special cases.

Suppose:

One second file clip size = oneSecFileSize bits
Time duration of each clip = cSec seconds
Upload Transmission rate = uRate bits per second
Download Transmission rate = dRate bits per second
Time to upload, tUpload = oneSecFileSize *cSec/uRate
Time to download, tDownload = oneSecFileSize *cSec/dRate

If the time to upload or download a clip is more than the time to play a clip, the player will wait and the receiver will see a break, i.e., max(tUpload,tDownload)>cSec. For the continuous playing of clips, the following condition must be true:

Max (1/uRate, 1/dRate) > 1/ oneSecFileSize
Min (uRate, dRate) > oneSecFileSize

According to the equation, the wait time between clips at the receiver does not depend on clip size. The only variable that matters for a continuous playback is the size of a one-second file and that the provided upload and download rates meet the above condition. Lag time between playing and capturing is:

cSec + tupload + tdownload

From the above equation, the maximum lag with no break in the feed is 3*cSec, and the minimum lag is cSec.

To get a Web conference that is as close to real time as possible, cSec should be reduced. Next, we will apply the above analysis to the following cases.

  • Both sender and receiver have a low bandwidth modem connection
    Let's assume the uRate = dRate = 20K bits/sec. In this case, the one-second file size should be less than 20Kbits. If the clip size is 10 seconds, the maximum playback lag will be 30 seconds. We have observed that the minimum file size for transmitting a one-second video (with no audio) is 8Kbits using H263 encoding and 128x96 pixels video size. H263 encoding is ideal for a low-bandwidth environment because it produces smaller file sizes. The H263 encoder in the JMF 2.0 is capable of handling only limited video sizes (only 352x288, 176x144, and 128x96). We observed a minimum file size with the video and an 8-bit mono audio with an 8000Hz sampling rate to be 80Kbits.

  • Either the sender or receiver has a low bandwidth connection
    Let's assume that the lower rate is rate = 20Kbits/sec and the other rate is much higher. In this case the one-second file size should be less than 20Kbits, but the maximum playback lag is about 20 seconds if the clip size is 10 seconds.

  • Both sender and receiver have high bandwidth
    In this case better quality video can be transmitted. The playback lag will be the same as the clip size in seconds. JPEG encoding offers good quality video and is well suited to a high-bandwidth environment. File sizes can be decreased during JPEG encoding by lowering JPEG quality.

    There are no easy guidelines to predict the exact size of the one-second clip; it depends on the video size, the audio sampling rate, video and audio encoding, the frame rate, and the file format. Users should experiment with using different values for these parameters and a variety of movement in the video to determine an approximate one-second file size.

    JMF Capture Applet
    The high-level steps for developing capture applet are (see Listing 1):

    1. A DataSource is created from the Webcam source using the MediaLocator.
    2. A ProcessorModel is created from the DataSource, the format object specifying the video format, and the FileDescriptor object specifying the output file format.
    3. A Processor is created from the ProcessorModel and the output DataSource is obtained from the Processor.
    4. A DataSink object is created by first creating a MediaLocator for storing the media in a file.
    5. Capture of the stream is started and the stream is saved for a specified duration into a file.
    This process is repeated until the sender ends the session.

    File Upload
    The File Upload uses the JUpload project (jupload.sourceforge.net/). It has two parts: the file upload thread at the client and the upload servlet at the server. The following are the steps for developing the File Upload thread (see Listing 2):

    1. Create a socket connection with the server.
    2. Create an HTTP POST request and an HTTP head and tail.
    3. Create necessary IO stream objects.
    4. Send an HTTP request to the server. Write the HTTP head, the clip file, and the HTTP tail to the server.
    The Upload Servlet uses O'Reilly's multipart request executor (www.servlets.com/cos/index.html) to upload the files. MultipartRequest is a utility class that handles multipart/form-data requests for file uploads.

    JMF Player Applet
    The high-level steps for developing a player applet are (see Listing 3):

    1. Construct two players from the URL of the media at the Web server. One player is for the current clip and the other is for the next clip.
    2. Start the first player and fetch the next clip using the second player.
    3. On the EndOfMediaEvent for clip i, start playing clip i+1. Destroy the visual component for the player of clip i, de-allocate the player, and create a new player for clip i+2. Prefetch the clip i+2 and add ControllerListener. Repeat these steps for subsequent clips.
    This makes the playing of clips continuous, as there will be little or minimal delay between subsequent clips. Note that the entire clip is downloaded by the player applet before playing it.

    HTML Code for Sender and Receiver Applets
    The HTML code for the sender applet is shown in Listing 4.

    The HTML code for the receiver applet is shown in Listing 5. Note that this HTML page is generated dynamically with the appropriate senderID and current counter. If the receiver wants to receive multiple feeds, multiple applet entries are generated in HTML.

    Drawbacks

    1. There is a lag between capturing and playing.
    2. It involves expensive disk write operations.
    3. Both receivers and senders must have JMF software installed.

    Future Enhancements

    1. A sophisticated in-memory buffering mechanism to allow better video quality and efficient delivery by eliminating expensive disk writes
    2. Extending the DataSource class to allow InputStream-based processing to save the media directly at the server and remove the need for a local buffer.
    3. To package and deliver required dlls and registry files of JMF so that there's no need to install JMF software.
    Comparison to JMF-Based P2P Web Conferencing Using RTP
    Thus far, we have described an HTTP-based approach that involves no real-time streaming. An alterna-tive to the above approach is a peer-to-peer, RTP-based Web conferencing solution that can be developed using the JMF API. The source code for the RTP Server/Sender can be found at java.sun.com/products/java-media/jmf/2.1.1/solutions/AVTransmit.html and at java.sun.com/products/java-media/jmf/2.1.1/samples/sample-code.html#RTPPlayerApplet for the RTP Player applet. The RTP Server captures the media from the Webcam and streams it to receivers by specifying IP addresses and port numbers. The RTP Player listens on a specific port for streams coming form the sender's IP address.

    The primary difference between the HTTP approach and the RTP approach is that RTP streams the feeds continuously to receivers without storing them in files locally or at the server. The disadvantages of the above RTP approach are:

    1. Public IP addresses are required for both the sender and the receiver.
    2. The senders and receivers should not be behind firewalls because RTP is not allowed by most corporate firewalls.
    3. Also, as the number of participants increases, the number of ports also increases linearly. This makes user and port management challenging.
    4. The default RTP implementation of JMF uses the unreliable UDP protocol, so delivery time and quality are not guaranteed - it may result in the dropping of frames or make frames out of sequence during transmission.
    Comparison to Web Conferencing Using Streaming Servers
    The architecture of the Web conferencing system using commercially streaming servers is shown in Figure 2. Senders first register a unique broadcast/mount point with a user management component as shown by arrow 1. The sender then uses streaming protocol (for example, RTP or RTSP) to push the media stream to a centralized streaming server, as shown by arrow 3. Receivers first look for senders at the user management component (as shown by arrow 2) and obtain corresponding broadcast addresses. Receivers then request and receive media from the streaming server, as shown by arrow 4.

    In this approach we don't need to break the feed into smaller clips. Senders use the encoder to stream the media to the server. The server then streams the media to receivers. The disadvantages of this approach are:

    1. The architecture is heavy as it involves the use of costly and complex streaming servers, players, and encoders
    2. It's not an open architecture. The architecture becomes specific to one particular system such as RealSystem, which makes it nonportable with solutions from other vendors.
    3. Capture programs, a.k.a. encoders, are not readily available and are not browser based.
    4. It uses special streaming protocols such as RTP or RTSP, which are not allowed through a firewall.

    Conclusion

    The approach presented here offers a near real-time, low-cost Web conferencing solution. It allows multiple users to broadcast and receive media streams, it uses the HTTP protocol, and does not require the broadcaster and receiver to have public IP addresses. The source code for this article is available at www.indent.org/jdj-jmf/.

    References

  • Java Media Framework (JMF): java.sun.com/products/java-media/jmf/
  • JMF RTP Support: java.sun.com/products/java-media/jmf/ 2.1.1/support-rtp.html
  • Mack, S. (2002). Streaming Media Bible. Hungry Minds.
  • About Pramod Jain
    Pramod Jain is president of Innovative Decision Technologies, Inc. (INDENT, www.indent.org), in Jacksonville, FL. Their clients include Recruitmax, NASA, and NIH. Pramod has a PhD from the University of California, Berkeley.

    About Yayati Kasralikar
    Yayati Kasralikar is lead programmer at INDENT. He has an MS from the University of Central Florida, Orlando.

    Yayati Kasralikar wrote: We did not experiment with such short clips, all our tests were with clips of 10 seconds or more. When we reduce clip size to 500 milliseconds, player creation overhead does not seem to be significant. However overhead for starting and stopping the clip capture processor in SenderApplet is significant for 500 millisecond clips. We have not optimized the sender for such short durations. With the sample code, we recommend setting the clip duration to be more than 10 seconds.
    read & respond »
    Bill W wrote: Question for the authors: Did you try clips of less than one second in duration (i.e. 500 milliseconds)? Did the Player creation overheard become too significant?
    read & respond »
    Pramod Jain wrote: We agree with Peter's comments. We have played around with JMF, Real, QuickTime, Windows Media, and Flash Comm Server. And by far Flash Comm gives you a much easier API to work with.
    read & respond »
    Peter Ent wrote: I've been a Java developer for a number of years now, but it really amazes how complex things can get with Java. Here you have to expect some poor end-user to download the megabytes of JAR files to get this to work with the, shaky-at-best, applet environment. If you want to cook up your own video conferencing system, look no further than Macromedia's Flash Communication Server. This has to be the easiest API I have ever worked with. Not only is streaming audio and video easy, but you can use Flash Comm in the same way you would use JMS to share data remotely - all in one nice package. Plus, the poor end-user needs only the Flash player - something they probably have installed anyway.
    read & respond »
    LATEST JAVA STORIES & POSTS
    JavaOne 2008: A Developer's Perspective
    This is my third JavaOne. Many topics were discussed, friendships were made, new partnerships were started. I must say things have changed a lot and stayed the same yet again, here are my thoughts in no particular order, bear in mind that they do not represent the opinion of my c
    3rd International Virtualization Conference & Expo: Themes & Topics
    From Application Virtualization to Xen, a round-up of the virtualization themes & topics being discussed in NYC June 23-24, 2008 by the world-class speaker faculty at the 3rd International Virtualization Conference & Expo being held by SYS-CON Events in The Roosevelt Hotel, in mi
    A Lightweight Approach to SOA and BPM in Java Using jBPM
    SOA is mostly associated with technologies such as BPEL, SCA and Web Services. But does SOA really imply these technologies? In this session we will show how you can use the service oriented approach while staying inside the Java world. jBPM is a powerful lightweight framework th
    Case Study: Java and the Mac
    This is the story of a Mac application developer (okay - it's about two of them) who set out on a quest to find an application development tool based on Java so his boss would let him develop on the Mac platform, which he loved. There was only one catch - he had to find a tool th
    eApps Hosting Now Offers the GlassFish Java Application Server in VPS Hosting Plans
    eApps Hosting announced that the GlassFish Open Source Application Server for Java EE 5, from the GlassFish community project, is now available as a click installable application service in low cost Virtual Private Server (VPS) hosting plans. The eApps Hosting service has support
    The 4 Core Principles of Agile Programming
    One of the things I really enjoy at the moment is the recognition and adoption of agile programming as a fully fledged powerful way to deliver quality software projects. As its figurehead is a group of very talented individuals who have created the agile manifesto (http://agilema
    SUBSCRIBE TO THE WORLD'S MOST POWERFUL NEWSLETTERS
    SUBSCRIBE TO OUR RSS FEEDS & GET YOUR SYS-CON NEWS LIVE!
    Click to Add our RSS Feeds to the Service of Your Choice:
    Google Reader or Homepage Add to My Yahoo! Subscribe with Bloglines Subscribe in NewsGator Online
    myFeedster Add to My AOL Subscribe in Rojo Add 'Hugg' to Newsburst from CNET News.com Kinja Digest View Additional SYS-CON Feeds
    Publish Your Article! Please send it to editorial(at)sys-con.com!

    Advertise on this site! Contact advertising(at)sys-con.com! 201 802-3021

    SYS-CON FEATURED WHITEPAPERS

    ADS BY GOOGLE
    BREAKING JAVA NEWS
    Five Sun Microsystems Women Honored with Prestigious Awards
    Sun Microsystems, Inc. (NASDAQ:JAVA) today announced that five Sun women have been awar