在寻求帮助之前,让我告诉您我做了什么:
假设我有8000Hz的采样率和样本大小为16位(2字节),在第二秒结束时,我需要16000字节或8000短。
现在我有了 10fps 记录速度,那么对于每fps,我需要16000/10 = 1600字节。
因此,这是故事的进行方式:
声明的变量:
byte[] eachPass = new byte[1600]; //used to store data from TargetDataLine for each pass
byte[] backingArray = new byte[16000]; //the complete data for one second
ByteBuffer buffer = ByteBuffer.wrap(backingArray); //buffer which stores the complete data
short[] audioSample = new short[16000/2]; //audio samples to be encoded
int passCounter = 0; /* After 10th pass, convert the byte[] to short[]
* using ByteBuffer */
int seconds = 0; // used to store the position of the packet
循环并随后将byte []转换为short []
while(keepCapturing == true){
-- set up the java.awt.Robot and TargetDataLine before entering the loop --
-- use java.awt.Robot to record the screen --
-- do some other stuff, if needed --
fromMic.read(eachPass,0,eachPass.length); // read data from microphone
buffer.put(eachPass); //put it in a bigger buffer
if(passCounter!=0 && passCounter%10==0){ // is it 10th frame?
passCounter = 0; //reset counter
seconds++;
buffer.asShortBuffer.get(audioSamples); //get short[] in BigEndian format
-- encode the audio at position (seconds-1) --
buffer.clear();
}else{
passCounter++;
}
问题
buffer.position()
语句中的if
返回16000,当我执行BufferUnderflowException
buffer.asShortBuffer.get(audioSamples);
java.util.Arrays.toString()
来查看eachPass
和audioSamples
包含的内容,我在eachPass中获得了一些数字,例如-107、0、32等,在audioSamples中获得了全零。为什么? 退伍军人,请您帮助我确定此密码?我不知道发生了什么事。
最佳答案
您在读取数据之前忘记了给flip缓冲区,这就是为什么在audioSamples
中没有写入任何内容的原因。
buffer.flip();
buffer.asShortBuffer.get(audioSamples);