【问题标题】:How to automatically limit Android audio recording length?如何自动限制 Android 录音长度?
【发布时间】:2012-02-17 00:44:28
【问题描述】:

我有这个工作代码。我需要它只在有限的时间内录制,而不需要用户点击。我该怎么做?

    MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(file);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());
try {
    recorder.prepare();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
recorder.start();
recorder.setMaxDuration(60000);
// stop
recorder.stop();
recorder.reset(); 
recorder.release();

【问题讨论】:

    标签: android audio-recording


    【解决方案1】:

    这会做得很好:(在准备/启动功能之前使用setMaxDuration)

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(outputFile.getAbsolutePath());
    
    recorder.setMaxDuration(60000);
    recorder.prepare();
    recorder.start();
    

    【讨论】:

    • 谢谢,这行得通……但其他人都知道,理想情况下,您需要一些东西来通知用户录制已停止,因为他们不知道。但是,如果您查看生成的文件,它只是分配的有限秒数。所以谢谢。
    【解决方案2】:

    使用setMaxDurationsetOnInfoListener 获取通知UI 的回调。

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(outputFile.getAbsolutePath());
    
    recorder.setMaxDuration(60000);
    recorder.prepare();
    recorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
        @Override
        public void onInfo(MediaRecorder mr, int what, int extra) {
            if(what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED){
                Toast.makeText(context, "Recording stops. Limit reached", Toast.LENGTH_LONG).show();
            }
        }
    });
    recorder.start();
    

    【讨论】:

      【解决方案3】:

      你应该把你的 recorder.stop() 等调用放在一个计时器中

      这里是如何使用定时器任务的说明链接http://developer.android.com/resources/articles/timed-ui-updates.html

      Timer timer = new Timer();
      timer.schedule(new FinishRecordingTask(), 100, 200);
      

      在你调用 recorder.start() 之后添加它

      【讨论】:

        【解决方案4】:

        这可能是一个有点讨厌的方法。但这就是我所做的,

        使用 mediaplayer.start() 启动 mediaPlayer 后,像这样启动与它平行的线程,

         thread passMusic=new Thread(new Runnable() {
        
                public void run() {
                    try {
        
                        Thread.sleep(60000);
                        mediaplayer.pause();
                        mediaplayer.stop();
                        mediaplayer.release();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        
        
                }
            });passMusic.start();
        

        现在您可以使用处理程序来更新您的 UI 或其他内容。

        【讨论】:

        • 实际上将其与 woliu 的答案结合使用是一种很好的方法。他的回答会限制录音,但你的回答是让用户知道它已经完成的一个很好的解决方案,例如,你可以在时间限制后出现敬酒。谢谢!虽然必须通过活动发布Toast(而不是Thread),但这是一个单独的问题,答案在堆栈上。
        • Thread.sleep 不准确!请阅读此stackoverflow.com/questions/17561380/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多