我正在开发一个移动应用程序,它应该能够通过蓝牙从设备读取一些音频数据。该设备具有bgx低能耗蓝牙模块。在制造商的网站上有一个非常完善的bgx框架,我成功地连接了设备并读取了音频数据。
问题是bgxservice以字符串格式向我提供数据,字符串格式是char数组,char在java中是16位无符号的;但是,我想保存在手机上的音频数据是记录在设备上的16位有符号pcm中的。因此,我尝试将char数组转换为短数组,然后写入一个文件。但当我用音频编辑器软件打开生成的文件时,它会显示以下图像:音频数据的img。
正如您在图片上看到的,音频文件似乎只有正值;尽管如此,我还是将其转换为短int,即有符号16位整数。如果我播放的音频文件听起来像是一些旧的,质量不好的记录(我相信麦克风提供了良好的音质,这是用matlab测试。)
下面是我用来将字符串转换为shortarray(java)的代码:
public short[] stringToShortArray(String in){
short[] ret = new short[in.length()];
for (int i = 0; i<in.length(); i++){
ret[i] = (short) in.charAt(i);
}
return ret;
}
我使用以下代码生成原始pcm文件(kotlin):
val fromSB : String = IncomingData.readString() //get raw data
val out = File("int16.pcm")
val output = FileOutputStream(out)
val dos = DataOutputStream(BufferedOutputStream(output))
for (i in TypeCast().stringToShortArray(fromSB)) { //convert string to short array
dos.writeShort(i.toInt()) //the writeShort() function requests Int parameter for some reason
}
dos.close()
这项任务看起来很简单,但我不知道我做错了什么。
暂无答案!
目前还没有任何答案,快来回答吧!