我很难在SIP电话上通过网络以二进制数据的形式发送µ-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;
}发布于 2012-03-27 12:00:37
您可能认为您的请求很简单,但正如您即将发现的那样,您遗漏了一堆协议“胶水”。
你错过了什么?这里有您缺少的SIP handshaking protocol,以及您缺少的指定数据的RTP流信息的SDP (这部分您在上面有一个大致的开始)。所有这些协议消息都必须正确格式化,才能被您的手机解释:这里是RTP header structure,以供参考。SIP/SDP消息建立有关RTP端点的信息,包括在SIP流量之外发生的端口号和编解码器选择。RTP格式化还包括除了媒体流的通常较小的二进制有效载荷(即,来自WAV文件的原始数据)之外,还将媒体数据分解成具有报头(指示序列号)的有序分组。
我的建议是使用像wireshark这样的包嗅探器工具,检查softphone的包信息,或者将现有的SIP电话挂接到集线器中,在那里您可以观察SDP和RTP流量。这将提供对格式和涉及的来回消息传递的一些见解。您还可以尝试配置一个像asterisk这样的开源PBX,它允许您配置一个软电话网络(只有一个或两个软电话的网络也可以勉强应付)。
我建议你检查一下codeplex for SIP projects,它可以让你跳过大部分的SDP/SDP的苦差事。虽然我不能具体推荐其中的任何一个,但我确实设法使用SIP.NET与我在大约5年前配置的asterisk服务器进行了交互-主要是为了验证我曾经工作过的公司的概念。我希望这个障碍不会降低你的热情,但在你的SIP电话上听到你的wav文件之前,你还有很长的路要走。
https://stackoverflow.com/questions/9882891
复制相似问题