【发布时间】:2019-05-31 09:12:34
【问题描述】:
我正在使用 AudioTrack 播放一些浮点值。
代码:
float[] audio_payload = getFloatValues();
final int length = audio_payload.length;
int PLAYER_MODE = AudioTrack.MODE_STREAM;
int PLAYER_STREAM_TYPE = AudioManager.STREAM_MUSIC;
int PLAYER_FORMAT = AudioFormat.ENCODING_PCM_FLOAT;
int PLAYER_CONF = AudioFormat.CHANNEL_OUT_MONO;
int PLAYER_SR = 44100;
AudioTrack track = new AudioTrack(PLAYER_STREAM_TYPE, PLAYER_SR, PLAYER_CONF, PLAYER_FORMAT, audio_payload.length*4, PLAYER_MODE);
track.write(audio_payload, 0, length, AudioTrack.WRITE_NON_BLOCKING);
track.play();
我的问题是在android 20 或以下的功能,track.write(float[], offset, lenghtInBytes, writeMode); 不支持。
Android Developer Docs
如何将我的浮点值转换为短数组或字节数组以供播放,因为它们在 Android API 级别 3 或更高版本上受支持?
我尝试将我的浮点数组转换为短数组,但没有成功,转换后我的原始音频被更改。当我尝试将浮点数转换为字节数组时发生了同样的情况。
我正在处理的项目有 native-lib,因此在 C 或 Java 中浮点到短或浮点到字节之间的任何转换都会有所帮助。
我使用的浮动代码的缩写:
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);
}
浮点到字节:
public static byte[] convertToByteArray(float value) {
byte[] bytes = new byte[4];
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
buffer.putFloat(value);
return buffer.array();
}
转换后录音机没有播放音频,我也看不到任何错误
更新 也试过了
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;
}
但 audioTrack 无法播放。
【问题讨论】:
-
也许你可以把this question的代码倒过来? (将
bytes 转换为floats) -
“我尝试将我的浮点数组转换为短数组,但没有成功” 由于您没有向我们展示您的尝试,我们无法知道您做错了什么.
-
好吧,
putFloat方法没有用,因为它按原样存储浮点值而无需任何转换。例如,putFloat(0.5f)将存储四个字节0x3f, 0x00, 0x00, 0x00。您需要做的是遍历每个浮点样本并将它们从它们所在的任何范围(我假设 -1.0..+1.0)转换为 -32768..+32767 范围内的short。跨度> -
谢谢@Michael 任何相关的短代码或示例?
-
编写一个循环,将每个值乘以 32767 并将结果转换为
short。也许有更有效的解决方案,但这应该作为一个起点。
标签: java android audiotrack