向PC扬声器播放RTP流

时间:2015-03-26 16:40:23

标签: c# rtp naudio avaya

我正在使用UdpClient通过Avaya DMCC sdk从电话中获取RTP流。我想通过电脑的扬声器播放这个流。经过大量搜索后,我才能找到需要保存到文件然后播放文件的解决方案,但我需要通过扬声器播放流而不保存到文件。我收到它时,我想把音频发送到扬声器。

    public void StartClient()
    {
        // Create new UDP client. The IP end point tells us which IP is sending the data
        client = new UdpClient(port);
        endPoint = new IPEndPoint(System.Net.IPAddress.Any, port);

        selectedCodec = new MuLawChatCodec();
        waveOut = new WaveOut();
        waveProvider = new BufferedWaveProvider(selectedCodec.RecordFormat);
        waveOut.Init(waveProvider);
        waveOut.Play();
        listening = true;
        listenerThread = new Thread(ReceiveCallback);
        listenerThread.Start();

    }

    private void ReceiveCallback()
    {
        // Begin looking for the next packet
        while (listening)
        {
            // Receive packet
            byte[] packet = client.Receive(ref endPoint);

            // Packet header
            int version = GetRTPValue(packet, 0, 1);
            int padding = GetRTPValue(packet, 2, 2);
            int extension = GetRTPValue(packet, 3, 3);
            int csrcCount = GetRTPValue(packet, 4, 7);
            int marker = GetRTPValue(packet, 8, 8);
            int payloadType = GetRTPValue(packet, 9, 15);
            int sequenceNum = GetRTPValue(packet, 16, 31);
            int timestamp = GetRTPValue(packet, 32, 63);
            int ssrcId = GetRTPValue(packet, 64, 95);
            int csrcid = (csrcCount == 0) ? -1 : GetRTPValue(packet, 96, 95 + 32 * (csrcCount));
            int extHeader = (csrcCount == 0) ? -1 : GetRTPValue(packet, 128 + (32 * csrcCount), 127 + (32 * csrcCount));
            int payloadIndex = csrcCount == 0 ? 96 : 128 + 32 * csrcCount;
            int payload = GetRTPValue(packet, payloadIndex, packet.Length);

            byte[] Payload = new byte[packet.Length - payloadIndex];
            Buffer.BlockCopy(packet, payloadIndex, Payload, 0, packet.Length - payloadIndex);
            byte[] decoded = selectedCodec.Decode(Payload, 0, Payload.Length);


        }
    }

    private int GetRTPValue(byte[] packet, int startBit, int endBit)
    {
        int result = 0;

        // Number of bits in value
        int length = endBit - startBit + 1;

        // Values in RTP header are big endian, so need to do these conversions
        for (int i = startBit; i <= endBit; i++)
        {
            int byteIndex = i / 8;
            int bitShift = 7 - (i % 8);
            result += ((packet[byteIndex] >> bitShift) & 1) * (int)Math.Pow(2, length - i + startBit - 1);
        }
        return result;
    }

我现在通过在NAudio的byte[]

中添加仅包含有效负载的BufferedWaveProvider,成功地通过扬声器播放来自通话的音频

1 个答案:

答案 0 :(得分:1)

有一个演示如何播放通过NAudio源代码中包含的网络接收的音频(请参阅NAudioDemo项目中的网络聊天演示)。基本上使用AcmStream解码音频,然后将其放入声卡正在播放的BufferedWaveProvider中。