Java 用于AudioTrack的浮点[]到字节数组转换
我使用AudioTrack播放一些浮点值 代码: 我的问题是android版本20或更低版本的函数,Java 用于AudioTrack的浮点[]到字节数组转换,java,android,audiotrack,Java,Android,Audiotrack,我使用AudioTrack播放一些浮点值 代码: 我的问题是android版本20或更低版本的函数,track.write(float[],offset,lenghtInBytes,writeMode)不受支持。 我如何将我的浮点值转换为短或字节数组来播放,因为Android API 3级或更高级别支持它们 我试着将我的浮点数组转换成短数组,但没有成功,转换后我的原始音频被改变了。当我尝试将浮点转换为字节数组时,也发生了同样的情况 我正在处理的项目有本机lib,所以在C或Java中,flooa
track.write(float[],offset,lenghtInBytes,writeMode)代码>不受支持。
我如何将我的浮点值转换为短或字节数组来播放,因为Android API 3级或更高级别支持它们
我试着将我的浮点数组转换成短数组,但没有成功,转换后我的原始音频被改变了。当我尝试将浮点转换为字节数组时,也发生了同样的情况
我正在处理的项目有本机lib,所以在C或Java中,flooat到short或float到byte之间的任何转换都会很有帮助
我使用的浮动代码:
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);
}
转换后,录音机并没有播放音频,我也看不到任何错误
更新
也试过
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;
}
private short[]floatArrayToShortArray(float[]array){
short[]有效负载=新的short[array.length];
对于(int i=0;ii),我能够在这种方法中将Float
转换为PCM16 short:
/**
* Used to convert Float to PCM16 short byte array.
*/
private val convertBuffer = ByteBuffer.allocate(2).apply {
order(ByteOrder.LITTLE_ENDIAN)
}
/**
* Converts Float to PCM16 short byte buffer.
* @param value Float value to convert
* @return PCM16 short byte array from Float value
*/
private fun floatToPcm16(value: Float): ByteArray {
convertBuffer.clear()
convertBuffer.putShort((value * 32768F).toShort())
return convertBuffer.array()
}
也许您可以将代码从?(将字节
s转换为浮点
)“我尝试将浮点数组转换为短数组,但没有成功”由于您没有向我们展示您所做的尝试,我们无法知道您做错了什么。好吧,putFloat
方法没有任何用处,因为它不进行任何转换就按原样存储浮点值。例如,putFloat(0.5f)
将存储四个字节0x3f、0x00、0x00、0x00
。您需要做的是遍历每个浮点样本,并从它们所在的任何范围转换它们(我假设-1.0..+1.0)进入范围为-32768..+32767的short
。谢谢,@Michael任何相关的短代码或示例?编写一个循环,将每个值乘以32767,并将结果转换为short
。也许有更有效的解决方案,但这应该是一个起点。
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;
}
/**
* Used to convert Float to PCM16 short byte array.
*/
private val convertBuffer = ByteBuffer.allocate(2).apply {
order(ByteOrder.LITTLE_ENDIAN)
}
/**
* Converts Float to PCM16 short byte buffer.
* @param value Float value to convert
* @return PCM16 short byte array from Float value
*/
private fun floatToPcm16(value: Float): ByteArray {
convertBuffer.clear()
convertBuffer.putShort((value * 32768F).toShort())
return convertBuffer.array()
}