Однократный вызов read () в AudioRecord не гарантирует заполнение всего короткого [].Вы должны проверить возвращаемое «shortsRead» для фактического короткого чтения и продолжать вызывать read (), пока не будет заполнено short [].Пример кода приведен ниже.
private void readFully(short[] data, int off, int length) {
int read;
while (length > 0) {
read = mRec.read(data, off, length);
length -= read;
off += read;
}
}
В вашем цикле записи
while (!released) {
// fill the pktBuf
short[] pktBuf = new short[pktSize];
readFully(pktBuf, 0, pktSize);
// Do something
}
Таким образом, каждый раз, когда вызывается метод read (), мы увеличиваем смещение на «read» иуменьшите оставшуюся длину на «чтение», продолжайте чтение, пока оставшаяся длина не достигнет 0. Затем вы получите заполненный короткий [] с записанными аудиоданными.
Аналогично, когда вы записываете данные в AudioTrack, вынужно сделать то же самое, что и writeFully (), чтобы гарантировать, что весь короткий [] будет записан в AudioTrack.
Надеюсь, это поможет.