MediaRecorder 实现 setOnInfoListener -max duration

Posted

技术标签:

【中文标题】MediaRecorder 实现 setOnInfoListener -max duration【英文标题】:MediaRecorder implementing setOnInfoListener -max duration 【发布时间】:2011-08-24 23:36:57 【问题描述】:

我正在使用 mediarecorder 通过 MIC 捕获音频。我已将最大持续时间设置为 20 秒。录制会自动停止,并且不会在 setOnInfoListener 内的断点处停止。

**UPDATE: Changed my code according to suggestion but still doesnt stop at the breakpoint inside the listener.**

mRecorder.reset();
mRecorder.setOnInfoListener(new OnInfoListener() 
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra)                      
        if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) 
            mRecorder.stop();

                  
    
);
mRecorder.setAudiosource(MediaRecorder.AudioSource.MIC);
mRecorder.setAudioSamplingRate(8000);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(fileName);
mRecorder.setMaxDuration(20000);
try 
    mRecorder.prepare();
 catch(IOException exception) 
    mRecorder.reset();
    mRecorder.release();
    mRecorder = null;
    return;

mRecorder.start();

有人可以告诉我为什么代码没有在监听器中点击我的 onInfo 方法,而是默默地停止录制。

谢谢

【问题讨论】:

大多数对 mRecorder 的调用需要放在 prepare() 之前但 setOutputFormat() 之后。如果您查看 mediarecorder 的状态图,您就会明白我在说什么。 【参考方案1】:

当您设置输出格式时,请尝试使用 THREE_GPP 而不是 RAW_AMR。

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

根据documentation 为setOutputFormat()

It is recommended to always use 3GP format when using the
H.263 video encoder and AMR audio encoder. Using an MPEG-4
container format may confuse some desktop players.

【讨论】:

这与问题有什么关系?【参考方案2】:

尝试在呼叫prepare()之前将您的呼叫转移到setOnInfoListener()

在我自己的视频捕获代码中,我在创建 MediaRecorder 对象后立即调用 setOnInfoListener()。在您的代码示例中,一个好的位置可能就在reset() 之后和setAudioSource() 之前。

否则,OnInfoListener 类的主体看起来是正确的。

我已从我的应用中添加了 MediaRecorder 设置代码,该代码可以正常工作。

try 
    mCamera.unlock();

    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setOnErrorListener( new VideoRecorderErrorListener() );
    mMediaRecorder.setOnInfoListener( new VideoRecorderInfoListener() );

    // As per android API docs, the ordering of the following initialization
    // calls is important.
    mMediaRecorder.setCamera(mCamera);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

    mMediaRecorder.setOutputFile( mOutputFilePath );

    mMediaRecorder.setMaxFileSize(VIDEO_MAX_FILE_SIZE);
    mMediaRecorder.setAudioChannels(AUDIO_CHANNELS);
    mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLING_RATE);
    mMediaRecorder.setAudioEncodingBitRate(AUDIO_ENCODING_BIT_RATE);
    mMediaRecorder.setMaxDuration(VIDEO_MAX_DURATION);
    mMediaRecorder.setVideoFrameRate(mPictureFPS);
    mMediaRecorder.setVideoEncodingBitRate(VIDEO_ENCODING_BIT_RATE);
    mMediaRecorder.setVideoSize(mPreviewWidth, mPreviewHeight);

    mMediaRecorder.setPreviewDisplay(mHolder.getSurface());

    mMediaRecorder.prepare();

    mMediaRecorder.start();
 catch (IllegalStateException e) 

【讨论】:

那没有任何区别。我在按钮点击事件上调用上面的代码......逻辑是否需要成为线程的一部分?? 不,我没有使用线程进行 MediaRecorder 设置,它对我来说很好用。你和我之间的两个区别:1)我正在录制视频+音频。 2)我将监听器定义为内部类,而不是匿名类。不过,我认为这两种方法都不会产生影响。如果我有其他想法,我一定会告诉你的。 同时,我添加了我的 MediaRecorder 设置代码。也许你可以从中得到一些东西。我知道您对 MediaRecorder 进行设置调用的顺序非常非常重要。 请参阅developer.android.com/reference/android/media/…“应用程序需要在运行 Looper 的线程上创建 MediaRecorder 对象”没有它,您将无法接收信息事件【参考方案3】:

一旦达到最大持续时间,它就会调用(自定义方法)stopRecording():在这里我们可以处理所有停止录制和释放播放器摄像头和预览。

 myRecorder = new MediaRecorder();
 myRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() 
            @Override
            public void onInfo(MediaRecorder mr, int what, int extra) 
                if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) 
                    stopRecording();
                
            
        );

【讨论】:

【参考方案4】:

你将 MediaRecorder mr 对象传递给你的方法,但你没有使用它。试试 mr.stop();

【讨论】:

嗨@Ken,这不是聊天网站。请更多地考虑您的答案的语言和格式。精美地格式化您的答案使其更易于阅读,并且更有可能发挥作用。

以上是关于MediaRecorder 实现 setOnInfoListener -max duration的主要内容,如果未能解决你的问题,请参考以下文章

MediaRecorder 实现 setOnInfoListener -max duration

用MediaRecorder实现简单的录像功能

Android 中使用MediaRecorder实现视频录制功能

网页录像录音功能的实现之MediaRecorder的使用

MediaProjection与MediaRecorder实现录屏

MediaProjection与MediaRecorder实现录屏