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

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;

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

1
大家好,请给我一些想法,如何通过SIP堆栈使用RTP发送语音流,我正在尝试使用Sipdroid RTPsender和receiver类,但没有成功。 - Satyam
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);

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
              }
          }
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接