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

Posted

技术标签:

【中文标题】MediaRecorder.stop() 停止失败:-1007【英文标题】:MediaRecorder.stop() stop failed: -1007 【发布时间】:2013-03-27 20:30:47 【问题描述】:

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

有什么想法吗? 谢谢。

【问题讨论】:

我发现了类似的问题,但没有帮助:code.google.com/p/android/issues/detail?id=38107 你能展示你如何准备MediaRecorder对象的代码吗? 一些代码 sn-p 也可能有帮助 @JasonRobinson 我已经用 MediaRecorder 准备代码更新了这个问题 @alekz 只是为了确保我理解正确,它记录正​​确,只是停止它不起作用?还是一开始就没有正确录制? 【参考方案1】:

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

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

【讨论】:

你的传奇 :) 对我帮助很大。我有一个持续存在的问题,这个问题已经解决了。在某些型号的手机上,我遇到了间歇性问题。特别是运行 4.x.x 的 HTC Sensation 无法在没有先在表面上设置预览大小的情况下 100% 地录制视频,即使它只有 1 像素宽。我遇到了奇怪的问题,它有时会录制明亮的绿色条纹视频或完全无法播放,但只有在 720x480 或更高的分辨率时才会播放。通过使用setPreviewSize(),这个奇怪的问题得到了解决。 :) 谢谢它帮助了我!!但是离开我的应用程序时出现空指针异常。 '10-11 22:38:47.609:E/SurfaceView(18569):更新窗口时出现 NullPointerException。 mSession = android.view.IWindowSession$Stub$Proxy@4153f280,mWindow = android.view.SurfaceView$MyWindow@417214b0 10-11 22:38:47.609:E/SurfaceView(18569):意外 NullPointerException。你能帮我解决一下吗? 我使用此代码有一段时间没有任何问题,但由于我将 Nexus 6 更新到 Android 6.0,应用程序随机崩溃:`parameters.setPreviewSize'【参考方案2】:

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

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

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

【讨论】:

感谢您的回答。我已经知道抛出异常的原因。但我仍然无法理解,为什么 MediaRecorder 的配置在 acerE350 (Android 4.0.3) 上不起作用以及错误“-1007”是什么意思。至于你的问题 - 我可以发布我的其余代码,但它在其他几部手机上运行良好......我检查了所有方法都以正确的顺序调用,并且可以重新配置 MEdiaRecorders ServerDied 错误,但我只想配置 MediaRenderer 以尽可能高的质量创建 MP4 视频。 是否有任何机会(即使很小)您启动和停止记录仪的速度过快?您要记录多少帧(或秒)? 我不这么认为。它适用于几款预算电话。代码非常标准。至于 fps - 我尝试了 30(QUALITY_HIGH 配置文件)和 15。两者都失败了。 理论上没什么可说的(除非有一位 Google 员工闲逛并给我们一些额外的见解)。如果你给我一些提示,我可以在我自己的设备+模拟器上尝试代码。 谢谢)我会尝试寻找原生相机应用的来源。至少它有效)如果我发现我会发布答案【参考方案3】:

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

【讨论】:

【参考方案4】:

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

希望这对某人有所帮助!

【讨论】:

【参考方案5】:

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

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

希望对你有帮助

【讨论】:

***.com/questions/47996933/… 。这是我的代码,我遇到了这个问题,我哪里出错了?【参考方案6】:

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

【讨论】:

以上是关于MediaRecorder.stop() 停止失败:-1007的主要内容,如果未能解决你的问题,请参考以下文章

Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.

android--MediaRecorder.stop()报错java.lang.IllegalStateException

android--MediaRecorder.stop()报错java.lang.IllegalStateException

android--MediaRecorder.stop()报错java.lang.IllegalStateException

如果测试失败,则停止/失败 docker build

第一次失败后开玩笑停止测试套件