高水平:
我以两种不同的方式使用相同的编码器。
方法#1:录制原始音频并保存到整个文件,然后在全部完成后压缩文件。结果完美的音频
方式#2:记录原始音频,逐帧编码。结果有声跳音
为什么方式#2会导致跳过?
低级
方式#1的代码(写入FileOutputStream fos,并在所有写入完成后压缩)
public void writeSample(short[] buf) throws IOException {
byte[] byteArray = Util.toByteArray(buf,false);
bytesWritten += byteArray.length;
fos.write(byteArray);
}
方式#2的代码
public void writeSample(short[] buf) throws IOException {
byte[] byteArray = Util.toByteArray(buf,false);
bytesWritten += byteArray.length;
encoder.encode(byteArray);
}
几乎完美:方法#2 中短缓冲区的长度为 15360。由于这是一个奇数大小,我采用了这种技术:但仍然有轻微的可听跳过:
ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
byte[] readme = new byte[4096];
int count = bais.read(readme);
while ( count != -1 ) {
System.out.println("READING :"+count+ " bytes");
if(bais.available() < 4096) {
System.out.println ("LESS THAN 4096 available: "+bais.available());
byte[] remain = new byte[bais.available()];
bais.read(remain);
aacEncoder.encode(remain);
break;
}
aacEncoder.encode(readme);
count = bais.read(readme);
}