【问题标题】:How to convert byte[] to float[] and back in Java?如何将 byte[] 转换为 float[] 并返回 Java?
【发布时间】:2013-10-19 12:52:04
【问题描述】:

我正在通过 InputStream 从 .wav 文件中读取数据,并且 read() 返回字节。我使用的一个声音处理库,只接受 float[] 来处理。完成后,它给了我一个 float[] 回来。现在我需要再次以字节格式写入 Android 的 AudioTrack。

如何将这些bytes 转换为floats[],然后再转换回byte[]?我搜索了一下,但一切似乎与我的情况有点不同,所有问题似乎都以不同的方式解决......所以我现在有点迷路了。

如果某种库中已经提供了类似的转换,我也很高兴听到这个消息!

谢谢!

【问题讨论】:

标签: java android audio byte audiotrack


【解决方案1】:

您只需要复制这些位。 尝试使用 BlockCopy。

 float[] fArray = new float[] { 1.0f, ..... };
 byte[] bArray= new byte[fArray.Length*4];
 Buffer.BlockCopy(fArray,0,bArray,0,bArray.Length);

*4 是因为每个浮点数是 4 个字节。

【讨论】:

  • 这个在 C 中工作,但 Java 替代方案只支持类型相同的复制。
【解决方案2】:

您可以使用java.nio.ByteBuffer。它有很多有用的方法可以从字节数组中提取不同的类型,并且还可以处理您的大部分问题。

        byte[] data = new byte[36];
        ByteBuffer buffer = ByteBuffer.wrap(data);          
        float second = buffer.getFloat(); //This helps to 
        float x = 0;
        buffer.putFloat(x);

【讨论】:

  • 我试过了,byte[] bytes = {32,-32,60,120}; ByteBuffer bbuf = ByteBuffer.wrap(bytes); while(bbuf.remaining()>0){ System.out.println(bbuf.getFloat()); 但它只返回这个:3.798709E-19...我做错了吗?
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 2018-06-16
  • 1970-01-01
  • 2018-04-05
  • 2013-11-06
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多