MediaRecorder.stop()停止失败:-1007

时间:2013-04-05 12:14:09

标签: android video-capture mediarecorder android-mediarecorder

我正在使用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)所述失败

有什么想法吗? 感谢。

6 个答案:

答案 0 :(得分:22)

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

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()

答案 1 :(得分:15)

在4.0.3中的MediaRecorder.java中引用“stop”方法的文档:

  

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

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

答案 2 :(得分:1)

我在Samsung 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)

link to my messy code xD

答案 3 :(得分:1)

我在某些设备上出现-1007错误,主要是android 9,最后我解决了这个问题。原因是OMX.google.h264.encoder仅支持可被16均分的视频尺寸。 我将displayMetrics.widthPixels和displayMetrics.heightPixels用作视频大小,但并非所有设备都满足要求。

希望这对某人有帮助!

答案 4 :(得分:0)

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

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

我希望这会有所帮助

答案 5 :(得分:0)

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