преобразование массива с плавающей точкой [] в байты для AudioTrack - PullRequest
2 голосов
/ 31 мая 2019

Я использую AudioTrack для воспроизведения через некоторые значения с плавающей точкой.

код:

float[] audio_payload = getFloatValues();
final int length = audio_payload.length;

int PLAYER_MODE = AudioTrack.MODE_STREAM;
int PLAYER_STREAM_TYPE = AudioManager.STREAM_MUSIC;
int PLAYER_FORMAT = AudioFormat.ENCODING_PCM_FLOAT;
int PLAYER_CONF = AudioFormat.CHANNEL_OUT_MONO;

int PLAYER_SR = 44100;
AudioTrack track = new AudioTrack(PLAYER_STREAM_TYPE, PLAYER_SR, PLAYER_CONF, PLAYER_FORMAT, audio_payload.length*4, PLAYER_MODE);
track.write(audio_payload, 0, length, AudioTrack.WRITE_NON_BLOCKING);
track.play();

Моя проблема в Android версии 20 или ниже функции, track.write(float[], offset, lenghtInBytes, writeMode); не поддерживается. Документы для разработчиков Android

Как я могу преобразовать мои значения с плавающей точкой в ​​короткий или байтовый массив для воспроизведения, так как они поддерживаются в Android API уровня 3 или выше?

Я попытался преобразовать массив с плавающей точкой в ​​короткий массив, но он не сработал. После преобразования мой исходный звук был изменен. То же случилось, когда я попытался преобразовать массив с плавающей точкой в ​​байтовый массив.

В проекте, над которым я работаю, есть native-lib, поэтому было бы полезно любое преобразование между flooat в short или float в byte в C или Java.

Шорты с плавающим кодом, который я использовал:

public static short floatToShort(float x) {
    if (x < Short.MIN_VALUE) {
        return Short.MIN_VALUE;
    }
    if (x > Short.MAX_VALUE) {
        return Short.MAX_VALUE;
    }
    return (short) Math.round(x);
}

с плавающей запятой в байтах:

public static byte[] convertToByteArray(float value) {
      byte[] bytes = new byte[4];
      ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
      buffer.putFloat(value);
      return buffer.array();

  }

После преобразования звукозаписывающее устройство не воспроизводило звук, и я не увидел никакой ошибки

Обновление Также пробовал

private short [] floatArrayToShortArray(float [] array) {
    short [] payload = new short[array.length];
    for (int i=0; i<array.length; i++) {
        payload[i] = (short) ((short) array[i] * 32767);
    }
    return payload;

}

Но audioTrack не может воспроизводиться.

...