我正在制作一个简单的音频录制应用程序,我希望所有音频文件具有相同的持续时间,这就是为什么我使用延迟后处理程序使stopRecording
在3000毫秒后自动激活后跟随this article的原因。这是我当前要开始记录的代码:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStart: {
AppLog.logString("Start Recording");
startRecording();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
stopRecording();
enableButtons(false);
AppLog.logString("Stop Recording");
Toast.makeText(MainActivity.this, "File name: " + getFilename(),
Toast.LENGTH_SHORT).show();
}
}, 3000);
break;
}
}
}
所有音频文件都存储在内部存储器中,这是我录制的所有音频文件的图片:
我的问题是:所有音频文件(sampletest1.wav-sampletest6.wav)是否都具有相同的持续时间?即使音频文件的大小不同?为什么会这样?
答案 0 :(得分:1)
简单的答案是,使用诸如postDelayed之类的计时器将无法获得预期的精度。您显示的文件长度不同。最长(519 KB)和最短(512 KB)之间的差约为40毫秒。
为什么它们不同?因为正在测量3000毫秒并正在呼叫您的处理程序的处理器也正在做很多其他工作,为操作系统和其他应用程序提供服务。
顺便说一句,考虑到44.1 kHz的采样率和所示的大小,我想样本大小为32位。恰好3秒的音频将具有以下数据大小:
44100 x 4 x 3 = 529,200字节
(忽略WAV标头,通常只有大约44个字节)。这是516.8 KB。