Java 将音频从ByteBuffer(从exoplayer)转换为float*(IPLFloat32)并返回进行处理

Java 将音频从ByteBuffer(从exoplayer)转换为float*(IPLFloat32)并返回进行处理,java,c++,audio,audio-streaming,exoplayer,Java,C++,Audio,Audio Streaming,Exoplayer,我正在为ExoPlayer编写一个定制的音频处理器(kotlin/Java),它接收传入的音频数据,将其传递给Steam audio API(C++中),使用iplapplyBinuralEffect对其进行处理,并将其传递回ExoPlayer。当ExoPlayer从queueInput提供的字节缓冲需要转换为Steam期望的float*(IPLfloat32)时,问题就出现了。我如何将一个ByteBuffer转换成一个蒸汽将处理的浮子 ByteBuffer说它是little endian,所以

我正在为ExoPlayer编写一个定制的音频处理器(kotlin/Java),它接收传入的音频数据,将其传递给Steam audio API(C++中),使用
iplapplyBinuralEffect
对其进行处理,并将其传递回ExoPlayer。当ExoPlayer从
queueInput
提供的字节缓冲需要转换为Steam期望的float*(IPLfloat32)时,问题就出现了。我如何将一个ByteBuffer转换成一个蒸汽将处理的浮子

ByteBuffer说它是little endian,所以我转换为big endian,但它仍然返回大量和微小的值


音频缓冲区

(从AudioProcessor子类传递)

public ByteBuffer queueInput(ByteBuffer inputBuffer,ByteBuffer buffer,int位置,int长度){
//inputBuffer.order(字节顺序.BIG_ENDIAN);
FloatBuffer FloatBuffer=inputBuffer.order(ByteOrder.BIG_ENDIAN).asFloatBuffer();
float[]输入=新的float[floatBuffer.limit()];
floatBuffer.get(输入);
//获取渲染输出
float[]convertedArray=queueInput(playerIndex,input,floatBuffer.limit());
buffer=ByteBuffer.allocate(inputBuffer.limit()*2);
FloatBuffer outputFloatBuffer=buffer.asFloatBuffer();
outputFloatBuffer.put(convertedArray);
buffer.rewind();
返回缓冲区;
}
(通过jni)

queueInput(JNIEnv*env、jobject实例、jint playerIndex、jfloatArray字节、jint len){
jfloat*input=env->GetFloatArrayElements(字节,nullptr);
int inputaudio=engine->getOutput(static_cast(playerIndex),input,len,input);
数组结果;
结果=env->NewFloatArray(inputaudio);
env->SetFloatArrayRegion(结果,0,输入音频,输入);
免费(输入);
env->ReleaseFloatArrayElements(字节、输入、JNI_提交);
返回结果;
}
(传递给SteamPlayer)

int-SteamPlayer::getOutput(float*输入,int-len,float*输出){
std::vector outputaudiofName(静态_转换(2*帧大小));
std::向量输出音频;
int numFrames=len/framesize;
IPLAudioBuffer inbuffer{立体声,帧大小,输入};
inbuffer.format.numSpeakers=2;
inbuffer.format.speakerDirections=&indirection;
IPLAudioBuffer EXBUFFER{stereo,framesize,OUTPUTAUDIOFRIME.data()};
exputffer.format.numSpeakers=2;
向外。x=x;
向外。y=y;
向外。z=z;
exputffer.format.speakerDirections=&outDirections;
对于(自动i=0;i
这里是一些传入数据的屏幕截图,就在“convertedArray”行之前


任何帮助都将不胜感激。

为什么要调用
asFloatBuffer()
两次?@user207421只是一个错误。我在帖子里更新了。我还将添加一些显示传入数据的调试信息。为什么要调用
asFloatBuffer()
两次?@user207421只是一个错误。我在帖子里更新了。我还将添加一些显示传入数据的调试信息。