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

本文关键字:编解码器 wav 文件 播放 在那里 law SIP 网络 电话 mu | 更新日期: 2023-09-27 18:29:03

我很难在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电话上发送mu law(G.711)编解码器wav文件并在那里播放

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

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

我的建议是拿起一个像wireshark这样的数据包嗅探器工具,检查软电话的数据包信息,或者将现有的SIP电话挂到一个集线器中,在那里你可以观察SIP、SDP&RTP流量。这将为所涉及的格式和来回消息传递提供一些见解。你也可以尝试配置一个像星号一样的开源PBX,它可以让你配置一个软电话网络(你可以通过一个或两个软电话的网络)。

我建议检查codeplex中的SIP项目,这样可以跳过大部分SIP/SDP的繁琐工作。虽然我不能具体推荐其中的任何一个,但我确实设法使用SIP.NET与我大约5年前配置的星号服务器进行了交互,这主要是为了证明我曾经工作过的公司的概念。我希望这个障碍不会降低你的热情,但在你听到你的wav文件在SIP电话上播放之前,你还有一段公平的路要走。