29

我正在使用 MediaRecorder 录制视频。我的代码在 2.3.3 上运行良好,但在 4.0.3 上失败。

问题如下:代码 mediaRecorder.stop() 抛出 RuntimeExeption

java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)

带有 LogCat 消息

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007

更新

我发现,MediaPlayer 几乎在启动后立即报告错误(通过 MediaPlayer.OnErrorListener)。错误代码是 100(媒体服务器死机),额外的 -1007。

更新 2 准备 MediaRecorder 的代码

            c = Camera.open();

    ...

    // Step 1: Unlock and set camera to MediaRecorder
    camera.unlock();
    mediaRecorder.setCamera(camera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    CamcorderProfile profile = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);

    // manual set up!

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
    mediaRecorder.setVideoSize(profile.videoFrameWidth,
            profile.videoFrameHeight);

    mediaRecorder.setAudioChannels(profile.audioChannels);
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);

    mediaRecorder.setAudioEncoder(profile.audioCodec);
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mediaRecorder.setVideoEncoder(profile.videoCodec);

    // mediaRecorder.setProfile(profile);

    // Step 4: Set output file
    mediaRecorder.setOutputFile("somefile.mp4");

    // Step 5: Set the preview output
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mediaRecorder.prepare();
    } catch ...
    { release mediaRecorder}

然后我只需调用 mediaRecorder.start() 请注意,我需要将视频编码为 mp4 格式。此代码适用于 Samsng Galaxy GIO (android 2.3.3) 并且如 Acer E305 (android 4.0.2) 所述失败

有任何想法吗?谢谢。

4

6 回答 6

24

终于解决了。问题是在设置相机的实际预览之前设置预览大小。预览大小必须等于所选视频大小。

CamcorderProfile profile = [get required profile];

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight);
mCamera.setParameters(parameters);

mCamera.setPreviewDisplay([surface holder]);
mCamera.startPreview();

...

//configure MediaRecorder and call MediaRecorder.start()
于 2013-05-14T12:28:53.217 回答
16

引用 4.0.3 中 MediaRecorder.java 中“停止”方法的文档:

停止录制。在 start() 之后调用它。停止录制后,您必须重新配置它,就像它刚刚构建一样。请注意,如果在调用 stop() 时未收到有效的音频/视频数据,则会故意向应用程序抛出 RuntimeException。如果在 start() 之后立即调用 stop(),就会发生这种情况。失败让应用程序采取相应的行动来清理输出文件(例如,删除输出文件),因为发生这种情况时输出文件的构造不正确。

MediaPlayer 报告这个“媒体服务器死机”的事实是由于同样的原因。您能否发布其余代码以查看是否存在任何可能导致此问题的误解?

于 2013-04-13T10:02:58.620 回答
2

我在某些设备上遇到了 -1007 错误,主要是 android 9,最后我解决了这个问题。原因是 OMX.google.h264.encoder 仅支持可被 16 整除的视频尺寸。我使用 displayMetrics.widthPixels 和 displayMetrics.heightPixels 作为视频尺寸,它并不满足所有设备的要求。

希望这对某人有帮助!

于 2019-09-15T10:53:50.507 回答
1

我在三星 J4+、Android 9 Pie 上遇到了同样的问题。

通过在处理程序中运行 mediaRecorder.start() 和 mediaRecorder.stop() 来修复它:

private val START = 0;
private val STOP  = 1;

inner class CameraHandler(looper: Looper?): Handler(looper) {

  override fun handleMessage(msg: Message?) {
    super.handleMessage(msg)
      try {
        when (msg?.what) {
          START -> mediaRecorder?.start()
          STOP  -> mediaRecorder?.stop()
        }
      } catch (e: Exception) {
        Log.d("debug", e.message)
      }
  }
}

声明处理程序:

private lateinit var mCameraHandler: Handler

使用 HandlerThread Looper 在 OnCreate 中初始化:

val handlerThread: HandlerThread = HandlerThread("Camera Handler Thread")
handlerThread.start()
mCameraHandler = CameraHandler(handlerThread.looper)

单击录制或停止按钮时调用:

mCameraHandler.sendEmptyMessage(START)
mCameraHandler.sendEmptyMessage(STOP)

链接到我乱七八糟的代码 xD

于 2019-07-04T01:18:54.010 回答
0

所以我发现在 API 18 的 Android 模拟器上为我报告了这个错误(在更高版本的录制工作正常之后)。

我发现如果我Camera.startPreview()在初始化并开始启动我的MediaRecorder实例之前打电话,我会stop failed: -1007在调用时得到日志MediaRecorder.stop,但如果我Camera.stopPreview()在初始化我MediaRecorder的视频之前打电话会很好地录制。

我希望这有帮助

于 2016-10-22T02:27:38.380 回答
0

我发布了一个很好的解决方法来查找MediaRecorderispreparedstarted. 简而言之,您应该检查是否MediaRecorder.maxAmplitude > 0,如果有任何记录,则应该是这种情况。我正在使用一个助手来处理这个问题,该助手会不断检查条件,直到它大于零。在此处阅读完整说明:https ://stackoverflow.com/a/66821059/15389960

于 2021-03-26T17:13:40.210 回答