如何在网络SIP电话上发送mu-law(G.711)编解码器wav文件并在那里播放

时间:2012-03-27 03:13:54

标签: c# rtp rtmp sdp

我正在努力通过SIP电话上的网络将mu-law(G.711)编解码器wav文件作为二进制数据发送,并希望在该SIP电话上播放此wav文件。下面是C#中的代码。谁能告诉我我做错了什么?

private void MediaStreamPump()
    {
        String strHostName;

        m_MediaStreamPumping = true;

        strHostName = Dns.GetHostName();
        IPHostEntry ipEntry = Dns.GetHostByName(strHostName);

        IPEndPoint endPt = new IPEndPoint(ipEntry.AddressList[0], 7078);

        Socket receiveSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);


        receiveSock.Bind(endPt);

        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint senderRemote = (EndPoint)sender;
        IPAddress[] sendToEntry=Dns.GetHostAddresses(m_RemoteEndpointIp);
        IPEndPoint sendToIp=new IPEndPoint(ipEntry.AddressList[0],m_RemoteEndpointPort);
        EndPoint otherEndpoint = (EndPoint)sendToIp;
        receiveSock.ReceiveTimeout = 1000;


        FileStream fileStream = new FileStream("E:\\G711NM.wav", FileMode.Open, FileAccess.Read);

         br = new BinaryReader(fileStream);
         try
            {
             byte[] buf = new byte[512]; 
              int count=1;
             // 32k
             while (true)
             {
               var buf1 = new byte[512];
                count = br.Read(buf1, 0, buf1.Length);
               if (count > 0)
               {

                 receiveSock.ReceiveFrom(buf, SocketFlags.None, ref senderRemote);

                 receiveSock.SendTo(buf1, SocketFlags.None, senderRemote);

                }
                else
                 break;

               }
             }
            catch (Exception ex)
             {
             MessageBox.Show(ex.ToString());
             }

        receiveSock.Close();
        m_MediaStreamPumping = false;

     }

1 个答案:

答案 0 :(得分:1)

您可能希望您的请求很简单,但正如您将要发现的那样,有一堆协议“胶水”,您将丢失。

你错过了什么?您遗失的是SIP handshaking protocol,以及您遗漏的SDP,它指定了RTP数据的流信息(您有一个粗略的开始的部分)以上。)所有这些协议消息都必须正确格式化,以便您的手机解释:这里的参考是RTP header structure。 SIP / SDP消息建立有关RTP端点的信息,包括在SIP流量之外发生的端口号和编解码器选择。 RTP格式化还包括将媒体数据分解为具有标题(表示序列号)的排序数据包以及媒体流的通常较小的二进制有效负载(即来自WAV文件的原始数据)。

我的建议是选择像wireshark这样的数据包嗅探器工具,并检查softphone的数据包信息 - 或者将现有的SIP电话挂钩到集线器,您可以在其中观察SIP ,SDP& RTP流量。这将提供有关格式和所涉及的来回消息传递的一些见解。您还可以尝试配置像asterisk这样的开源PBX,它可以让您配置软电话网络(您可以使用只有一两个软电话的网络)。

我建议您检查codeplex for SIP projects,以便跳过大部分SIP / SDP苦差事。虽然我不能特别推荐其中任何一个,但我确实设法使用SIP.NET与我在5年前配置的星号服务器进行交互 - 主要是作为我曾经工作过的公司的概念证明。我希望这个障碍不会降低你的热情,但是在你听到通过SIP电话播放的wav文件之前,你确实有一个公平的方法。

相关问题