【问题标题】:how to send mu-law (G.711) codec wav file on a network SIP phone and play there如何在网络 SIP 电话上发送 mu-law (G.711) 编解码器 wav 文件并在那里播放
【发布时间】:2012-04-10 14:12:32
【问题描述】:

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

     }

【问题讨论】:

    标签: c# rtp rtmp sdp


    【解决方案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 文件之前,您确实还有很长的路要走。

    【讨论】:

    • 感谢您的回复。只是说我能够使用 SDP 消息通过网络在我的应用程序和 SIP 电话之间创建一个通信端点。我没有为此添加上面的代码 sn-p。我可以在 SIP 电话上回显我的声音。唯一的问题是如何通过网络将 wav 文件发送到 sip 电话。如果您能告诉我这件事,我将不胜感激。
    • 尝试在此处搜索 [c#][rtp],我想您会发现各种类似问题,其中包括一些包含 RTP 消息结构的答案。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2012-06-04
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多