0

モバイルのマイクを使用して録音時間を修正する方法があれば教えてください。ボタンをクリックすると、録音が​​開始され、5秒後に自動的に停止するように、どのような方法を使用することを提案しますか:-)

編集:

混乱して申し訳ありませんが、AudioRecorder クラスを使用してデータを記録していますが、MediaRecorder クラス関数が同じように (/まったく) 適切に機能するとは思いません。

4

3 に答える 3

2

タイマーを使用するだけでは、アプリがバッファを読み取るときにバッファ内のデータ量を正確に制御できるとは思いません。

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 がちょうどいいので、必要な量のデータが得られます (わずかな変動があります)。

于 2012-06-07T13:18:23.043 に答える
1

これがあなたが必要とするすべてです。

@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();
            }

        }
于 2012-06-07T12:07:54.823 に答える
0

setMaxDurationMediaRecorder クラスから使用します。

交互に

記録を開始したら、新しいスレッドを開始し、5 秒間スリープ状態にします。目が覚めたら録音を停止します。または、5 秒の遅延後に記録停止を呼び出すタイマータスクを使用します。また

于 2012-06-07T11:41:02.210 に答える