我正在努力通过网络在 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;
}
最佳答案
您可能希望您的请求很简单,但正如您即将发现的那样,您缺少一堆协议(protocol)“胶水”。
你错过了什么?有 SIP handshaking protocol你失踪了,还有SDP你错过了指定 RTP数据的流信息(您在上面有一个粗略的开始的部分。)所有这些协议(protocol)消息都必须正确格式化才能被您的手机解释:引用这里的 RTP header structure . SIP/SDP 消息建立有关 RTP 端点的信息,包括发生在 SIP 流量之外的端口号和编解码器选择。 RTP 格式还包括将媒体数据分解成序列数据包,这些数据包除了媒体流的通常较小的二进制有效负载(即来自 WAV 文件的原始数据)之外,还具有 header (指示序列号)。
我的建议是选择像wireshark 这样的数据包嗅探器工具。 , 查看一个softphone的包信息- 或 - 将现有的 SIP 电话连接到一个集线器,您可以在其中观察 SIP、SDP 和 RTP 流量。这将提供对格式和所涉及的来回消息传递的一些见解。您也可以尝试配置开源 PBX,例如 asterisk这样您就可以配置一个软电话网络(您可以使用一个或两个软电话网络)。
我建议检查 codeplex for SIP projects这将使您跳过大部分 SIP/SDP 苦差事。虽然我不能具体推荐其中任何一个,但我确实设法使用了 SIP.NET与我大约 5 年前配置的星号服务器进行交互 - 主要是作为我曾经工作过的公司的概念证明。我希望这个障碍不会削弱您的热情,但在您听到通过 SIP 电话播放的 wav 文件之前,您还有很长的路要走。
关于c# - 如何在网络SIP电话上发送mu-law (G.711) codec wav文件并在那里播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9882891/