TCP客户端接收服务器发送的音频流。什么数据结构用于临时存储音频数据?

时间:2019-06-19 07:37:23

标签: c# audio-streaming audio-player real-time-data

我有一个智能扬声器设备和一台PC。他们建立一个TCP连接。智能扬声器设备会保持记录并实时将音频数据发送到PC。我现在希望PC将接收到的音频数据存储在缓冲区中。同时,播放缓冲区中的音频。 现在,您可能已经知道PC端的数据流。 3个对象,接收从设备端发送的音频流A,音频存储缓冲区B,音频播放区域C。

A需要继续将数据写入B, C需要不断读取B中的数据,

我现在的问题是:我要为该缓冲区(即B)使用哪种数据结构? 我最初想使用c#queue.look流动的代码。 (https://codereview.stackexchange.com/questions/33142/producer-consumer-in-c) 但是,我有点担心。因为音频数据量相对较大,所以每个写入B和读取B的字节数很大。大约4KB,_myQueue.Dequeue_myQueue.Enqueue一次只能进入和退出一个字节。要完成4KB的读写操作,您需要经常调用上述2种方法。我的意思是,有没有一种方法可以批量写入队列中的元素并读取队列中的元素?所以我想问一下是否有更好的设计方法来实现音频存储缓冲区B。

private int _count = 1000;
private Queue<byte> _myQueue = new Queue<byte>();
private static object _door = new object();

public void AddItem(byte someItem)
{
    lock (_door)
    {
        while (_myQueue.Count == _count)
        {
            Monitor.Wait(_door);
        }

        _myQueue.Enqueue(someItem);
        Monitor.Pulse(_door);
    }
}

public byte RemoveItem()
{
    byte item;
    lock (_door)
    {
        while (_myQueue.Count == 0)
        {
            Monitor.Wait(_door);
        }

        item = _myQueue.Dequeue();
        Monitor.Pulse(_door);
     }

    return item;
}

0 个答案:

没有答案