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