首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaRecorder崩溃?

MediaRecorder崩溃?
EN

Stack Overflow用户
提问于 2018-03-22 18:50:13
回答 2查看 520关注 0票数 0

我要录制视频,但它不起作用

代码语言:javascript
复制
public void startRecord() {
    if (preVideo()) {
        mRecorder.start();
    }
    isRecording = true;
}

public boolean preVideo() {
    if (mCamera == null) {
        return false;
    }

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);

    CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    mRecorder.setProfile(cpHigh);
    mRecorder.setOutputFile(createFile().toString());
    mRecorder.setVideoSize(mFrameWidth, mFrameHeight);

    return true;
}

和逻辑猫;

致命异常:主进程: pt.chambino.p.pulse,PID: 6578 java.lang.IllegalStateException at android.media.MediaRecorder.start(原生方法)在org.opencv.android.MyJavaCameraView.startRecord(MyJavaCameraView.java:375) at pt.chambino.p.pulse.App.onRecord(App.java:241) at pt.chambino.p.pulse.App.onOptionsItemSelected(App.java:213) at android.app.Activity.onMenuItemSelected(Activity.java:2600) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(( com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java: at PhoneWindow.java:1019)(在com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546) )在com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:119) at android.view.View.performClick(View.java:4569)在android.view.View$PerformClick.run(View.java:18553) at android.os.Handler.handleCallback(Handler.java:733)在android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:212)在android.app.ActivityThread。java.lang.reflect.Method.invoke(Method.java:515)的java.lang.reflect.Method.invokeNative(原生方法)的main(ActivityThread.java:5151)在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)在dalvik.system.NativeStart.main(本地方法)

EN

回答 2

Stack Overflow用户

发布于 2018-03-22 19:25:18

有两种方法可以使用IllegalStateException来触发MediaRecorder.start()

  • 您正在使用的录音输入已经在使用中
  • 您还没有为录制MediaRecorder做好适当的准备。

考虑一下来自文献资料的状态图

不考虑第一个选项,因为没有足够的信息来确认或拒绝它,如果我要比较您的代码流,那么您似乎遗漏了两个步骤:

  • setOutputFormat
  • prepare

您还将视频源设置为您的手机屏幕而不是照相机,因此我将更改您的代码如下:

代码语言:javascript
复制
public void startRecord() {
    try {
        if (preVideo()) {
            mRecorder.start();
            isRecording = true;
        }
    } catch(IOException | IllegalStateException e) {
        e.printStackTrace();
        // Error handling
    }
}

public boolean preVideo() throws IllegalStateException, IOException {
    if (mCamera == null) {
        return false;
    }

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    mRecorder.setProfile(cpHigh);
    mRecorder.setOutputFile(createFile().toString());
    mRecorder.setVideoSize(mFrameWidth, mFrameHeight);

    mRecorder.prepare();

    return true;
}
票数 0
EN

Stack Overflow用户

发布于 2022-04-26 10:38:15

替换:

代码语言:javascript
复制
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

,下面是:

代码语言:javascript
复制
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49436316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档