2012-03-27 22 views
2

我努力通過網絡上的mu-law(G.711)編解碼器wav文件作爲二進制數據發送SIP電話,並希望在該SIP電話上播放此wav文件。以下是C#中的代碼。有人可以告訴我我做錯了什麼嗎?如何在網絡SIP電話上發送mu-law(G.711)編解碼器wav文件並在那裏播放

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

您可能會期望您的請求很簡單,但是您即將發現,還有一堆您缺少的協議「膠水」。

你缺少什麼?您缺少的SIP handshaking protocol以及缺少的SDP指定了數據的流信息(上面粗略的開頭部分)。所有這些協議消息必須正確格式化由您的手機進行解讀:此處參考RTP header structure。 SIP/SDP消息建立關於RTP端點的信息,包括在SIP通信之外發生的端口號和編解碼器選擇。 RTP格式化還包括將媒體數據分成排序的數據包,該數據包除了媒體流的普通小二進制有效載荷(即來自WAV文件的原始數據)之外還具有頭部(表示序列號)。

我的建議是拿起wireshark這樣的數據包嗅探器工具,並檢查softphone的數據包信息 - 或 - 將現有SIP電話掛接到一個集線器,您可以在其中觀察SIP,SDP & RTP流量。這將提供一些有關格式和涉及的來回消息的見解。您也可以嘗試配置一個開放源代碼的集團電話,如asterisk,它可讓您配置軟電話網絡(只需一個或兩個軟電話就可以實現)。

我建議您檢查codeplex for SIP projects,它可以讓你跳過大部分的SIP/SDP苦差事。雖然我不能特別推薦其中的任何一個,但我確實設法使用SIP.NET與我大約5年前配置的星號服務器交互 - 主要是作爲我曾經工作的公司的概念證明。我希望這個障礙不會降低你的熱情,但是在你聽到你的SIP電話播放的wav文件之前,你有一個公平的方法。

+0

感謝您的回覆。只是說我能夠通過使用SDP消息的網絡在我的應用程序和SIP電話之間創建通信終點。我沒有添加上面的代碼片段。我可以在SIP電話上回顯我的聲音。唯一的問題是如何通過網絡發送一個wav文件到sip電話。如果您能請讓我知道這一點,我將非常感激。 – vicky 2012-03-27 04:45:01

+0

嘗試在這裏搜索[c#] [rtp],我想你會發現一些類似的問題,其中一些包含一些解釋RTP消息結構的答案。 – devgeezer 2012-03-27 05:08:22

相關問題