从bgx设备在android上保存16位签名pcm音频文件

ecbunoof  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(177)

我正在开发一个移动应用程序,它应该能够通过蓝牙从设备读取一些音频数据。该设备具有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()

这项任务看起来很简单,但我不知道我做错了什么。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题