Невозможно воспроизвести поток PCM с кодировкой ENCODING_PCM_FLOAT

Я знаю, что есть много вопросов по этой теме. Но у меня проблема с ENCODING_PCM_FLOAT.

У меня есть поток PCM со следующей информацией:

Encoding : 32 bit float
Byte order: Little Endian
Channels : 2 channels ( stereo)
Sample Rate : 48000

И я хочу скормить его AudioTrack. Я использую следующие API:

private final int SAMPLE_RATE = 48000;
private final int CHANNEL_COUNT = AudioFormat.CHANNEL_OUT_STEREO;
private final int ENCODING = AudioFormat.ENCODING_PCM_FLOAT;
...
int bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, CHANNEL_COUNT, ENCODING);    
AudioAttributes audioAttributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_MEDIA)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build();
AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(ENCODING)
    .setSampleRate(SAMPLE_RATE)
    .build();
audioTrack = new AudioTrack(audioAttributes, audioFormat, bufferSize
    , AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE);
audioTrack.play();

И тогда я начинаю слушать из аудиопотока:

    private void startListening() {
        while (true) {
            try {
                byte[] buffer = new byte[8192];

                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                mSocket.receive(packet);

                FloatBuffer floatBuffer = ByteBuffer.wrap(packet.getData()).asFloatBuffer();
                float[] audioFloats = new float[floatBuffer.capacity()];
                floatBuffer.get(audioFloats);

                for (int i = 0; i < audioFloats.length; i++) {
                    audioFloats[i] = audioFloats[i] / 0x8000000;
                }

                audioTrack.write(audioFloats, 0, audioFloats.length, AudioTrack.WRITE_NON_BLOCKING);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Но я вообще не слышу никаких звуков. Я могу воспроизвести массив байтов как PCM_16 (без преобразования его в массив с плавающей запятой), но он содержит так много шума. Поэтому я думаю, что поток ввода не является проблемой.

Если у вас есть какие-либо идеи, пожалуйста, дайте мне знать.

Спасибо за чтение!


person Banana droid    schedule 25.10.2019    source источник


Ответы (1)


for (int i = 0; i < audioFloats.length; i++) {
    audioFloats[i] = audioFloats[i] / 0x8000000;
}

Я был идиотом, блок кода выше не нужен. После удаления звук воспроизводится нормально.

person Banana droid    schedule 25.10.2019