About transmitting audio by RTP

Hi, there,
I want to create a simple application that transfers audio online through RTP. both the sender machine and receiver machine have public ip address. I tried JMStudio and AVTransmit2/AVReceiver2 without success till now! it drives me crazy. I really don't know what's wrong here. is there anyone really make it work?
even I can see the receiver machine keep receiving data through the port I specify to transfer data(the port is 22224), the JMStudio or AVReceiver2 on receiver machine just waiting for data, also I can see the statistic of JMStudio on sender machine reports transfer successful and the data keeping transferred. I also tried to use broadcast way, that is, changing the last part of sender's ip address to 255, still no luck! the receiver can't receive any data!
since I use Ubuntu, there is no firewall, no port is blocked. I can access from receiver to sender or vice versa using SSH. I don't think there is any connection problem, also I can see the receiver keeping receive data.
I transfer a mp3 file through RTP session. I installed mp3 plugin on both receiver machine and sender machine. I can play it using JMStudio on both receiver machine and sender machine locally.
could anyone kindly let me know how I should do, or if there is any very very simple java program to transfer anything using RTP on internet? could you please tell me your configuration if you happen to make it work?
any hint will great appreciate!
Sam

if you have a microphone in your pc, AVTranmit2 and AVReceive2 command should be:
on your own pc:
java AVTransmit2 dsound:// targetIP 42050
on target pc:
java AVReceive2 yourIP/42050
since the same port cannot be used simutaneously by two applications(avreceive2 and avtransmit2), the above command can only be used on two different pcs (your pc and target pc).
if you wanna execute AVReceive2 and AVTransmit2 on the same pc, you have to modify the source codes. I have done that.
commond
java AVTransmit2 dsound:// yourip 42050 42100
java AVReceive2 yourip/42050 yourip/42100
the modified source files are as follows:
/*****************AVReceive2.java**********************************/
* @(#)AVReceive2.java     1.3 01/03/13
* Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
import java.io.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.util.Vector;
import javax.media.*;
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.media.rtp.rtcp.*;
import javax.media.protocol.*;
import javax.media.protocol.DataSource;
import javax.media.format.AudioFormat;
import javax.media.format.VideoFormat;
import javax.media.Format;
import javax.media.format.FormatChangeEvent;
import javax.media.control.BufferControl;
* AVReceive2 to receive RTP transmission using the new RTP API.
public class AVReceive2 implements ReceiveStreamListener, SessionListener,
     ControllerListener
String sessions[] = null;
RTPManager mgrs[] = null;
Vector playerWindows = null;
boolean dataReceived = false;
Object dataSync = new Object();
public AVReceive2(String sessions[]) {
     this.sessions = sessions;
protected boolean initialize() {
try {
     InetAddress ipAddr;
     SessionAddress localAddr = new SessionAddress();
     SessionAddress destAddr;
     mgrs = new RTPManager[sessions.length];
     playerWindows = new Vector();
     SessionLabel session;
     // Open the RTP sessions.
     for (int i = 0; i < sessions.length; i++) {
          // Parse the session addresses.
          try {
          session = new SessionLabel(sessions);
          } catch (IllegalArgumentException e) {
          System.err.println("Failed to parse the session address given: " + sessions[i]);
          return false;
          System.err.println(" - Open RTP session for: addr: " + session.addr + " port: " + session.port + " ttl: " + session.ttl);
          mgrs[i] = (RTPManager) RTPManager.newInstance();
          mgrs[i].addSessionListener(this);
          mgrs[i].addReceiveStreamListener(this);
          ipAddr = InetAddress.getByName(session.addr);
          if( ipAddr.isMulticastAddress()) {
          // local and remote address pairs are identical:
          localAddr= new SessionAddress( ipAddr,
                              session.port,
                              session.ttl);
          destAddr = new SessionAddress( ipAddr,
                              session.port,
                              session.ttl);
          } else {
          localAddr= new SessionAddress( InetAddress.getLocalHost(),
                    42100+2*i);
                         //session.port);
destAddr = new SessionAddress( ipAddr,
          42050+2*i);
          //session.port);
          mgrs[i].initialize( localAddr);
          // You can try out some other buffer size to see
          // if you can get better smoothness.
          BufferControl bc = (BufferControl)mgrs[i].getControl("javax.media.control.BufferControl");
          if (bc != null)
          bc.setBufferLength(350);
          mgrs[i].addTarget(destAddr);
} catch (Exception e){
System.err.println("Cannot create the RTP Session: " + e.getMessage());
return false;
     // Wait for data to arrive before moving on.
     long then = System.currentTimeMillis();
     long waitingPeriod = 30000; // wait for a maximum of 30 secs.
     try{
     synchronized (dataSync) {
          while (!dataReceived &&
               System.currentTimeMillis() - then < waitingPeriod) {
          if (!dataReceived)
               System.err.println(" - Waiting for RTP data to arrive...");
          dataSync.wait(1000);
     } catch (Exception e) {}
     if (!dataReceived) {
     System.err.println("No RTP data was received.");
     close();
     return false;
return true;
public boolean isDone() {
     return playerWindows.size() == 0;
* Close the players and the session managers.
protected void close() {
     for (int i = 0; i < playerWindows.size(); i++) {
     try {
          ((PlayerWindow)playerWindows.elementAt(i)).close();
     } catch (Exception e) {}
     playerWindows.removeAllElements();
     // close the RTP session.
     for (int i = 0; i < mgrs.length; i++) {
     if (mgrs[i] != null) {
mgrs[i].removeTargets( "Closing session from AVReceive2");
mgrs[i].dispose();
          mgrs[i] = null;
PlayerWindow find(Player p) {
     for (int i = 0; i < playerWindows.size(); i++) {
     PlayerWindow pw = (PlayerWindow)playerWindows.elementAt(i);
     if (pw.player == p)
          return pw;
     return null;
PlayerWindow find(ReceiveStream strm) {
     for (int i = 0; i < playerWindows.size(); i++) {
     PlayerWindow pw = (PlayerWindow)playerWindows.elementAt(i);
     if (pw.stream == strm)
          return pw;
     return null;
* SessionListener.
public synchronized void update(SessionEvent evt) {
     if (evt instanceof NewParticipantEvent) {
     Participant p = ((NewParticipantEvent)evt).getParticipant();
     System.err.println(" - A new participant had just joined: " + p.getCNAME());
* ReceiveStreamListener
public synchronized void update( ReceiveStreamEvent evt) {
     RTPManager mgr = (RTPManager)evt.getSource();
     Participant participant = evt.getParticipant();     // could be null.
     ReceiveStream stream = evt.getReceiveStream(); // could be null.
     if (evt instanceof RemotePayloadChangeEvent) {
     System.err.println(" - Received an RTP PayloadChangeEvent.");
     System.err.println("Sorry, cannot handle payload change.");
     System.exit(0);
     else if (evt instanceof NewReceiveStreamEvent) {
     try {
          stream = ((NewReceiveStreamEvent)evt).getReceiveStream();
          DataSource ds = stream.getDataSource();
          // Find out the formats.
          RTPControl ctl = (RTPControl)ds.getControl("javax.media.rtp.RTPControl");
          if (ctl != null){
          System.err.println(" - Recevied new RTP stream: " + ctl.getFormat());
          } else
          System.err.println(" - Recevied new RTP stream");
          if (participant == null)
          System.err.println(" The sender of this stream had yet to be identified.");
          else {
          System.err.println(" The stream comes from: " + participant.getCNAME());
          // create a player by passing datasource to the Media Manager
          Player p = javax.media.Manager.createPlayer(ds);
          if (p == null)
          return;
          p.addControllerListener(this);
          p.realize();
          PlayerWindow pw = new PlayerWindow(p, stream);
          playerWindows.addElement(pw);
          // Notify intialize() that a new stream had arrived.
          synchronized (dataSync) {
          dataReceived = true;
          dataSync.notifyAll();
     } catch (Exception e) {
          System.err.println("NewReceiveStreamEvent exception " + e.getMessage());
          return;
     else if (evt instanceof StreamMappedEvent) {
     if (stream != null && stream.getDataSource() != null) {
          DataSource ds = stream.getDataSource();
          // Find out the formats.
          RTPControl ctl = (RTPControl)ds.getControl("javax.media.rtp.RTPControl");
          System.err.println(" - The previously unidentified stream ");
          if (ctl != null)
          System.err.println(" " + ctl.getFormat());
          System.err.println(" had now been identified as sent by: " + participant.getCNAME());
     else if (evt instanceof ByeEvent) {
     System.err.println(" - Got \"bye\" from: " + participant.getCNAME());
     PlayerWindow pw = find(stream);
     if (pw != null) {
          pw.close();
          playerWindows.removeElement(pw);
* ControllerListener for the Players.
public synchronized void controllerUpdate(ControllerEvent ce) {
     Player p = (Player)ce.getSourceController();
     if (p == null)
     return;
     // Get this when the internal players are realized.
     if (ce instanceof RealizeCompleteEvent) {
     PlayerWindow pw = find(p);
     if (pw == null) {
          // Some strange happened.
          System.err.println("Internal error!");
          System.exit(-1);
     pw.initialize();
     pw.setVisible(true);
     p.start();
     if (ce instanceof ControllerErrorEvent) {
     p.removeControllerListener(this);
     PlayerWindow pw = find(p);
     if (pw != null) {
          pw.close();     
          playerWindows.removeElement(pw);
     System.err.println("AVReceive2 internal error: " + ce);
* A utility class to parse the session addresses.
class SessionLabel {
     public String addr = null;
     public int port;
     public int ttl = 1;
     SessionLabel(String session) throws IllegalArgumentException {
     int off;
     String portStr = null, ttlStr = null;
     if (session != null && session.length() > 0) {
          while (session.length() > 1 && session.charAt(0) == '/')
          session = session.substring(1);
          // Now see if there's a addr specified.
          off = session.indexOf('/');
          if (off == -1) {
          if (!session.equals(""))
               addr = session;
          } else {
          addr = session.substring(0, off);
          session = session.substring(off + 1);
          // Now see if there's a port specified
          off = session.indexOf('/');
          if (off == -1) {
               if (!session.equals(""))
               portStr = session;
          } else {
               portStr = session.substring(0, off);
               session = session.substring(off + 1);
               // Now see if there's a ttl specified
               off = session.indexOf('/');
               if (off == -1) {
               if (!session.equals(""))
                    ttlStr = session;
               } else {
               ttlStr = session.substring(0, off);
     if (addr == null)
          throw new IllegalArgumentException();
     if (portStr != null) {
          try {
          Integer integer = Integer.valueOf(portStr);
          if (integer != null)
               port = integer.intValue();
          } catch (Throwable t) {
          throw new IllegalArgumentException();
     } else
          throw new IllegalArgumentException();
     if (ttlStr != null) {
          try {
          Integer integer = Integer.valueOf(ttlStr);
          if (integer != null)
               ttl = integer.intValue();
          } catch (Throwable t) {
          throw new IllegalArgumentException();
* GUI classes for the Player.
class PlayerWindow extends Frame {
     Player player;
     ReceiveStream stream;
     PlayerWindow(Player p, ReceiveStream strm) {
     player = p;
     stream = strm;
     public void initialize() {
     add(new PlayerPanel(player));
     public void close() {
     player.close();
     setVisible(false);
     dispose();
     public void addNotify() {
     super.addNotify();
     pack();
* GUI classes for the Player.
class PlayerPanel extends Panel {
     Component vc, cc;
     PlayerPanel(Player p) {
     setLayout(new BorderLayout());
     if ((vc = p.getVisualComponent()) != null)
          add("Center", vc);
     if ((cc = p.getControlPanelComponent()) != null)
          add("South", cc);
     public Dimension getPreferredSize() {
     int w = 0, h = 0;
     if (vc != null) {
          Dimension size = vc.getPreferredSize();
          w = size.width;
          h = size.height;
     if (cc != null) {
          Dimension size = cc.getPreferredSize();
          if (w == 0)
          w = size.width;
          h += size.height;
     if (w < 160)
          w = 160;
     return new Dimension(w, h);
public static void main(String argv[]) {
     if (argv.length == 0)
     prUsage();
     AVReceive2 avReceive = new AVReceive2(argv);
     if (!avReceive.initialize()) {
     System.err.println("Failed to initialize the sessions.");
     System.exit(-1);
     // Check to see if AVReceive2 is done.
     try {
     while (!avReceive.isDone())
          Thread.sleep(1000);
     } catch (Exception e) {}
     System.err.println("Exiting AVReceive2");
static void prUsage() {
     System.err.println("Usage: AVReceive2 <session> <session> ...");
     System.err.println(" <session>: <address>/<port>/<ttl>");
     System.exit(0);
}// end of AVReceive2
/****************************AVTransmit2.java****************************/
* @(#)AVTransmit2.java     1.4 01/03/13
* Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
import java.awt.*;
import java.io.*;
import java.net.InetAddress;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.protocol.DataSource;
import javax.media.format.*;
import javax.media.control.TrackControl;
import javax.media.control.QualityControl;
import javax.media.rtp.*;
import javax.media.rtp.rtcp.*;
import com.sun.media.rtp.*;
public class AVTransmit2 {
// Input MediaLocator
// Can be a file or http or capture source
private MediaLocator locator;
private String ipAddress;
// private int portBase;
     private int localPortBase;
     private int remotePortBase;
private Processor processor = null;
private RTPManager rtpMgrs[];
private DataSource dataOutput = null;
public AVTransmit2(MediaLocator locator,
               String ipAddress,
               String localPB,
               String remotePB,
               Format format) {
Integer int1 = Integer.valueOf(remotePB);
if(int1 != null)
     this.remotePortBase = int1.intValue();
     this.locator = locator;
     this.ipAddress = ipAddress;
     Integer int2 = Integer.valueOf(localPB);
     if (int2 != null)
     this.localPortBase = int2.intValue();
* Starts the transmission. Returns null if transmission started ok.
* Otherwise it returns a string with the reason why the setup failed.
public synchronized String start() {
     String result;
     // Create a processor for the specified media locator
     // and program it to output JPEG/RTP
     result = createProcessor();
     if (result != null)
     return result;
     // Create an RTP session to transmit the output of the
     // processor to the specified IP address and port no.
     result = createTransmitter();
     if (result != null) {
     processor.close();
     processor = null;
     return result;
     // Start the transmission
     processor.start();
     return null;
* Stops the transmission if already started
public void stop() {
     synchronized (this) {
     if (processor != null) {
          processor.stop();
          processor.close();
          processor = null;
          for (int i = 0; i < rtpMgrs.length; i++) {
          rtpMgrs[i].removeTargets( "Session ended.");
          rtpMgrs[i].dispose();
private String createProcessor() {
     if (locator == null)
     return "Locator is null";
     DataSource ds;
     DataSource clone;
     try {
     ds = javax.media.Manager.createDataSource(locator);
     } catch (Exception e) {
     return "Couldn't create DataSource";
     // Try to create a processor to handle the input media locator
     try {
     processor = javax.media.Manager.createProcessor(ds);
     } catch (NoProcessorException npe) {
     return "Couldn't create processor";
     } catch (IOException ioe) {
     return "IOException creating processor";
     // Wait for it to configure
     boolean result = waitForState(processor, Processor.Configured);
     if (result == false)
     return "Couldn't configure processor";
     // Get the tracks from the processor
     TrackControl [] tracks = processor.getTrackControls();
     // Do we have atleast one track?
     if (tracks == null || tracks.length < 1)
     return "Couldn't find tracks in processor";
     // Set the output content descriptor to RAW_RTP
     // This will limit the supported formats reported from
     // Track.getSupportedFormats to only valid RTP formats.
     ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
     processor.setContentDescriptor(cd);
     Format supported[];
     Format chosen;
     boolean atLeastOneTrack = false;
     // Program the tracks.
     for (int i = 0; i < tracks.length; i++) {
     Format format = tracks[i].getFormat();
     if (tracks[i].isEnabled()) {
          supported = tracks[i].getSupportedFormats();
          // We've set the output content to the RAW_RTP.
          // So all the supported formats should work with RTP.
          // We'll just pick the first one.
          if (supported.length > 0) {
          if (supported[0] instanceof VideoFormat) {
               // For video formats, we should double check the
               // sizes since not all formats work in all sizes.
               chosen = checkForVideoSizes(tracks[i].getFormat(),
                                   supported[0]);//select the first supported format for convenice
          } else
               chosen = supported[0];
          tracks[i].setFormat(chosen);
          System.err.println("Track " + i + " is set to transmit as:");
          System.err.println(" " + chosen);
          atLeastOneTrack = true;
          } else
          tracks[i].setEnabled(false);
     } else
          tracks[i].setEnabled(false);
     if (!atLeastOneTrack)
     return "Couldn't set any of the tracks to a valid RTP format";
     // Realize the processor. This will internally create a flow
     // graph and attempt to create an output datasource for JPEG/RTP
     // audio frames.
     result = waitForState(processor, Controller.Realized);
     if (result == false)
     return "Couldn't realize processor";
     // Set the JPEG quality to .5.
     setJPEGQuality(processor, 0.5f);//no effect if not JPEG format
     // Get the output data source of the processor
     dataOutput = processor.getDataOutput();
     return null;
* Use the RTPManager API to create sessions for each media
* track of the processor.
private String createTransmitter() {
     // Cheated. Should have checked the type.
     PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
     PushBufferStream pbss[] = pbds.getStreams();
     rtpMgrs = new RTPManager[pbss.length];
     SessionAddress localAddr, destAddr;
     InetAddress ipAddr;
     SendStream sendStream;
     int localPort;
     int remotePort;
     SourceDescription srcDesList[];
     for (int i = 0; i < pbss.length; i++) {
     try {
          rtpMgrs[i] = RTPManager.newInstance();     
          // The local session address will be created on the
          // same port as the the target port. This is necessary
          // if you use AVTransmit2 in conjunction with JMStudio.
          // JMStudio assumes - in a unicast session - that the
          // transmitter transmits from the same port it is receiving
          // on and sends RTCP Receiver Reports back to this port of
          // the transmitting host.
          localPort = localPortBase + 2*i;
          remotePort = remotePortBase + 2*i;
          ipAddr = InetAddress.getByName(ipAddress);
          localAddr = new SessionAddress( InetAddress.getLocalHost(),
                              localPort);
          destAddr = new SessionAddress( ipAddr, remotePort);
          rtpMgrs[i].initialize( localAddr);
          rtpMgrs[i].addTarget( destAddr);
          System.err.println( "Created RTP session ("+pbss[i].getFormat().getClass() + "):"+localAddr.getControlHostAddress()
                    +":"+localAddr.getDataPort()+"->"+destAddr.getControlHostAddress()+":"+ destAddr.getDataPort());
          sendStream = rtpMgrs[i].createSendStream(dataOutput, i);     
          sendStream.start();
     } catch (Exception e) {
          return e.getMessage();
     return null;
* For JPEG and H263, we know that they only work for particular
* sizes. So we'll perform extra checking here to make sure they
* are of the right sizes.
Format checkForVideoSizes(Format original, Format supported) {
     int width, height;
     Dimension size = ((VideoFormat)original).getSize();
     Format jpegFmt = new Format(VideoFormat.JPEG_RTP);
     Format h263Fmt = new Format(VideoFormat.H263_RTP);
     if (supported.matches(jpegFmt)) {
     // For JPEG, make sure width and height are divisible by 8.
     width = (size.width % 8 == 0 ? size.width :
                    (int)(size.width / 8) * 8);
     height = (size.height % 8 == 0 ? size.height :
                    (int)(size.height / 8) * 8);
     } else if (supported.matches(h263Fmt)) {
     // For H.263, we only support some specific sizes.
     if (size.width < 128) {
          width = 128;
          height = 96;
     } else if (size.width < 176) {
          width = 176;
          height = 144;
     } else {
          width = 352;
          height = 288;
     } else {
     // We don't know this particular format. We'll just
     // leave it alone then.
     return supported;
     return (new VideoFormat(null,
                    new Dimension(width, height),
                    Format.NOT_SPECIFIED,
                    null,
                    Format.NOT_SPECIFIED)).intersects(supported);
* Setting the encoding quality to the specified value on the JPEG encoder.
* 0.5 is a good default.
void setJPEGQuality(Player p, float val) {
     Control cs[] = p.getControls();
     QualityControl qc = null;
     VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);
     // Loop through the controls to find the Quality control for
     // the JPEG encoder.
     for (int i = 0; i < cs.length; i++) {
     if (cs[i] instanceof QualityControl &&
          cs[i] instanceof Owned) {
          Object owner = ((Owned)cs[i]).getOwner();
          // Check to see if the owner is a Codec.
          // Then check for the output format.
          if (owner instanceof Codec) {
          Format fmts[] = ((Codec)owner).getSupportedOutputFormats(null);
          for (int j = 0; j < fmts.length; j++) {
               if (fmts[j].matches(jpegFmt)) {
               qc = (QualityControl)cs[i];
               qc.setQuality(val);
               System.err.println("- Setting quality to " +
                         val + " on " + qc);
               break;
          if (qc != null)
          break;
* Convenience methods to handle processor's state changes.
private Integer stateLock = new Integer(0);
private boolean failed = false;
Integer getStateLock() {
     return stateLock;
void setFailed() {
     failed = true;
private boolean waitForState(Processor p, int state) {
     p.addControllerListener(new StateListener());
     failed = false;
     // Call the required method on the processor
     if (state == Processor.Configured) {
     p.configure();
     } else if (state == Processor.Realized) {
     p.realize();
     // Wait until we get an event that confirms the
     // success of the method, or a failure event.
     // See StateListener inner class
     while (p.getState() < state && !failed) {
     synchronized (getStateLock()) {
          try {
          getStateLock().wait();
          } catch (InterruptedException ie) {
          return false;
     if (failed)
     return false;
     else
     return true;
* Inner Classes
class StateListener implements ControllerListener {
     public void controllerUpdate(ControllerEvent ce) {
     // If there was an error during configure or
     // realize, the processor will be closed
     if (ce instanceof ControllerClosedEvent)
          setFailed();
     // All controller events, send a notification
     // to the waiting thread in waitForState method.
     if (ce instanceof ControllerEvent) {
          synchronized (getStateLock()) {
          getStateLock().notifyAll();
* Sample Usage for AVTransmit2 class
public static void main(String [] args) {
     // We need three parameters to do the transmission
     // For example,
     // java AVTransmit2 file:/C:/media/test.mov 129.130.131.132 42050
     if (args.length < 3) {
     prUsage();
     Format fmt = null;
     int i = 0;
     MediaLocator ml = new MediaLocator(args[i]);
     // Create a audio transmit object with the specified params.
     AVTransmit2 at = new AVTransmit2(ml,
                         args[i+1], args[i+2], args[i+3], fmt);
     // Start the transmission
     String result = at.start();
     // result will be non-null if there was an error. The return
     // value is a String describing the possible error. Print it.
     if (result != null) {
     System.err.println("Error : " + result);
     System.exit(0);
     System.err.println("Start transmission for 60 seconds...");
     // Transmit for 60 seconds and then close the processor
     // This is a safeguard when using a capture data source
     // so that the capture device will be properly released
     // before quitting.
     // The right thing to do would be to have a GUI with a
     // "Stop" button that would call stop on AVTransmit2
     try {
     Thread.currentThread().sleep(60000);
     } catch (InterruptedException ie) {
     // Stop the transmission
     at.stop();
     System.err.println("...transmission ended.");
     System.exit(0);
static void prUsage() {
     System.err.println("Usage: AVTransmit2 <sourceURL> <destIP> <destPortBase>");
     System.err.println(" <sourceURL>: input URL or file name");
     System.err.println(" <destIP>: multicast, broadcast or unicast IP address for the transmission");
     System.err.println(" <destPortBase>: network port numbers for the transmission.");
     System.err.println(" The first track will use the destPortBase.");
     System.err.println(" The next track will use destPortBase + 2 and so on.\n");
     System.exit(0);
if you have any further problems, it's my pleasure to discuss with you.
[email protected]

Similar Messages

  • Transmitting audio and video using JMStudio

    1. Can any one give me the procedure to send audio and video from one system to another using JMStudio .. I am getting an exception like : "Unable to create Session Manager" .. (Note : I used the same Port address on both the systems)
    2. Also in one of the programs for RTP transmission i came across a statement like :
    URL l="rtp://123.12.123.1:5000/audio/1
    123.12.123.1 denotes IP Address to which the data is to be sent..
    5000 is the Port address..
    What does the part "audio/1" mean..
    Thanks in advance..

    Then one more doubt.. Cant we merge the audio and video and then send the merged media through RTP.. Yes! using 'Manager.createMergingDataSource(DataSource[])'
    If we can send then what is that I must use in place of '{color:#ff6600}audio{color}' in
    URL l=rtp://123.12.123.1:15000/audioI am sorry, I don't know...... actually I have never send Audio/Video using rtp-urls, rather I have always used RTPManager. But, yes on the receiver side these rtp urls come in handy and you just have to createPlayer using these rtp MediaLoactors, all locators which I gave in previous reply work for receiver. Perhaps, rtp urls are meant for receiving only, not for transmitting and that makes sense.
    For transmitting I think following code (which is severly stripped down version of AVTransmit2 and written hastily) can help you get started:
    import java.awt.BorderLayout;
    import java.net.InetAddress;
    import javax.media.*;
    import javax.media.control.MonitorControl;
    import javax.media.format.VideoFormat;
    import javax.media.protocol.ContentDescriptor;
    import javax.media.rtp.*;
    import javax.swing.*;
    * @author talha
    public class RTPexp extends JFrame {
        Processor p = null;
        RTPManager manager;
        JPanel jp1, jp2, jp3;
        JButton jb1, jb2;
        public RTPexp() {
            setSize(300,400);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            try {
                jp1 = new JPanel(new BorderLayout());
                jp2 = new JPanel(new BorderLayout());
                jp3 = new JPanel(new BorderLayout());
                this.setContentPane(jp1);
                jb1 = new JButton("Start");
                jb2 = new JButton("Stop");
                jb1.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        jb1ActionPerformed();
                jb2.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        jb2ActionPerformed();
                jp2.add(jb1, BorderLayout.WEST);
                jp2.add(jb2, BorderLayout.EAST);
                jp1.add(jp2, BorderLayout.SOUTH);
                jp1.add(jp3, BorderLayout.CENTER);
                p = Manager.createProcessor(new MediaLocator("vfw://0"));   // video capture device locator
                p.configure();
                Thread.sleep(2000);
                p.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW_RTP));
                p.getTrackControls()[0].setFormat(new VideoFormat(VideoFormat.JPEG_RTP)); //transmitting in Jpeg/rtp, there can be errors here....
                p.realize();
                Thread.sleep(2000);
                manager = RTPManager.newInstance();
                manager.initialize(new SessionAddress(InetAddress.getLocalHost(), SessionAddress.ANY_PORT)); // initializing rtp manager, ANY_PORT allows receiving on the same system
                manager.addTarget(new SessionAddress(InetAddress.getByName("192.168.1.3"), 3000)); // the receivers address and port
                validate();
            } catch (Exception ex) {
                ex.printStackTrace();
        private void jb1ActionPerformed() {
            try {
                p.start();
                SendStream s = manager.createSendStream(p.getDataOutput(), 0);
                s.start();
                MonitorControl mc = (MonitorControl) p.getControl("javax.media.control.MonitorControl");
                Control controls[] = p.getControls();
                boolean flag = false;           // the next statements to search the right monitor control, which happens to be the 2nd one....
                for (int i = 0; i < controls.length; i++) {
                    if (controls[i] instanceof MonitorControl) {
                        if (flag) {
                            mc = (MonitorControl) controls;
    mc.setEnabled(true);
    if (mc.getControlComponent() != null) {
    jp3.add("Center", mc.getControlComponent());
    } else {
    flag = true;
    if (p.getControlPanelComponent() != null) {
    jp3.add(p.getControlPanelComponent(), BorderLayout.SOUTH);
    validate();
    } catch (Exception ex) {
    ex.printStackTrace();
    private void jb2ActionPerformed() {
    p.stop();
    p.close();
    jp3.removeAll();
    jp3.validate();
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new
    Runnable() {
    public void run() {
    new RTPexp().setVisible(true);
    Thanks!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • Monitoring local transmitted audio

    I use JMF RTP API Manager to send and receive audio streams. I'm using AVTransmit2.java. I worked for the code and When i want to transmit to another machine. Unfortunately on my local computer didn't play the audio, it's not like JM Studio that has monitor audio when audio transmitted. So, what can I do to add this audio mointoring for my transmitted audio file. What must I do? Make antoher player from cloneable datasource, or worked with processor that was on.
    Edited by: 831279 on Apr 1, 2011 1:06 AM

    831279 wrote:
    What must I do? Make antoher player from cloneable datasource, or worked with processor that was on.You can do the clone/player thing (play the clone, btw, not the original datasource)...
    Or you can get the MonitorControl from the processor and use that.
    Or you could add yourself as a target for the RTP stream and then run an instance of AVReceive2 to play the stream...

  • Planning for Macbook (pro?) Questions about recording audio + multitasking

    Hi Everyone
    I am seriously contemplating switching to a Mac book (Pro?) in the next few months, and I want to clarify issues about recording audio.
    I record music and other stuff at our local church using a mixer and feed stereo straight into a pc which records using the excellent Adobe Audition (... well it works for me  :-)
    To start with I expect I'll be using GarageBand and later look at other solutions such as ProTools I used to use on the PC.
    QUESTION
    I would welcome experienced users to comment on how well GrageBand or similar can multi task while recording is taking place. In other words what can I do - Not do, while recording.
    Be honest please.
    I worry I might get an exagerated reply from an Apple evangelist and I'm not seeking perfection, just knowledge of practical experiences.
    I'd like an idea of what limits present users have found running recording apps like Garageband or similar.
    As an example :  what experiences running large wordprocessing application or Internet (e.g. FTP or Safari) while recording?
    Replies appreciated
    Pete

    If it's an important recording or a once-only opportunity to record something then I would seriously advise against multi-tasking on any computer, PC or Mac, whilst recording.  Dedicate all processing power to capturing the recording, and if you want to browse the web/update your resumé whilst recording then use another computer!

  • Whast About All Audio Software Apps, Plugins And VI's From OS X Mountain Lion In Mavericks ?

    Whast About All Audio Software Apps, Plugins And VI's From OS X Mountain Lion In Mavericks ?

    Check here...
    http://roaringapps.com/apps:table

  • But i'm worried about the audio quality which matters to me the most !! is the audio quality on iPod with ear-pods the same as iPad with earpods ?

    hi guys !! i'm an ipod touch 5g user ! and i want to switch to ipad !! but i'm worried about the audio quality which matters to me the most !! is the audio quality on iPod with ear-pods the same as iPad with earpods ?

    thnx i'm more satisfied now !

  • Transmitted audio TC on FCP audio track - how to read the TC

    Recorded transmitted audio time code on FCP audio channel. How can I convert this audio to Time Code so I can sync up the audio material to the video? Please advise, Thanks, Diego
    Powerbook G4   Mac OS X (10.3.9)  

    Just to add to what Jim said, you might have some luck with renting one of these...
    http://www.rule.com/productDesc.cfm?productID=312#
    or similar to lay you clips out to a tape machine that will take external time code.
    Depends on what gear you have in-house.
    Tom

  • HT4528 How do I recover my calendar events?  How about downloading audio books?

    Since the latest iOS 7 upgrade, I HATE my iPhone!  I was able to recover my contacts.  I was not able to recover my calendar events. 
    How do I recover my calendar events? 
      I have an appointment tomorrow & can't remember necessary info!
    How about downloading audio books?
    I am not able to download an audio book, which I have done for a very long time w/o issues. Have any suggestions?

    When I synced, & recovered the contacts, the calendar recovered events (as current) that I had deleted last winter.
    I check out audiobooks from the local library & download them using OneClickDigital Media Manager.  It goes thorugh iTunes to get the book onto my phone.  It shows up pale in iTunes (All other items are in bold print.) & the book does not show up on my phone at all. 

  • Transmitting audio stream by RTP

    Hello:
    I am trying to transmit audio stream with this code, but i dont get it work well.
    The output is:
    C:\RUN\EX14>java AVTransmit2 file:/c:/run/format/au/drip.au 1.1.9.147 45200
    Track 0 is set to transmit as:
    ULAW/rtp, 8000.0 Hz, 8-bit, Mono, FrameSize=8 bits
    Created RTP session: 1.1.9.147 45200
    Start transmission for 60 seconds...
    Code to AVTransmit2.java:
    * Use the RTPManager API to create sessions for each media track of the processor.
    private String createTransmitter() {
         // Cheated. Should have checked the type.
         PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
         PushBufferStream pbss[] = pbds.getStreams();
         rtpMgrs = new RTPManager[pbss.length];
         SessionAddress localAddr, destAddr;
         InetAddress ipAddr;
         SendStream sendStream;
         int port;
         SourceDescription srcDesList[];
         for (int i = 0; i < pbss.length; i++) {
         try {
              rtpMgrs[i] = RTPManager.newInstance();     
    // The local session address will be created on the
    // same port as the the target port. This is necessary
    // if you use AVTransmit2 in conjunction with JMStudio.
    // JMStudio assumes - in a unicast session - that the
    // transmitter transmits from the same port it is receiving
    // on and sends RTCP Receiver Reports back to this port of
    // the transmitting host.
              port = portBase + 2*i;
              ipAddr = InetAddress.getByName(ipAddress);
              localAddr = new SessionAddress();
    //*          InetAddress.getLocalHost(),
    //*                                   port);
              destAddr = new SessionAddress( ipAddr,
                                  port);
              rtpMgrs.initialize( localAddr);
              rtpMgrs[i].addTarget( destAddr);
              System.err.println( "Created RTP session: " + ipAddress + " " + port);
              sendStream = rtpMgrs[i].createSendStream(dataOutput, i);          
              sendStream.start();
         } catch (Exception e) {
              return e.getMessage();
         return null;
    The code receptor is working well, because I tried it with JMStudio.
    Why it doesnt transmit ?
    I need your greatly help.
    Thanks.

    What is different from your previous question ?

  • Snapping captured & transmitted audio

    We're trying to make a screen grabber / voice chat application with JMF. Basically, it's just a bunch of modified example classes found on the sun netsite, but it doesn't seem to work perfectly, yet. The problem is that when transmitting only audio or video, it works fine, but when we transmit both, the audio has an annoying snapping sound with it, it becomes almost unrecognizable.
    The video is set to JPEG_RTP format and audio to DVI_RTP at 8000 bps sample rate, 4 bits sample size, mono. It doesn't seem to help if we lower the quality of the video or raise the quality of the audio.
    Could anyone give us so much as a hint of what the problem could be all about? I think something goes wrong in the transmission, but how to fix it?
    Thanks for the help :)

    Did you figure out the snapping in your sound.
    I'm just doing a small app that plays a short sound and it really SNAPS when the sound starts.
    My Best,
    Gordon

  • Recording audio from rtp session

    Dear all;
    I am not sure that this is the right forum to post my question. I am new in jmf and i want to record calls from nortel Pbx for example and others like asterisk PBX which records all in and out calls.first of all is it possible to use jmf for recording ? if yes , Provide links can i refer to read more about the subject

    Can you define "from another source". I'll assume for now, you mean, from an external live source, like a vocal, or guitar.
    Yes, if you had saved the song using the "Save As Project" command, the audio path to that songs audio folder should have been set. and all audio files recorded into that song would reside in that location.
    The only thing that you might want to check, is hit "A" with the song open, and make sure "choose path" is set to "Song Recording Path" and not "Global Recording Path".

  • Question about multiple audio tracks

    Hello,
    I see that imovie has only 2 audio tracks available when creating a movie. I need more than two since I will be working with a voiceover track, a soundtrack and at least one background/environment track all at one time. I won't be able to use the sound recorded with the video so that "track" is not an option.
    My question is; Am I out of luck here and need to spend the 1K for studio pro to add more multiple audio tracks?
    Also, I tried working with garageband but since all of my audio tracks import in at a minimum of 40 beats per minute, the voiceovers are all sped up and sound chipmunky.
    Thanks for any help!

    Well I didn't mean to irritate you...LOL And yes, I realize that this is the iM 6 forum but the gist of my question was related to multiple audio tracks in iM and thought I would ask about it in the forum pertaining to the latest release.
    I had already posted a question in the GB forum regarding the bpm problem and found no answers so I was pretty much about to shelve that idea and forgo the whole garageband thing; this without knowing about the new "swap" features. I just updated to iM 6 yesterday.
    As far as the "on-tape" raw audios: I was working on my movie in iM4. I wanted to add more audio bits but I don't have a proper mic for my G5 so I recorded the audio bits on dv8 tape through my camcorder. I imported the video (the image was the inside of my lens cap!), extracted the audio, took those audio files and imported them into GarageBand. That's when I noticed the bpm problem.
    I'm sorry about the lack of info I originally gave but like I said, I had pretty much gave up on the idea of using GarageBand. I'm pretty new at this and I'm trying to decide what I need in terms of software to get what I want out of my movie. I'd be willing to pay for FCxp but still looking into whether I need to do just that or whether I can get by by using imovie and now it looks like GarageBand too.
    ah, thanks for that
    what irritates me, Prince wrote:
    The audio tracks were voiceovers that came from my
    dv8tape, imported into imovie4.
    ... ehm, but this is the iM 6(six) section, as said,
    iM 6 allows now "swapping" files with GB3... (I'm way
    back in the 90ies.... see my specs... )
    so, video is in some iM, and he wants to use the
    actual "on-tape" raw audios...
    I thnik we need a little more detail...

  • Question about JMF2.1.1 / RTP on internet

    hi
    I ma dhawal
    In jmf2.1.1 sample example given by java.sun
    "VideoTransmit2.java" to transmit the video on the intranet
    how to convert this Application so it works on internet
    will rtp is good for VOD Application
    please give me the detail
    and if possible then plz send me the code
    My Mail ID - [email protected]
    [email protected]

    can you forward me the code which u have seen and also plz write about the problem in brief.
    let's see how I can help you
    [email protected]

  • ? about "Lock Audio Clip at Playhead"

    I've always thought that the purpose of this feature is to make sure that audio and video clips that need to stay synced together in fact do.
    Well, I just added a short video clip to my timeline--in the middle of the movie--and it moved all the video clips to the right a bit, as it should--but not the audio clips, which were locked to their respective video!
    How could this happen?

    Hi folks.
    Since we last posted, I have discovered something new about the misbehaving audio lock. Happily, I learned that it does work for me - most of the time. I can select the audio, choose "Lock..." and if I get a yellow pushpin on both the video and audio tracks, then they are properly locked together.
    Here's the catch. Sometimes I select the audio, choose "Lock..." and the yellow pushpin only appears on the video track. In that case, they are not locked, and adding video before that pin will lose the sync with the improperly locked audio track. Also, I haven't found a way to get that single pushpin to go away. I can place the playhead there and choose "Lock..." again, but that has no effect (no toggle off and on). I can select a new place in the same audio clip and choose "Lock..." but the pin doesn't move. The only workaround I have found is to move a bit past the defective pin, do a "Split video at playhead" to create a new video track, and then select a spot in the audio clip to lock with the new video clip. The new clip will get the correct double pushpins, and the audio is really locked.
    Here is a screen shot of this behavior. Notice that I have several locked audio clips, and I have not placed the locks on the first frame of the video clips. You can see a defective single pushpin on the video associated with audio clip #23. I couldn't remove that pin, so I split the video clip and was able to lock down audio clip #24. (Note: the gaps in the video are intentional - when I had to change tapes. I'll fill them in with some photos, so I have to make sure that I won't lose sync.)
    What do you think about that?
    Regards.

  • Question about Export - Audio mixdown

    Ive been wondering, why is there option boxes for 32 and 16 bit? I understand dithering. But is this just to let adobe know what bit rate it is? why?
    Maybe, is it for this?? :  someone being in a hurry, for a quick mixdown for a cd-ready track they could hit 16 bit and enable dither, and youll notice  the "Dither Options" is the same dithering program inside Edit -> Convert Sample Type (F11) in multitrack view.
    And 32 bit is just to keep it good if you plan on editing it later, but i dont get this: Why adobe needs to know at mixdown, the actual waves should already be carrying the bit information, right?
    But what if the track was already dithered using Waves, Izotope or some other on the master fader for a quickfix...would leaving it at 32 be no problem? And if I put it at 16 would it try to chop it off more?
    Sorry, please someone explain.
    Adobe audition is not as simple as protools...sorry about my rant the other day, i understand i made a few mad but they probably took it the wrong way and I probably said it the wrong way, I was really looking for help. it just got me frustrated. I am an adobe auditon user too, as well.
    And just wondering, What .wav format do you guys save your Final master in?
    me, Ive been using ACM Format .WAV (16 bit 44.1 of course)
    once again, sorry

    djak24k wrote:
    Sorry, you lost me there, what do you mean by 2 16 bit files? like 2 in one session? or one on stacked on another? and run out of steam?
    Yes, two in one session. If one of them is 6dB louder (or quieter) than the other, then you'd need at least 17 bits to represent all the possible data in the output.
    And since i DJ, should I start recording in 16 bit? I have always kept 44.1 32 bit when in adobe because its the default, and mixed down, and had to master and dither in edit view in order to make it go on a cd... And the music is already mastered, but I go ahead and record in 32 bit, which i dont think would cause a problem - BUT dithering on top of dithering like i do to make it 16 again, that could be bad couldnt it?
    You shouldn't ever dither twice - you end up with twice as much added noise as you need, and it very likely won't work properly.
    Steve, whats your final 16bit-44.1 format? Ive noticed some of my cds havent been playing in 1, later on the cd players motor burnt out (impala 2004- im sure it was just getting old) and got a completely new cd player (the stock tray kind) and i still get errors, but they play everywhere else... and ive been doing ACM ever since I learned what redbook was. Well, at least in adobe.
    Ah, I meant to mention that. You shouldn't ever use ACM for anything, because it gets processed by the very dubious processing in the OS. What you should use is Windows PCM, because this is saved directly. So, the only acceptable format is 44.1k 16-bit stereo PCM wav.
    The safe way to process your audio is to do a 32-bit mixdown, and then in EV do the dither using Ozone. After that, convert the file (which is effectively a truncation) to 16-bit and do no more processing at all. The rule is "Dither Once - Dither Last". If you look in the Ozone Dithering Guide you will find more information about exactly what to do.

Maybe you are looking for

  • Intermittent Pinwheel & Freezing

    Hello all.  I'm a relatively new Mac user, having purchased a used Mac Pro last year.  Specs are as follows: 2 x 2.66GHz Dual-Core Intel Xeon 5GB 667MHz DDR2 FB-DIMM OS X 10.7.5 OS and applications are running off a 64GB SSD Over the past week I've i

  • How can I reset an apple ID without the email or birthday?

    When I was younger my parents had an earthlink account, and I bought my first iPod mini, and signed up for an apple ID. Skip to years later that email account is long gone, and my mom uses the same apple ID to sign in to both her new iPhone and the i

  • Serial no. does not appear in Toshiba tools & utilities

    hi all can any body help me in my note book satelite A500 1F4 all tosiba programes doesnot appear the serial no. or part no. or modul any body has the solution plz infor me that an important thing fo me thank u all

  • Hardware requirement for Oracle RAC 11g R2 on solaris

    Hi Experts, 1. can we use the below server for RAC setup,please note that system model is different bash-3.00# uname -a SunOS KCHJSAPP004 5.10 Generic_127127-11 sun4v sparc SUNW,SPARC-Enterprise-T5120 bash-3.00# uname -a SunOS KCHJSAPP007 5.10 Generi

  • Photo name

    Dear All, I made several photos many times ago... After I put them in several maps, Each photo received there own name, I replaced them from those that the camera gives...So now I want too put each photo on my IPad but when I'm looking too the name h