как отправить wav файл кодека mu-law (G.711) на сетевой SIP телефон и играть там - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь отправить wav-файл кодека mu-law (G.711) в виде двоичных данных по сети на SIP-телефон и хочу воспроизвести этот wav-файл на этом SIP-телефоне.Ниже приведен код на 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;

     }

1 Ответ

1 голос
/ 27 марта 2012

Вы можете ожидать, что ваш запрос прост, но, как вы собираетесь выяснить, есть куча протокольных «склеек», которые вам не хватает.

Чего вам не хватает?Есть пропущенный протокол SIP , который вам не хватает, а также пропущенный SDP , который определяет RTP потоковую информацию данных (часть, с которой у вас есть грубое начало выше.) Все эти протокольные сообщения должны быть правильно отформатированы для интерпретации вашим телефоном: для справки вот структура RTP .Сообщения SIP / SDP устанавливают информацию о конечных точках RTP, включая номера портов и выбор кодека, которые происходят вне трафика SIP.Форматирование RTP также включает разбиение мультимедийных данных на последовательные пакеты, которые имеют заголовок (который указывает порядковый номер) в дополнение к обычно небольшой двоичной полезной нагрузке мультимедийного потока (то есть необработанных данных из файла WAV).

Моя рекомендация состоит в том, чтобы подобрать инструмент для анализа пакетов, такой как wireshark , и проверить информацию о пакете программного телефона или подключить существующий SIP-телефон к концентратору, где выможет наблюдать трафик SIP, SDP & RTP.Это обеспечит некоторое понимание форматов и обмена сообщениями.Вы также можете попробовать настроить УАТС с открытым исходным кодом, например asterisk , которая позволит вам настроить сеть программных телефонов (вы можете обойтись сетью из одного или двух программных телефонов).

Я предлагаю проверить codeplex для проектов SIP , который позволит вам пропустить большую часть рутинной работы SIP / SDP.Хотя я не могу порекомендовать какой-либо из них в отдельности, мне удалось использовать SIP.NET для взаимодействия с сервером Asterisk, который я настроил около 5 лет назад - в основном в качестве доказательства концепции для компании, которую я использовалработать на.Я надеюсь, что это препятствие не уменьшит ваш энтузиазм, но у вас есть хороший путь, прежде чем вы услышите, как ваш файл wav воспроизводится на вашем SIP-телефоне.

...