2

Mu-law (G.711) コーデック wav ファイルを SIP 電話のネットワーク経由でバイナリ データとして送信するのに苦労しており、その 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;

     }
4

1 に答える 1

1

リクエストは単純なものだと思うかもしれませんが、すぐにわかるように、不足しているプロトコルの「接着剤」がたくさんあります。

何が欠けていますか?欠落しているSIPハンドシェイク プロトコルと、データのRTPストリーミング情報を指定する欠落しているSDPがあります (上記で大まかに開始した部分です)。これらのプロトコル メッセージはすべて、お使いの携帯電話で解釈されるように正しくフォーマットされています。参考までに、RTP ヘッダー構造を次に示します。. SIP/SDP メッセージは、SIP トラフィックの外部で発生するポート番号やコーデックの選択など、RTP エンドポイントに関する情報を確立します。RTP フォーマットには、メディア データを、通常はメディア ストリームの小さなバイナリ ペイロード (つまり、WAV ファイルからの生データ) に加えて、ヘッダー (シーケンス番号を示す) を持つシーケンス化されたパケットに分割することも含まれます。

私が推奨するのは、 wiresharkのようなパケット スニファ ツールを使用して、ソフトフォンのパケット情報を調べることです。または、既存の SIP 電話をハブに接続して、SIP、SDP、および RTP トラフィックを監視することもお勧めします。これにより、関連する形式とやり取りされるメッセージについての洞察が得られます。また、アスタリスクのようなオープンソースの PBXを構成して、ソフトフォンのネットワークを構成することもできます (1 つまたは 2 つのソフトフォンのネットワークで十分です)。

SIP/SDP の面倒な作業のほとんどをスキップできるSIP プロジェクトの codeplex を確認することをお勧めします。これらのいずれかを具体的に推奨することはできませんが、約 5 年前に構成したアスタリスク サーバーと対話するためにSIP.NETを使用することができました。このハードルがあなたの熱意を失わないことを願っていますが、SIP 電話で再生される wav ファイルを聞く前に、かなりの時間が必要です。

于 2012-03-27T04:00:36.930 に答える