gpt4 book ai didi

android - 实时编码音频会导致听得见的跳音

转载 作者:行者123 更新时间:2023-12-03 02:20:35 24 4
gpt4 key购买 nike

高级别:

我以两种不同的方式使用相同的编码器。

方法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中的短buf的长度为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);
}

最佳答案

这很重要:编码器进行编码时,不一定会花费相同的时间。有时它只是藏一些数据供以后使用,有时它实际上会进行大量的数字运算。它必须等待足够的音频来编码整个MP3“帧”,否则它只会存储数据。

每次需要进行数字运算的新数据调用时,如果所花费的时间长于音频所代表的时间,则可能会出现信号丢失的风险。

解决方案是让记录线程填充缓冲区,让第二个线程执行所有可能减慢速度或花费不可预测的时间的工作。这包括编码和写入文件。

对于缓冲区,如果您的目标是android 2.3或更高版本,则可以使用管道的I / O。从技术上讲,这不是环形缓冲区,因为它会阻塞,但是根据我的经验,它已经足够好了。 (此api在早期版本的android中可用,但您无法设置缓冲区大小。Grrr!)

您可能会发现此链接有助于理解音频IO在概念上的实际工作方式:http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html

关于android - 实时编码音频会导致听得见的跳音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13480064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com