繁体   English   中英

Android MediaRecorder IllegalStateException。 start()/stop() 在无效状态下调用

[英]Android MediaRecorder IllegalStateException. start()/stop() called in invalid state

我正在构建一个应用程序,在该应用程序中,我需要在显示视频时录制相机而不进行预览。

我正在使用已弃用的类android.hardware.camera因为它适合我的需要。 我一直有 MediaRecorder 类的问题。

我设置了 myMediaRecorder 所需的所有参数,如下面的代码所示:

if (myMediaRecorder == null) {
    myMediaRecorder = new MediaRecorder();
}
try {
    if (myCamera == null) {
        myCamera = Camera.open(Integer.parseInt(getFrontFacingCameraId()));
    }
    myCamera.unlock();
    myMediaRecorder.setCamera(myCamera);
    //myCamera.lock();
    myMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    myMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);       
    myMediaRecorder.setVideoSize(myVideoView.getWidth(),myVideoView.getHeight());             
    myMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);                 myMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);                    myMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    myMediaRecorder.setOutputFile(new FileOutputStream(outputFile.getAbsolutePath()).getFD());
    myMediaRecorder.setVideoFrameRate(30);
    myMediaRecorder.prepare();
} catch (Exception ex) {
    ex.printStackTrace();
}

然后我添加侦听器来处理与我的播放视频和录制内容相关的触发器,如您所见。

playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    myVideoView.requestFocus();
                    myVideoView.start();
                    myMediaRecorder.start();
                    playButton.setText("isRecording");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
        myVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                myMediaRecorder.stop();
                myMediaRecorder.release();
                myMediaRecorder=null;
                myCamera.release();
                myCamera=null;
                playButton.setText("stopped Recording");
            }
        });

我的目标是 SDK 版本 25,minSdkVersion 设置为 23。我在清单和编码中明确声明了以下权限:

相机、录制音频、写入和读取外部存储。

加上我的清单中的那些:

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />

我的主要问题是我无法访问 MediaRecorder 当前状态,这导致我在调用 start 和 stop 方法时进入非法状态。

你可以在这里阅读我的堆栈跟踪:

E/ExtendedMediaRecorder: start called in an invalid state: 2 mIsPaused = 0
W/System.err: java.lang.IllegalStateException
W/System.err:     at android.media.MediaRecorder.start(Native Method)
W/System.err:     at com.reacteam.reactoplayer.PlayerActivity$1.onClick(PlayerActivity.java:125)
W/System.err:     at android.view.View.performClick(View.java:5205)
W/System.err:     at android.view.View$PerformClick.run(View.java:21164)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:167)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5514)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/MediaPlayer: info/warning (3, 0)
E/ExtendedMediaRecorder: stop called in an invalid state: 2
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.reacteam.reactoplayer, PID: 19210
                  java.lang.IllegalStateException
                      at android.media.MediaRecorder.stop(Native Method)
                      at com.reacteam.reactoplayer.PlayerActivity$2.onCompletion(PlayerActivity.java:135)
                      at android.widget.VideoView$3.onCompletion(VideoView.java:483)
                      at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2821)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:167)
                      at android.app.ActivityThread.main(ActivityThread.java:5514)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我绝望地为我的 MediaRecorder 声明尝试了很多不同的架构。

我可能错过了一些重要的东西,但我主要的失望是无法以这种方式访问​​ MediaRecord

if (myMediaRecord.getState() == "PREPARED") {
    myMediaRecord.start();
}

请注意,我在 prepare() 语句之后添加了我的听众。

我的问题是,我做错了什么吗? 我是否被迫使用 Camera2 Api,但我觉得它的一些优点很复杂? 有没有办法在没有 MediaRecorder Api 的情况下记录相机输入?

只需按照官方媒体记录文件。 您的代码可能未遵循说明。 函数调用顺序必须正确。

mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(_path);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM