【问题标题】:How to send and receive Voice Stream using RTP如何使用 RTP 发送和接收语音流
【发布时间】:2012-09-28 07:53:45
【问题描述】:

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

收到确认后,我想启动 RTP 进行媒体流传输,我使用 RtpPacket 发送和接收函数

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

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

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

【问题讨论】:

  • 大家好,请给我一些想法,如何通过 sip 堆栈使用 RTP 发送语音流,我正在尝试使用 Sipdroid RTPsender 和接收器类,但没有成功..

标签: android sip voip rtp jain-sip


【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 2023-04-10
      • 2013-03-30
      • 2020-10-23
      • 1970-01-01
      • 2015-08-24
      • 2018-07-13
      • 2020-03-16
      相关资源
      最近更新 更多