Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于AudioTrack的浮点[]到字节数组转换_Java_Android_Audiotrack - Fatal编程技术网

Java 用于AudioTrack的浮点[]到字节数组转换

Java 用于AudioTrack的浮点[]到字节数组转换,java,android,audiotrack,Java,Android,Audiotrack,我使用AudioTrack播放一些浮点值 代码: 我的问题是android版本20或更低版本的函数,track.write(float[],offset,lenghtInBytes,writeMode)不受支持。 我如何将我的浮点值转换为短或字节数组来播放,因为Android API 3级或更高级别支持它们 我试着将我的浮点数组转换成短数组,但没有成功,转换后我的原始音频被改变了。当我尝试将浮点转换为字节数组时,也发生了同样的情况 我正在处理的项目有本机lib,所以在C或Java中,flooa

我使用AudioTrack播放一些浮点值

代码:

我的问题是android版本20或更低版本的函数,
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()
}