2014-03-26 10 views
0

я использовал JMF для передачи и приема звука для приложения с помощью JAIN-SIP и ниже мой код:Дуплекс RTP соединения основано в JMF при вызове с одной стороны, но приходит недостижимый порт при вызове с другой стороны

import com.sun.media.rtp.RTPSessionMgr; 
import java.io.IOException; 
import java.net.InetAddress; 
import java.net.URL; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.media.*; 
import javax.media.format.AudioFormat; 
import javax.media.format.UnsupportedFormatException; 
import javax.media.protocol.ContentDescriptor; 
import javax.media.protocol.DataSource; 
import javax.media.rtp.InvalidSessionAddressException; 
import javax.media.rtp.ReceiveStream; 
import javax.media.rtp.ReceiveStreamListener; 
import javax.media.rtp.SendStream; 
import javax.media.rtp.SessionAddress; 
import javax.media.rtp.event.NewReceiveStreamEvent; 
import javax.media.rtp.event.ReceiveStreamEvent; 
import java.net.*; 
import javax.media.control.TrackControl; 
import javax.media.rtp.*; 
import com.sun.media.rtp.*; 
import javax.media.rtp.RTPManager; 



/** 
* 
* @author dexter 
*/ 
public class Transmitter extends Thread implements ReceiveStreamListener { 

    static Processor mp; 
    static DataSink ds; 
    String ip,port; 
    RTPManager rtp; 
    SendStream ss; 
    ReceiveStream rs; 
    DataSource rds,ods,source; 
     Player player; 
     SessionAddress remoteaddr; 

    public void run() 
    { 
     try { 
      Format[] formats= new Format[]{new AudioFormat(AudioFormat.ULAW_RTP)}; 

      ContentDescriptor cd= new ContentDescriptor(ContentDescriptor.RAW_RTP); 

      Vector devices= CaptureDeviceManager.getDeviceList(new 
AudioFormat("linear",8000,16,2)); 
      System.out.println("devices="+devices); 


      CaptureDeviceInfo di=(CaptureDeviceInfo) devices.firstElement(); 
System.out.println("device info="+di); 

      MediaLocator ml= di.getLocator(); 
System.out.println("locator="+ml); 

try { 
       source = javax.media.Manager.createDataSource(ml); 
      } 
      catch (Exception e) { 
       // Try JavaSound Locator as a last resort 
       try { 
        source= javax.media.Manager.createDataSource(new MediaLocator("javasound://")); 
       } 
       catch (Exception ee) { 
        System.err.println("Couldn't create DataSource"); 
       } 
      } 

      mp=Manager.createRealizedProcessor(new ProcessorModel(source,formats,cd)); 

      mp.start(); 

      rtp=RTPManager.newInstance(); 
     // rtp.addReceiveStreamListener((ReceiveStreamListener) this); 
     SessionAddress localaddr= new SessionAddress(InetAddress.getByName(Phone.ip),Integer.parseInt(SipLayer.caller_port)); 
      remoteaddr= new SessionAddress(InetAddress.getByName(ip),new Integer(port)); 

      rtp.initialize(localaddr); 
      rtp.addReceiveStreamListener(this); 

     rtp.addTarget(remoteaddr); 


      ss=rtp.createSendStream(mp.getDataOutput(),0); 

    //  mp.start(); 
      ss.start(); 

     } catch (UnsupportedFormatException ex) { 
      Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InvalidSessionAddressException ex) { 
      Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (CannotRealizeException ex) { 
      Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (NoProcessorException ex) { 
      Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public Transmitter(String callee_ip,String callee_port) 
{ 
    ip=callee_ip; 
    port= callee_port; 
} 

    public void update(ReceiveStreamEvent rse) { 

     if(rse instanceof NewReceiveStreamEvent) 
     { 
      try { 
       rs = rse.getReceiveStream(); 
       rds = rs.getDataSource(); 
       player = Manager.createPlayer(rds); 
       player.start(); 
      } catch (IOException ex) { 
       Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (NoPlayerException ex) { 
       Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
    public void stop_media() 
    { 
     try{ 
      player.stop(); 
      player.deallocate(); 
      player.close(); 
      ss.stop(); 
      // necessary for sending rtcp bye 
      mp.stop(); 
      mp.close(); 
      mp.deallocate(); 
      ss.close(); 
     // 
      rtp.removeTarget(remoteaddr," disconnected"); 
      rtp.dispose(); 
     }catch(Exception e){ 

     } 
    } 
} 

Проблема в том, что когда я создаю соединение с моим приложением (т.е. я звоню), проблем нет, и я могу отправлять и получать аудио. Но когда я получаю звонок, тогда я слышу другую сторону, но другая сторона не может услышать меня. В wirehark прибывает порт назначения недостижимый. Пожалуйста, предложите, каково решение этой проблемы и почему она идет.

ответ

1

Anyways я решил вопрос, и я думаю, что это было проблемой для многих, поэтому, пожалуйста, не удаляйте его. Причина «Port Unreachable» проста: порт, который вы выделили, возможно, использовался, или вы, возможно, проигнорировали тот факт, что для RTP требуется четный номер для отправки данных и нечетный номер для RTCP.AND. RTCP обрабатывается JMF автоматически. Просто найдите неиспользуемый пронумерованный UDP-порт и используйте его для отправки RTP. Также отключите брандмауэр, если он не может получить какой-либо пакет (SIP или RTP)

public static int findFreePort() { 
     DatagramSocket socket = null; 
       int port=1; 
     try { 
        while(port%2!=0) 
        { 
         socket = new DatagramSocket(0); 

      socket.setReuseAddress(true); 
      port = socket.getLocalPort(); 
         socket.close(); 
        } 
      return port; 
     } catch (IOException e) { 
     } finally { 
      if (socket != null) { 
          socket.close(); 
      } 
     } 
     throw new IllegalStateException("Could not find a free UDP port to start"); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^