Преобразование аудио из ByteBuffer (из exoplayer) в float * (IPLFloat32) и обратно для обработки - PullRequest
1 голос
/ 28 июня 2019

Я пишу пользовательский AudioProcessor для ExoPlayer (в kotlin / Java), который принимает входящие аудиоданные, передает их в Steam Audio API (в C ++), обрабатывает их с помощью iplApplyBinauralEffect и передает их обратно в ExoPlayer.Проблема возникает, когда ByteBuffer, который предоставляет ExoPlayer из queueInput, необходимо преобразовать в float * (IPLfloat32), который ожидает Steam.Как мне преобразовать ByteBuffer в число с плавающей точкой *, которое будет обрабатывать Steam?

ByteBuffer говорит, что он имеет прямой порядок байтов, поэтому я преобразовал его в большой порядок байтов, но он все еще возвращает массивные и крошечные значения.

Документы для Steam Audio API находятся здесь
, а документы для ExoPlayer здесь

аудиобуфер IPLAudioBuffer isздесь описано

(передано из подкласса AudioProcessor)

    public ByteBuffer queueInput(ByteBuffer inputBuffer, ByteBuffer buffer, int position, int length) {
        //inputBuffer.order(ByteOrder.BIG_ENDIAN);
        FloatBuffer floatBuffer = inputBuffer.order(ByteOrder.BIG_ENDIAN).asFloatBuffer();
        float[] input = new float[floatBuffer.limit()];
        floatBuffer.get(input);
        // get rendered output
        float[] convertedArray = queueInput(playerIndex, input, floatBuffer.limit());
        buffer = ByteBuffer.allocate(inputBuffer.limit() * 2);
        FloatBuffer outputFloatBuffer = buffer.asFloatBuffer();
        outputFloatBuffer.put(convertedArray);
        buffer.rewind();
        return buffer;
    }

(через jni)

    queueInput(JNIEnv *env, jobject instance, jint playerIndex, jfloatArray bytes, jint len) {
    jfloat *input = env->GetFloatArrayElements(bytes, nullptr);
    int inputaudio = engine->getOutput(static_cast<unsigned int>(playerIndex), input, len, input);
    jfloatArray result;
    result = env->NewFloatArray(inputaudio);
    env->SetFloatArrayRegion(result, 0, inputaudio, input);

    free(input);
    env->ReleaseFloatArrayElements(bytes, input, JNI_COMMIT);
    return result;
    }

(передано в SteamPlayer)

    int SteamPlayer::getOutput(float *input, int len, float *output) {
        std::vector<float> outputaudioframe(static_cast<unsigned int>(2 * framesize));
        std::vector<float> outputaudio;

        int numFrames = len / framesize;

        IPLAudioBuffer inbuffer{ stereo, framesize, input };
        inbuffer.format.numSpeakers = 2;
        inbuffer.format.speakerDirections = &inDirections;

        IPLAudioBuffer outbuffer{stereo, framesize, outputaudioframe.data()};
        outbuffer.format.numSpeakers = 2;
        outDirections.x = x;
        outDirections.y = y;
        outDirections.z = z;
        outbuffer.format.speakerDirections = &outDirections;

        for (auto i = 0; i < numFrames; ++i) {
            iplApplyBinauralEffect(effect, renderer, inbuffer, outDirections, IPL_HRTFINTERPOLATION_NEAREST, outbuffer);
            std::copy(std::begin(outputaudioframe), std::end(outputaudioframe), std::back_inserter(outputaudio));
            inbuffer.interleavedBuffer += framesize;
        }
        for (int i = 0; i < outputaudio.size(); ++i) {
            outputaudio[i] *= 32767;
        }
        std::memcpy(output, outputaudio.data(), outputaudio.size());
        return outputaudio.size();

    }

Вот снимок экрана с некоторыми из поступающих данных, непосредственно перед строкой 'convertArray'

Incoming data

Любая помощь будет принята с благодарностью.

...