DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

Sound Over IP With Jmf RTP

12.08.2006
| 20823 views |
  • submit to reddit
        This code will allow you to send  and recive sound over IP network using RTP protocol. It's just changed classes that I found on java.sun.com page.


// this class send sound
import java.io.IOException;
import java.util.Vector;

import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.NoProcessorException;
import javax.media.NotRealizedError;
import javax.media.Player;
import javax.media.Processor;
import javax.media.control.FormatControl;
import javax.media.control.TrackControl;
import javax.media.format.AudioFormat;
import javax.media.protocol.ContentDescriptor;
import javax.media.protocol.DataSource;

public class SimpleVoiceTransmiter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		 First find a capture device that will capture linear audio
        // data at 8bit 8Khz 
        AudioFormat format= new AudioFormat(AudioFormat.LINEAR, 
                                            8000, 
                                            8, 
                                            1); 

        Vector devices= CaptureDeviceManager.getDeviceList( format);

        CaptureDeviceInfo di= null;

        if (devices.size() > 0) {
             di = (CaptureDeviceInfo) devices.elementAt( 0);
        }
        else {
            // exit if we could not find the relevant capturedevice. 
            System.exit(-1); 
        }
       
        // Create a processor for this capturedevice & exit if we 
        // cannot create it 
        Processor processor = null;
        try { 
        	processor = Manager.createProcessor(di.getLocator());
        } catch (IOException e) { 
            System.exit(-1); 
        } catch (NoProcessorException e) { 
            System.exit(-1); 
        } 

       // configure the processor  
       processor.configure(); 
       
       while (processor.getState() != Processor.Configured){
    	   try {
    		   Thread.sleep(100);
    	   } catch (InterruptedException e) {
    		   // TODO Auto-generated catch block
    		   e.printStackTrace();
    	   }
       }
       
       processor.setContentDescriptor( 
           new ContentDescriptor( ContentDescriptor.RAW));
        
       TrackControl track[] = processor.getTrackControls(); 
       
       boolean encodingOk = false;
       
       // Go through the tracks and try to program one of them to
       // output gsm data. 
       
        for (int i = 0; i < track.length; i++) { 
            if (!encodingOk && track[i] instanceof FormatControl) {  
                if (((FormatControl)track[i]).
                    setFormat( new AudioFormat(AudioFormat.GSM_RTP, 
                                               8000, 
                                               8, 
                                               1)) == null) {

                   track[i].setEnabled(false); 
                }
                else {
                    encodingOk = true; 
                }
            } else { 
                // we could not set this track to gsm, so disable it 
                track[i].setEnabled(false); 
            } 
        }
        
        // At this point, we have determined where we can send out 
        // gsm data or not. 
        // realize the processor 
        if (encodingOk) { 
            processor.realize(); 
            while (processor.getState() != Processor.Realized){
         	   try {
         		   Thread.sleep(100);
         	   } catch (InterruptedException e) {
         		   // TODO Auto-generated catch block
         		   e.printStackTrace();
         	   }
            }
            // get the output datasource of the processor and exit 
            // if we fail 
            DataSource ds = null;
            
            try { 
                ds = processor.getDataOutput(); 
            } catch (NotRealizedError e) { 
                System.exit(-1);
            }

            // hand this datasource to manager for creating an RTP 
            // datasink our RTP datasink will multicast the audio 
            try {
                String url= "rtp://224.0.0.1:22224/audio/16";
                
                MediaLocator m = new MediaLocator(url); 
                
                DataSink d = Manager.createDataSink(ds, m);
                d.open();
                d.start();
                processor.start();
            } catch (Exception e) {
                System.exit(-1);
            }     
        }    


		 
	}

}

// second class here
// this class recieve sound

import java.io.IOException;
import java.net.MalformedURLException;

import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;

public class SimpleVoiceReciver{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String url= "rtp://224.0.0.1:22224/audio/16";
		 
        MediaLocator mrl= new MediaLocator(url);
        
        if (mrl == null) {
            System.err.println("Can't build MRL for RTP");
            System.exit(-1);
        }
        
        // Create a player for this rtp session
        Player player = null;
        try {
            player = Manager.createPlayer(mrl);
        } catch (NoPlayerException e) {
            System.err.println("Error:" + e);
            System.exit(-1);
        } catch (MalformedURLException e) {
            System.err.println("Error:" + e);
            System.exit(-1);
        } catch (IOException e) {
            System.err.println("Error:" + e);
            System.exit(-1);
        }
        
        if (player != null) {
        	System.out.println("Player created.");
            player.realize();
//          wait for realizing
            while (player.getState() != Player.Realized){
            	try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
            }
            player.start();
        } else {
        	System.err.println("Player doesn't created.");
        	System.exit(-1);
        }
	}

}

    

Comments

Snippets Manager replied on Fri, 2009/10/23 - 5:09am

hi when i excute the code "SimpleVoiceReciver" , i got the error msg as follows : Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/NoPlayerE xception Caused by: java.lang.ClassNotFoundException: javax.media.NoPlayerException at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Could not find the main class: SimpleVoiceReciver. Program will exit. Do You Know What's Happening!

Snippets Manager replied on Fri, 2009/10/23 - 5:09am

hi i can't import these as follows : import javax.media.CaptureDeviceInfo; import javax.media.CaptureDeviceManager; import javax.media.DataSink; import javax.media.Manager; import javax.media.MediaLocator; import javax.media.NoPlayerException; import javax.media.NoProcessorException; import javax.media.NotRealizedError; import javax.media.Player; import javax.media.Processor; import javax.media.control.FormatControl; import javax.media.control.TrackControl; import javax.media.format.AudioFormat; import javax.media.protocol.ContentDescriptor; import javax.media.protocol.DataSource; am i have to include any jar ?