Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Am I doing this correctly?

enter image description here



Before I ask for help, let me tell you what I did: Assuming I have a sampling rate of 8000Hz and sample size of 16 bits (2 bytes), at the end of the second I need 16000 byte or 8000 short.
Now I have a 10fps recording speed then for each fps I need 16000/10 = 1600 byte.
So, here is how the story proceeds:

Variables Declared:

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

Looping and subsequent conversion of byte[] to 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++;
    }  

Issues

  • Even though buffer.position() returns 16000 in the if statement, I get a BufferUnderflowException when I do buffer.asShortBuffer.get(audioSamples);

  • I used java.util.Arrays.toString() to see what my eachPassand audioSamples contains, I got some numbers like -107, 0, 32, etc in eachPass and all zeroes in audioSamples. Why?
  • veterans, will you please help me nail this code? I have no clue what's going on.

    like image 568
    An SO User Avatar asked Dec 26 '12 19:12

    An SO User


    1 Answers

    You are forgetting to flip the buffer before reading the data, this is why nothing in being written into audioSamples.

    buffer.flip();
    buffer.asShortBuffer.get(audioSamples);
    
    like image 82
    Anthony Accioly Avatar answered Nov 12 '22 15:11

    Anthony Accioly