音频问题

时间:2011-07-14 21:47:31

标签: android sql-server web-services audio-recording

在我的Android应用程序中,我可以录制音频并将其保存在手机/ sdk上。当我在手机上播放它时,我检查它是否可听见且清晰。它创建的音频文件的大小是5.9kb(.amr格式)。 接下来我将文件上传到服务器,它将音频存储在sql db上。上传成功。当播放上传的音频时,它都是乱码......

在数据库中,我将音频存储在数据类型为image的列中,长度为16。

我的问题是......为什么上传后噪音会出现乱码。如何在没有添加任何噪音的情况下验证音频是否正确保存。

  

文件上传代码

InputStream = new DataInputStream(new FileInputStream( FileName));
            byte[] responseData = new byte[10000];   
            int length = 0;   
            StringBuffer rawResponse = new StringBuffer();   
            while (-1 != (length = InputStream.read(responseData)))
                rawResponse.append(new String(responseData, 0, length));   
            String finalstring = rawResponse.toString();
voicedataArray = finalstring.getBytes();

1 个答案:

答案 0 :(得分:2)

您的问题很可能是由于使用StringBuffer来缓冲响应。 Java中的字符是对应于Unicode字符点的双字节实体。 String#getBytes()的文档说:

  

返回包含此字符串字符的新字节数组   使用系统的默认字符集进行编码。

因此,无法保证您传入的字节数,转换为字符数,然后返回字节数与您首先传递的流相同。

我认为您需要使用动态扩展的字节缓冲区代替StringBuffer来编写解决方案。

另外,关于StringBuffer的使用的两个注释:

1)对StringBuffer的所有访问都是同步的,因此您需要支付性能损失。 StringBuilder是一个现代的替代品,它不会在引擎盖下进行同步。

2)每次附加到StringBuffer:

rawResponse.append(new String(responseData, 0, length));

您正在分配一个新字符串并将其丢弃。这对垃圾收集器来说真的很辱骂。 StringBuffer实际上有一个append()形式,它将直接获取一个char数组,因此不需要使用中间String。 (但你可能不想在第一时间使用StringBuffer。)