android中用于缓冲编码音频的数据结构

android中用于缓冲编码音频的数据结构,android,audio,decoding,blockingqueue,Android,Audio,Decoding,Blockingqueue,我有一个TCP客户端,它通过套接字接收音频(编码)数据。我必须将接收到的数据保存在一些缓冲区中,并在解码器逐块请求时提供给解码器。数据以字节[]为单位,数组大小可能会有所不同。我应该使用什么作为缓冲区来保存接收的byte[]块我知道BlockingQueue,但它没有提供添加和检索N个字节大小[]的功能。 Java是否为此提供了任何数据结构,我们可以使用ByteBuffer吗?您的客户是否知道字节数组大小是如何变化的? 一种众所周知的方法(也需要在服务器端进行管理)是使用以下字段将数据封装在数据

我有一个TCP客户端,它通过套接字接收音频(编码)数据。我必须将接收到的数据保存在一些缓冲区中,并在解码器逐块请求时提供给解码器。数据以字节[]为单位,数组大小可能会有所不同。我应该使用什么作为缓冲区来保存接收的byte[]块我知道BlockingQueue,但它没有提供添加和检索N个字节大小[]的功能。


Java是否为此提供了任何数据结构,我们可以使用ByteBuffer吗?

您的客户是否知道字节数组大小是如何变化的? 一种众所周知的方法(也需要在服务器端进行管理)是使用以下字段将数据封装在数据包中:
| TYPE | SIZE | data |
因此,假设客户端有一个开放的套接字连接并实例化一个DataInputStream(
DataInputStream=new DataInputStream(socket.getInputStream())
),客户端可以在线程中读取数据,该线程的
run
方法如下:

@Override
public void run() {
    while(running) {

        int pckType = readPacketType();

        int pckSize = readPacketSize();

        byte[] data = readPacketContent(pckSize);

        // do something with data
        // you can use Semaphore instances in order to maintains a set of permits if needed
    }
}
在哪里

注意,例如,我为TYPE字段分配了1个字节,为SIZE字段分配了4个字节

编辑: 您可以使用BlockingQueue接口的实现,如LinkedBlockingQueue。您可以放置不同大小的字节[],并一致地检索它们(保持顺序和大小)。进行简单检查;)

LinkedBlockingQueue lbq=new LinkedBlockingQueue();
字符串str1=“blabla”;
字符串str2=“blabla”;
试一试{
lbq.put(str1.getBytes());
lbq.put(str2.getBytes());
lbq.put(str1.getBytes());
}捕捉(中断异常e){
e、 printStackTrace();
}
字节[]b=null;
int size=lbq.size();

对于(int i=0;我想我无法正确地表达我的问题。我需要知道一种数据结构,我可以使用它来放置接收到的块(字节[]),直到真正开始解码。一旦解码开始,我想选择这些块(字节[]),并将其提供给解码器。我可以使用BlockingQueue,但如何指定字节[]读/写队列时的大小?抱歉,我误解了这个问题,仍然不明白什么可以满足您的需要,因为我会使用BlockingQueue实例并将字节[](大小不同)作为单个对象提供给它。如果我使用BlockingQueue,我如何通过put(对象)放置不同大小的字节[]数组,以及字节[]的大小是多少将以take(object)的形式返回@bardi
LinkedBlockingQueue lbq=new LinkedBlockingQueue();
String str1=“Blablablabla”;lbq.put(str1.getBytes());byte[]b1=null;b1=lbq.take();System.out.println(b1.length);
是的,我使用BlockingQueue进行了检查。我们可以在队列中放入不同大小的字节[],也可以在退出I.e take(),它以与输入相同的长度n顺序返回字节[]。编辑您的答案,我将接受。谢谢帮助。
private int readPacketType() {
    int result = -1;
    byte[] array = new byte[1];
    try {
        dataInputStream.read(array);
        result = (int)array[0];
    } catch (IOException ex) {
        return -1;
    }
    return result;
}

private int readPacketSize() {
    int result = -1;
    byte[] array = new byte[4];
    try {
        dataInputStream.read(array);
        result = ByteBuffer.wrap(array).getInt();
    } catch (IOException ex) {
        return -1;
    }
    return result;
}

private byte[] readPacketContent(int contentSize) {
    byte[] result = new byte[contentSize];
    try {
        dataInputStream.read(result);
    } catch (IOException ex) {}
    return result;
}
LinkedBlockingQueue<byte[]> lbq = new LinkedBlockingQueue<byte[]>();
String str1 = "blablabla";
String str2 = "blabla";
try {
    lbq.put(str1.getBytes());
    lbq.put(str2.getBytes());
    lbq.put(str1.getBytes());
} catch (InterruptedException e) {
    e.printStackTrace();
}
byte[] b = null;
int size = lbq.size();
for(int i=0; i<size; i++) {
    try {
        b = lbq.take();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(b.length);
}