通过 SIP 连接的 J2ME 音频流

Posted

技术标签:

【中文标题】通过 SIP 连接的 J2ME 音频流【英文标题】:J2ME Audio Streaming through SIP Connection 【发布时间】:2012-01-27 05:25:42 【问题描述】:

我正在创建一个带有 RTP 并通过 SIP 连接的 J2ME 实时流音频播放器。我对这些东西也很陌生。我想深入看看那些东西。如果有人知道一个很好的工作示例代码来演示 使用 RTP 进行音频播放器流式传输(这意味着如何通过 SIP 向服务器发送 REGISTER 消息以进行注册并发送 INVITE 消息和得到响应并播放)。请告诉我,非常感谢。

我也看了here

如果

我的服务器端口是 6060 ip 111.111.111.1 id是myid密码123

我是否正确使用了代码?如果我错了,请纠正我。

public void doRegister(String username, String password, String realm) 

  SipClientConnection scc = null;  
  SipConnectionNotifier scn = null;  
  String contact = null;    
  try    
      scn = (SipConnectionNotifier) Connector.open("sip:5080");   
      contact = new String("sip:myid:123@"+scn.getLocalAddress()+":"+scn.getLocalPort());   
      scc = (SipClientConnection) Connector.open("sip:111.111.111.1+"transport=tcp")  ; 
      scc.initRequest("REGISTER", scn);  
      scc.setHeader("From", "sip:myid:123@"+scn.getLocalAddress()+":5080");  
      scc.setHeader("To", "sip:myid:123@111.111.111.1");  
      scc.setHeader("Contact", contact);  
      scc.send();  
      boolean handled = false;  
      int scode = 0;        
      while(!handled) 
          SipHeader sh; 
          scc.receive(30000);
          scode = scc.getStatusCode();
          switch(scode)  
              case 401:
                  sh = new SipHeader("WWW-Authenticate",
                     scc.getHeader("WWW-Authenticate"));
                  realm = sh.getParameter("realm");                
                  scc.setCredentials(username, password, realm);
                  break;

              case 407:
                  sh = new SipHeader("Proxy-Authenticate", 
                  scc.getHeader("Proxy-Authenticate"));
                  realm = sh.getParameter("realm");                
                  scc.setCredentials(username, password, realm);
                  break;

              case 200: 
                  handled = true;
                  break;
              default:  
                handled = true;
            
      
      scc.close();
   catch(Exception ex) 
      // handle Exceptions
  
 

我收到了180 Rigging 消息的回复。也让我知道这里的 realm 是什么。 scc.setCredentials(username, password, realm);

【问题讨论】:

仅供参考:SIP 和 RTSP 是两种不同的会话信令协议。 SDP 与发送请求无关:它以基于文本的格式描述媒体会话。 RTSP 和 SIP 可以使用 SDP 来建立会话。我建议阅读 IETF RFC 以更好地理解协议。 (RTP:RFC3550,SDP:RFC4566,RTSP:RFC2326,SIP:RFC3261) 谢谢拉尔夫。我对这些东西还是陌生的。我会看看你的建议。您能否让我知道一台服务器是否可以同时处理 SIP 和 RTSP,并发送响应。(这意味着如果服务器有音频文件,服务器可以根据请求发送 RTSP 或 SIP 中的音频文件吗?)。另一件事是,SDP 是否总是与 SIP 和 RTSP 一起描述会话/请求或响应内容? SIP 和 RTSP 在不同的端口上运行并且是完全不同的协议,我会说服务器不太可能同时支持两者,RTSP 通常用于基于文件的 VOD 媒体以及实时流媒体(它被描述为具有播放、停止、暂停功能的虚拟 VCR 遥控器),而 SIP 通常用于电话会议、会话场景。尽管存在其他标准化工作,但通常 SDP 是描述媒体会话的广泛使用的协议。 SDP 通常是 RTSP DESCRIBE 的答案,是 SIP 提议/答案交换中的特征。 非常感谢拉尔夫。我有个主意。如果我不妨碍你的话,你能否让我了解更多关于 SDP 和 RTSP 如何与示例函数一起工作的信息。(我有一个清晰的图片从您的解释中了解 SIP 和 RTSP,并再次感谢) 【参考方案1】:

正如您在示例 1 中看到的 here - 您意识到,当您向服务器发出新的请求时,由于服务器期望进行身份验证,它首先发送 401。通过看到这一点,客户端可以搜索密码或询问用户。当服务器发送 401 响应代码时,它指定哪个 安全域 适用于给定请求。这已经是您的代码中的内容了:

realm = sh.getParameter("realm"); 

一旦失败,您需要在此处使用凭据再次send() 请求。我猜setCredentials() 函数只是在scc 对象内设置这些参数,当再次调用send() 时它们将被应用。

一些可能感兴趣的参考资料:http://www.developer.nokia.com/Community/Discussion/showthread.php?126760-SIP-registration-401-Unauthorized-.. (这里人们遇到了与端口号相关的问题,我不确定这是否困扰您)

【讨论】:

非常感谢Dipan。我已经参考了你的第一个链接。我也看了你的第二个链接。【参考方案2】:

许多功能和更多东西可用,可以找到广泛的答案here 此外诺基亚 JSR180 API 也有示例代码

【讨论】:

以上是关于通过 SIP 连接的 J2ME 音频流的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 J2ME 中的扬声器播放音频

在 CDC 设备 j2me 上播放音频

如何在 J2ME 中播放带音频的视频

J2ME/Blackberry - 获取音频信号幅度级别?

在 iPhone 上拆分音频单元流

在 J2me 中录制音频时出现异常