14

如何在使用 MediaPlayer 播放音频 5 毫秒后调用记录方法。我尝试过类似的方法,但我不知道,也没有找到任何好的例子来结束这个。

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

请注意,我==if语句中使用了检查是否相等,而不是0每次都分配值,我假设这就是您想要的。

值得一提的是,让一个线程进入睡眠状态会在你指定的时间内停止它做任何事情。如果这是一个 UI 线程,那么您将在该持续时间内有效地“冻结”UI,因此请确保您正确使用它。但是,您的示例for循环表明这正是您正在尝试做的事情。

于 2013-03-20T11:03:20.447 回答
0

您可以尝试使用 Thread.sleep(5),或者,如果您不想为此使用 UI 线程,您可以使用 Timer,或在 doInBackground() 方法中等待 5 毫秒后触发回调的 AsyncTask。

这是使用计时器的一个很好的例子: https ://stackoverflow.com/a/4598737/832008

于 2013-03-20T11:08:24.633 回答
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;
    }
}

现在可以调用 Handler 播放 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 回答
0

您还可以使用ScheduledExecutorService

使用 ExecutorService,您可以安排命令在给定延迟后运行,或定期执行。以下示例显示了一个类,该类的方法将 ScheduledExecutorService 设置为每隔十秒发出蜂鸣声,持续一小时:

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 回答