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

C# 如何在网络SIP电话上发送mu-law(G.711)编解码器wav文件并在那里播放,c#,rtp,rtmp,sdp,C#,Rtp,Rtmp,Sdp,我正在努力通过SIP电话上的网络将mu-law(G.711)编解码器wav文件作为二进制数据发送,并希望在SIP电话上播放此wav文件。下面是C#中的代码。有人能告诉我我做错了什么吗 private void MediaStreamPump() { String strHostName; m_MediaStreamPumping = true; strHostName = Dns.GetHostName(); IPHos

我正在努力通过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;

     }

您可能认为您的请求很简单,但当您即将发现时,您缺少一堆协议“粘合剂”

你错过了什么?有您缺少的,以及您缺少的,指定数据流信息的(您在上面有一个粗略的开始的部分)。所有这些协议消息必须正确格式化,才能由您的手机解释:供参考。SIP/SDP消息建立有关RTP端点的信息,包括在SIP通信量之外发生的端口号和编解码器选择。RTP格式化还包括将媒体数据分成序列数据包,除了媒体流的通常较小的二进制有效负载(即来自WAV文件的原始数据)之外,这些数据包还具有报头(指示序列号)

我的建议是使用数据包嗅探器工具,比如,检查现有SIP电话的数据包信息,或者将现有SIP电话连接到一个中心,在那里您可以观察SIP、SDP和RTP流量。这将提供有关格式和来回消息传递的一些见解。你也可以试着配置一个开源的PBX,这样你就可以配置一个软电话网络(你只需要一个或两个软电话网络就可以了)


我建议检查一下,这样可以跳过大部分SIP/SDP的苦差事。虽然我不能具体推荐其中任何一个,但我确实设法使用了一个大约5年前配置的asterisk服务器与之交互——主要是作为我曾经工作过的公司的概念证明。我希望这一障碍不会降低您的热情,但在您通过SIP手机播放wav文件之前,您还有很长的路要走。

谢谢您的回复。我可以使用SDP消息通过网络在我的应用程序和SIP电话之间创建一个通信端点。我没有为此添加上面的代码段。我可以在SIP电话上回显我的声音。唯一的问题是如何通过网络向sip电话发送wav文件。如果您能让我知道这一点,我将非常感谢。请尝试在此处搜索[c#][rtp],我想您会发现一系列类似的问题,包括一些详细说明rtp消息结构的答案。