Правильно ли я делаю это?

enter image description here



Прежде чем я попрошу о помощи, позвольте мне рассказать вам, что я сделал: Предполагая, что у меня есть частота дискретизации 8000 Гц и размер выборки 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

Циклическое и последующее преобразование байта [] в короткий []

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() возвращает 16000 в инструкции if, я получаю BufferUnderflowException, когда я делаю buffer.asShortBuffer.get(audioSamples);
Я использовал java.util.Arrays.toString(), чтобы увидеть, что содержит мои eachPass и audioSamples, я получил некоторые цифры, такие как -107, 0, 32 и т.д. в eachPass и все ноль в аудио-образцах. Зачем?

ветераны, не могли бы вы помочь мне прибить этот код? Я понятия не имею, что происходит.

Ответ 1

Вы забываете flip буфер перед чтением данных, поэтому ничего не записывается в audioSamples.

buffer.flip();
buffer.asShortBuffer.get(audioSamples);