我试图建立一个android应用程序,记录pcm音频,并将其导出为wav文件。
它对8bitpcm工作得很好,但是当我切换到16bitpcm时,我得到了白噪声。
我终于发现这是字节数组的尾数,但是现在,在从小尾数转换为大尾数之后,我的音频非常清晰,但是相反!
下面是我如何调用该方法: byte[] inputByteArray = convertLittleEndianToBig(readToByte(input));
然后字节[]被附加到我的.wav头中:
OutputStream os;
os = new FileOutputStream(output);
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream outFile = new DataOutputStream(bos);
// Adding header here...
outFile.write(inputByteArray);
convertlittleendiantobig():
public static byte[] convertLittleEndianToBig(byte[] value) {
final int length = value.length;
byte[] res = new byte[length];
for(int i = 0; i < length; i++) {
res[length - i - 1] = value[i];
}
return res;
}
还有。。。。readtobyte():
public static byte[] readToByte(File file) throws IOException, FileNotFoundException {
if (file.length() < MAX_FILE_SIZE && file.length() != 0L) {
ByteArrayOutputStream ous = null;
InputStream ios = null;
try {
byte[] buffer = new byte[4096];
ous = new ByteArrayOutputStream();
ios = new FileInputStream(file);
int read = 0;
while ((read = ios.read(buffer)) != -1) {
ous.write(buffer, 0, read);
}
} finally {
try {
if (ous != null)
ous.close();
} catch (IOException e) {
}
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return ous.toByteArray();
}
else {
return new byte[0];
}
太奇怪了,音频听起来完全正确,但是向后。
如果我取消对“convertlittleendiantobig()”的调用,我将返回到白噪声静态。
谢谢你的帮助。这是我第一个真正的项目。
1条答案
按热度按时间xkrw2x1b1#
我是个白痴-16比特!=一个字节。
我正在反转字节数组,而我本应该反转一个短数组。
最后我用以下取代了littleendiantobig:
以及write命令:
我会清理的,但那是问题所在。我的音频现在是正确的。