Уменьшить звук с 16-битной PCM до 8-битной в Android - PullRequest
3 голосов
/ 01 марта 2010

Я хотел бы уменьшить частоту дискретизации 16 бит / см до 8 бит, а затем увеличить частоту с 8 бит до 16 бит в Android. Я использую это, который, кажется, работает:

int tempint;
for (int i=1, j=0; i<tempBuffer.length; i+=2, j++)
{
    tempint = ((int) tempBuffer[i]) ^ 0x00000080;
    tempBuffer[j] = (byte) tempint; 
    Log.e("test","------------* COUNTER -> "+j+" BUFFER VALUE -> "+tempBuffer[j]+"*-----------");
} 

где tempbuffer - это короткий [], а tempint - это int. Может кто-нибудь сказать мне, если это работает нормально, потому что я начинающий, также я использую это, чтобы преобразовать байт [] обратно в короткий []

for (int x=1, j=0; x<music.length; x+=2, j++)
{
    tempint = ((int) music[x])& 0xFF;
    music[j] = tempint.shortValue();
    Log.e("maxsap","------------*"+ music[j]+"*-----------");
}

который я не уверен, что он работает.

1 Ответ

5 голосов
/ 01 марта 2010

Предполагая, что 8-битное и 16-битное аудио подписаны PCM:

16 бит до 8 бит:

sample_8 = sample_16 >> 8;

8 бит до 16 бит:

sample_16 = sample_8 << 8;

Однако если 8-разрядный PCM является "двоичным смещением" (формат без знака с неявным смещением), тогда преобразования будут:

16 бит до 8 бит:

sample_8 = (sample_16 >> 8) + 128;

8 бит до 16 бит:

sample_16 = (sample_8 - 128) << 8;

В идеале вы должны добавить дизеринг при преобразовании из 8 битов в 16 бит, но вы не сможете позволить себе вычислительные затраты на это.

Обратите внимание, что термины «повышающая дискретизация» и «понижающая выборка» обычно относятся к изменению частоты дискретизации. То, что вы делаете здесь, это не повторная повторная выборка, а изменение глубины цвета или повторное квантование данных.

...