Android 在固定时间内使用麦克风记录数据

Android 在固定时间内使用麦克风记录数据,android,audio,microphone,recording,Android,Audio,Microphone,Recording,我想知道是否有一种方法可以确定使用mobile的麦克风录制的持续时间。比如当我点击一个按钮时,录音应该开始,5秒钟后应该停止,你建议我使用什么方法:-) 编辑: 很抱歉造成混淆,但我正在使用AudioRecorder类来记录数据,我认为MediaRecorder类函数在这方面不能正常工作。使用MediaRecorder类中的setMaxDuration 交替地 当您开始录制时,启动一个新线程并将其休眠5秒钟。当它醒来时,停止录音。 或使用定时器任务,该任务应在5秒延迟后调用停止记录。 或者使用M

我想知道是否有一种方法可以确定使用mobile的麦克风录制的持续时间。比如当我点击一个按钮时,录音应该开始,5秒钟后应该停止,你建议我使用什么方法:-)

编辑:


很抱歉造成混淆,但我正在使用AudioRecorder类来记录数据,我认为MediaRecorder类函数在这方面不能正常工作。

使用MediaRecorder类中的
setMaxDuration

交替地

当您开始录制时,启动一个新线程并将其休眠5秒钟。当它醒来时,停止录音。 或使用定时器任务,该任务应在5秒延迟后调用停止记录。
或者使用MediaRecorder类中的
setMaxDuration

交替地

当您开始录制时,启动一个新线程并将其休眠5秒钟。当它醒来时,停止录音。 或使用定时器任务,该任务应在5秒延迟后调用停止记录。
或者这就是你所需要的

@Override
    public void onClick(View view)
    {
        if (view.getId() == R.id.Record)
        {
            new Timer().schedule(new TimerTask()
            {

                @Override
                public void run()
                {
                    runOnUiThread(new Runnable()
                    {

                        @Override
                        public void run()
                        {
                            mediaRecorder.stop();
                            mediaRecorder.reset();
                            mediaRecorder.release();
                            files.setEnabled(true);
                            record.setEnabled(true);
                            stop.setEnabled(false);

                        }
                    });

                }
            }, 5000);

            record.setEnabled(false);
            files.setEnabled(false);
            stop.setEnabled(true);
            try
            {
                File file = new File(Environment.getExternalStorageDirectory(),
                        "" + new Random().nextInt(50) + ".3gp");
                adapter.add(file.getAbsolutePath());
                adapter.notifyDataSetChanged();
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder
                        .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder
                        .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setOutputFile(file.getAbsolutePath());
                mediaRecorder.prepare();
                mediaRecorder.start();
                stop.setEnabled(true);
            } catch (IllegalStateException e)
            {
                e.printStackTrace();
            } catch (IOException e)
            {
                e.printStackTrace();
            }

        }

这就是你所需要的

@Override
    public void onClick(View view)
    {
        if (view.getId() == R.id.Record)
        {
            new Timer().schedule(new TimerTask()
            {

                @Override
                public void run()
                {
                    runOnUiThread(new Runnable()
                    {

                        @Override
                        public void run()
                        {
                            mediaRecorder.stop();
                            mediaRecorder.reset();
                            mediaRecorder.release();
                            files.setEnabled(true);
                            record.setEnabled(true);
                            stop.setEnabled(false);

                        }
                    });

                }
            }, 5000);

            record.setEnabled(false);
            files.setEnabled(false);
            stop.setEnabled(true);
            try
            {
                File file = new File(Environment.getExternalStorageDirectory(),
                        "" + new Random().nextInt(50) + ".3gp");
                adapter.add(file.getAbsolutePath());
                adapter.notifyDataSetChanged();
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder
                        .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder
                        .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setOutputFile(file.getAbsolutePath());
                mediaRecorder.prepare();
                mediaRecorder.start();
                stop.setEnabled(true);
            } catch (IllegalStateException e)
            {
                e.printStackTrace();
            } catch (IOException e)
            {
                e.printStackTrace();
            }

        }

如果你只是使用一个计时器,我不认为你可以准确地控制有多少数据是在缓冲区时,你的应用程序读取它

我认为他们记录5秒钟音频数据的方法是使用

那里的代码小心地设置音频缓冲区的大小,以便它在记录数据一段时间后会回调。这是那个班的剪报

public boolean startRecordingForTime(int millisecondsPerAudioClip,
            int sampleRate, int encoding)
    {
        float percentOfASecond = (float) millisecondsPerAudioClip / 1000.0f;
        int numSamplesRequired = (int) ((float) sampleRate * percentOfASecond);
        int bufferSize =
                determineCalculatedBufferSize(sampleRate, encoding,
                        numSamplesRequired);

        return doRecording(sampleRate, encoding, bufferSize,
                numSamplesRequired, DEFAULT_BUFFER_INCREASE_FACTOR);
    }
随后,您的代码将执行以下操作:

while (continueRecording)
        {
            int bufferResult = recorder.read(readBuffer, 0, readBufferSize);
//do stuff
        }

由于readBufferSize恰到好处,您将获得所需的数据量(略有变化)

如果您只使用计时器,我认为您无法在应用程序读取数据时准确控制缓冲区内的数据量

我认为他们记录5秒钟音频数据的方法是使用

那里的代码小心地设置音频缓冲区的大小,以便它在记录数据一段时间后会回调。这是那个班的剪报

public boolean startRecordingForTime(int millisecondsPerAudioClip,
            int sampleRate, int encoding)
    {
        float percentOfASecond = (float) millisecondsPerAudioClip / 1000.0f;
        int numSamplesRequired = (int) ((float) sampleRate * percentOfASecond);
        int bufferSize =
                determineCalculatedBufferSize(sampleRate, encoding,
                        numSamplesRequired);

        return doRecording(sampleRate, encoding, bufferSize,
                numSamplesRequired, DEFAULT_BUFFER_INCREASE_FACTOR);
    }
随后,您的代码将执行以下操作:

while (continueRecording)
        {
            int bufferResult = recorder.read(readBuffer, 0, readBufferSize);
//do stuff
        }

由于readBufferSize正好合适,您将获得所需的数据量(略有变化)

非常棒的答案。。。谢谢,我相信这些信息会有很大的帮助:-)真棒的答案。。。谢谢,我相信这些信息会有很大帮助:-)