14

MediaPlayerでオーディオを5ミリ秒再生した後にrecordメソッドを呼び出す方法。私はそのようなことを試みましたが、私は知りません、そして私はこれを終わらせるための良い例を見つけられませんでした。

while(mp.isPlaying()){
    if(record=0){
       for(int i=0; i<5millisec; i++){ //how to define 5 millisec or is any better solution
       }
    startRecord();
    record=1;
    }
}
mp.stop();
mp.release();
mp=null;   
4

7 に答える 7

48

5ミリ秒は非常に短い時間であり、オーディオ出力をそのような時間に制限することはできません。遅延関数の実行に使用できますがHandler、スケジュール後5ミリ秒での実行は保証されません。それを行うためのコード:

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
      public void run(){
        startRecord();
        mp.stop();
        mp.release();
   }
}, 5);
于 2013-03-20T11:09:26.840 に答える
7

postDelayedメソッドを使用できます。以下の例では、メソッドを呼び出すために100ミリ後にルーチンを実行します。

new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        barVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
                    }
                }, 
                100);
于 2013-03-20T11:08:56.020 に答える
2

これを試して:

//Auto Start after 2 seconds
        if(ENABLE_AUTO_START) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    // this code will be executed after 2 seconds
                    doThis();
                }
            }, 2000);
        }
于 2017-03-14T08:24:13.860 に答える
1

おそらく、Thread.sleepを使用したいですか?

そのようです:

if(record == 0){
   Thread.sleep(5);
}

毎回の値を割り当てるのではなく==、ステートメントで等しいかどうかをチェックするために使用したことに注意してください。これがあなたが望むものであると思います。if0

スレッドをスリープ状態にすると、指定した期間、スレッドは何も実行しなくなります。これがUIスレッドの場合、その期間中UIを効果的に「フリーズ」するので、適切に使用していることを確認してください。ただし、ループの例forは、これがまさにあなたがやろうとしている種類のことであることを示しています。

于 2013-03-20T11:03:20.447 に答える
0

Thread.sleep(5)を使用してみるか、UIスレッドを使用したくない場合は、タイマー、またはdoInBackground()メソッドで5ミリ秒待機した後にコールバックをトリガーするAsyncTaskを使用できます。

タイマーを使用するためのかなり良い例を次に示します: https ://stackoverflow.com/a/4598737/832008

于 2013-03-20T11:08:24.633 に答える
0

ScheduledExecutorServiceを使用することもできます

ExecutorServiceを使用すると、特定の遅延後に実行するように、または定期的に実行するようにコマンドをスケジュールできます。次の例は、ScheduledExecutorServiceを10秒ごとに1時間ビープ音を鳴らすように設定するメソッドを持つクラスを示しています。

import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }
于 2016-08-02T17:35:39.813 に答える
0
public static MediaRecorder mRecorder = new MediaRecorder();

public void startRecording(String fileName) {
    if(mRecorder != null) {
        try {
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setOutputFile(fileName);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            try {
                mRecorder.prepare();
            } catch (IOException e) {
                Log.e(StartPhoneCallService.class.getSimpleName(), "prepare() failed");
            }
            mRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}

public void stopRecording() {
    if(mRecorder != null) {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }
}

これで、ハンドラーを呼び出して5ミリ秒再生できます

private final int recording_time = 5;

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
  @Override
  public void run() {
     startRecording("YOUR FILE NAME");
     // Stop your recording after 5 milliseconds
     stopRecording();
   }
}, recording_time );
于 2019-05-23T07:55:00.057 に答える