Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么使用后期延迟处理程序录制后的音频大小有时不一样_Java_Android_Audio_Audio Recording - Fatal编程技术网

Java 为什么使用后期延迟处理程序录制后的音频大小有时不一样

Java 为什么使用后期延迟处理程序录制后的音频大小有时不一样,java,android,audio,audio-recording,Java,Android,Audio,Audio Recording,我正在制作一个简单的音频录制应用程序,我希望所有音频文件都具有相同的持续时间,这就是为什么我使用post DELATED handler在3000毫秒后使stopRecording自动激活。以下是开始录制的当前代码: @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnStart: { Ap

我正在制作一个简单的音频录制应用程序,我希望所有音频文件都具有相同的持续时间,这就是为什么我使用post DELATED handler在3000毫秒后使
stopRecording
自动激活。以下是开始录制的当前代码:

@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)的持续时间是否相同?即使音频文件的大小不同?为什么会发生这种情况?

简单的答案是,使用postDelayed等计时器无法获得预期的精度。您显示的文件长度不同;最长(519KB)和最短(512kB)之间的差异约为40毫秒

为什么它们不同?因为测量3000毫秒并调用处理程序的处理器也在做很多其他工作,为操作系统和其他应用程序提供服务

顺便说一句,考虑到44.1 kHz的采样率和显示的大小,我猜样本大小是32位。仅3秒的音频数据大小为:

44100 x 4 x 3=529200字节


(忽略WAV头,通常只有大约44字节)。这是516.8 KB。

您将无法准确录制3000毫秒。代码执行需要一些时间,而且在同一系统中总是有其他进程运行,这可能会导致您的进程将代码执行延迟几毫秒。您使用的采样率和样本大小是多少?@Ian samplerate=44100