如何使用RTP发送和接收语音流

时间:2012-09-28 07:53:46

标签: android sip voip rtp jain-sip

我是使用RTP进行SIP呼叫的新手,现在我正在尝试发送和接收 语音流使用RTP进行SIP呼叫。我完成了连接 两个仿真器,能够使用jain sip发送INVITE和INVITE-ACK。

我得到一个Ack之后我想启动RTP进行媒体流传输,我使用RtpPacket 发送和接收功能

我使用RtpFunction发送包含所有RTP标头的媒体,如下所示:

byte Version;
boolean Padding;
boolean Extension;
byte CC;
boolean Marker;
byte PayloadType;
short SequenceNumber;
int TimeStamp;

请提供一些想法和实际链接,以便我找到答案。

2 个答案:

答案 0 :(得分:3)

这可以通过更简单的方式实现

AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audio.setMode(AudioManager.MODE_IN_COMMUNICATION);

audioGroup = new AudioGroup();
audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);

audioStream = new AudioStream(InetAddress.getByAddress(getLocalIPAddress()));
audioStream.setCodec(AudioCodec.PCMU);
audioStream.setMode(RtpStream.MODE_NORMAL);
audioStream.associate(InetAddress.getByName(SipStackAndroid.getRemoteIp()), REMOTE_PORT);
audioStream.join(audioGroup);

可以在此处找到使用JAIN SIP作为信令协议的简单SIP电话项目https://github.com/Mobicents/restcomm-android-sdk/tree/master/Examples/JAIN%20SIP

答案 1 :(得分:2)

    *We send and receive RTP data using RTPpacket. 

  import javax.media.rtp.*;
  import javax.media.rtp.rtcp.*;
  import javax.media.rtp.event.*;
  import javax.media.*;
  import javax.media.protocol.*;
  import java.net.InetAddress;
  import javax.media.format.AudioFormat;
  import com.sun.media.ui.*;
  import java.util.Vector;
   public class RTPSourceStream<RTPPlayerWindow> implements ReceiveStreamListener, 
    ControllerListener
   {
@SuppressWarnings("rawtypes")
Vector playerlist = new Vector();
@SuppressWarnings("deprecation")
SessionManager mgr = null;
boolean terminatedbyClose = false;

@SuppressWarnings("deprecation")
public SessionManager createManager(String address,
        String sport,
        String sttl,
        boolean listener,
        boolean sendlistener)
{
    return createManager(address,
            new Integer(sport).intValue(),
            new Integer(sttl).intValue(),
            listener,
            sendlistener);
}
@SuppressWarnings("deprecation")
public SessionManager createManager(String address,
        int port,
        int ttl,
        boolean listener,
        boolean sendlistener)
 {
    mgr = (SessionManager)new com.sun.media.rtp.RTPSessionMgr();
    if (mgr == null) return null;
    mgr.addFormat(new AudioFormat(AudioFormat.DVI_RTP,44100, 4,1),18);
    if (listener) mgr.addReceiveStreamListener(this);
    //  if (sendlistener) new RTPSendStreamWindow(mgr);
    // ask RTPSM to generate the local participants CNAME
    String cname = mgr.generateCNAME();
    String username = null;
    try {
        username = System.getProperty("user.name");
    } catch (SecurityException e){
        username = "jmf-user";
    }
         // create our local Session Address
    SessionAddress localaddr = new SessionAddress();
    try{
        InetAddress destaddr = InetAddress.getByName(address);
        SessionAddress sessaddr = new SessionAddress(destaddr,
                port,
                destaddr,
                port + 1);
        SourceDescription[] userdesclist= new SourceDescription[]
                                                                {
                new SourceDescription(SourceDescription
                        .SOURCE_DESC_EMAIL,
                        "jmf-user@sun.com",
                        1,
                        false),
                        new SourceDescription(SourceDescription
                                .SOURCE_DESC_CNAME,
                                cname,
                                1,
                                false),
                                new  
            SourceDescription(SourceDescription.SOURCE_DESC_TOOL,"JMF RTP Player v2.0",
                                        1,
                                        false) };
        mgr.initSession(localaddr,
                userdesclist,
                0.05,
                0.25);
        mgr.startSession(sessaddr,ttl,null);
    } catch (Exception e) {
        System.err.println(e.getMessage());
        return null;
    }
    return mgr;
  }
 public void update( ReceiveStreamEvent event)
   {
    Player newplayer = null;
    RTPPacket playerWindow = null;
       // find the sourceRTPSM for this event
    SessionManager source = (SessionManager)event.getSource();
    // create a new player if a new recvstream is detected
    if (event instanceof NewReceiveStreamEvent)
    {
        String cname = "Java Media Player";
        ReceiveStream stream = null;
        try
        {
            // get a handle over the ReceiveStream
            stream =((NewReceiveStreamEvent)event)
            .getReceiveStream();
            Participant part = stream.getParticipant();
            if (part != null) cname = part.getCNAME();
            // get a handle over the ReceiveStream datasource
            DataSource dsource = stream.getDataSource();
              // create a player by passing datasource to the 
              // Media Manager
            newplayer = Manager.createPlayer(dsource);
            System.out.println("created player " + newplayer);
           } catch (Exception e) {
            System.err.println("NewReceiveStreamEvent exception " 
                    + e.getMessage());
            return;
        }
        if (newplayer == null) return;
        playerlist.addElement(newplayer);
        newplayer.addControllerListener(this);
        // send this player to player GUI
        playerWindow = new RTPPacket( newplayer, cname);
    }
   }
   public void controllerUpdate( ControllerEvent evt)
    {
    // get a handle over controller, remove it from the player
    // list.
    // if player list is empty, close the sesssion manager.
    if ((evt instanceof ControllerClosedEvent) ||
            (evt instanceof ControllerErrorEvent) ||
            (evt instanceof DeallocateEvent)){
        Player p = (Player)evt.getSourceController();
        if (!terminatedbyClose){
            if (playerlist.contains(p))
                playerlist.removeElement(p);
            if ((playerlist.size() == 0) && (mgr != null))
                mgr.closeSession("All players are closed");
        }
    }
    }
      public void closeManager()
       {
    terminatedbyClose = true;
        // first close all the players
    for (int i = 0; i < playerlist.size(); i++) {
        ((Player)playerlist.elementAt(i)).close();
    }
    if (mgr != null) {
        mgr.closeSession("RTP Session Terminated");
        mgr = null;
    }
}
class RTPPacket extends RTPSourceStream
{
    public RTPPacket(Player newplayer, String cname) {
        // TODO Auto-generated constructor stub
    }
  }
    }*