9

我是使用 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;

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

4

2 回答 2

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);
于 2014-10-28T18:28:07.153 回答
2

我们使用 RTPpacket 发送和接收 RTP 数据。

  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
              }
          }
      }
于 2012-10-05T06:06:32.627 回答