2011-09-04 50 views
1

我试图找到一种方法来在java中使用jack-audio。我已经设法创建基于jnajack的包装来从jacks的端口获取音频到java应用程序(最初的jnajack不能用1.9.8的插孔工作),但是我找不到操作数据的方法。我刚刚开始List<FloatBuffer>,为了进一步处理数据,我需要将它转换为byte[]从floatbuffer转换为byte []

说得很简单...首先我想将数据保存到一个文件中,但是我听说java的声音只能保存来自TargetDataLine和/或byte[]的数据。我怎样才能将FloatBuffer转换为byte[]?我能找到的唯一方法是floatbuffer.get(float[]),并以某种方式(不知道如何)将float[]转换为byte[]

+0

'floatbuffer'类的确切名称是什么? – bmargulies

回答

1

因此,jnajack使用不同于标准java声音API函数的音频数据表示。

我没有看到它在jnajack的规格,但我想它代表的音频作为之间浮动-1和1

我不是太熟悉的Java API的声音,但我能想象它使用字节范围-128到127之间

换句话说,你必须乘以128

两者之间的转换我想说的整洁的方式做这将是byte converted = Float.valueOf(original * 128).byteValue()。如果需要的话,可能只用基元来做到这一点,这应该更快。

+0

它不是jnajack使用不同的音频数据表示! jnajack(就像jjack一样)只是杰克音频工具的JNA/JNI。问题。 –

+0

'Float.valueOf(original * 128).byteValue()'与'(byte)(original * 128)'完全相同。但是,值“1.0”将换行为“-128”。 –

4

如何将FloatBuffer转换为byte[]

FloatBuffer floatbuffer; 

ByteBuffer byteBuffer = ByteBuffer.allocate(floatbuffer.capacity() * 4); 
byteBuffer.asFloatBuffer().put(floatbuffer); 
byte[] bytearray = byteBuffer.array(); 

您可能需要改变byte order