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

29

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

问题如下:代码mediaRecorder.stop()抛出了RuntimeException异常。

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格式。 这段代码在三星Galaxy GIO(android 2.3.3)上运行正常,在Acer E305(android 4.0.2)上出现问题。
有什么想法吗? 谢谢。

我发现了类似的问题,但它没有帮助:https://code.google.com/p/android/issues/detail?id=38107 - Alex
你能展示一下如何准备 MediaRecorder 对象的代码吗? - Jason Robinson
@JasonRobinson 我已经更新了问题,并附上了MediaRecorder准备代码。 - Alex
@JoachimIsaksson媒体记录器启动后几乎立即报告错误"[100,-1007] - 媒体服务器已停止工作"。文件已创建但已损坏。当我尝试停止MediaRecorder时会抛出异常。 - Alex
@JasonRobinson 我已经尝试设置 CamcorderProfile.QUALITY_LOW,但问题仍然存在... - Alex
显示剩余3条评论
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()

1
你是个传奇 :) 非常感谢你的帮助。我一直有一个问题,但现在已经解决了。在某些型号的手机上,我遇到了间歇性问题。特别是HTC Sensation运行4.x.x时,即使只有1像素宽,也无法100%地记录视频,必须先在表面上设置预览大小。我遇到了一些奇怪的问题,有时会录制出明亮的绿色条纹视频,或者完全无法播放,但仅在720x480或更高分辨率时才会出现。通过使用setPreviewSize(),这个奇怪的问题得到了解决。 :) - wired00
谢谢,它对我有帮助!但是当我退出我的应用程序时,我遇到了空指针异常。'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。'您能帮我解决这个问题吗? - user2376920
我使用这段代码有一段时间了,没有任何问题,但自从我将我的Nexus 6更新到Android 6.0以后,应用程序会在“parameters.setPreviewSize”上随机崩溃。 - Jérémy

15

引用MediaRecorder.java中4.0.3版本的"stop"方法文档:

停止录制。在调用start()后调用此方法。一旦录制停止,您将需要再次配置它,就像刚刚构建它一样。请注意,如果在调用start()后立即调用stop(),应用程序会有意地抛出RuntimeException ,如果没有接收到有效的音频/视频数据,stop()方法将失败。这样做是为了让应用程序采取相应措施来清理输出文件(例如删除输出文件),因为当发生这种情况时,输出文件未正确构造。

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


谢谢您的回答。我已经知道了为什么会抛出异常的原因。但是我仍然不明白为什么在acerE350(Android 4.0.3)上MediaRecorder的配置无法正常工作,以及错误“-1007”的含义是什么。至于您的问题-我可以发布我的其余代码,但它在其他几部手机上运行得很稳定......我已经检查了所有方法的调用顺序,并且在ServerDied错误时重新配置MEdiaRecorders是可行的,但我只想配置MediaRenderer以创建最高质量的MP4视频。 - Alex
1
你是否有可能(即使很小的可能性)启动和停止录制器的速度过快?你尝试录制多少帧(或秒)? - Jose L Ugia
我不这么认为。它可以在几款预算手机上运行。代码非常标准。至于fps - 我尝试了30(QUALITY_HIGH配置文件)和15。两者都失败了。 - Alex
理论上来说,除非有谷歌员工留下来给我们提供额外的见解,否则就没有更多要说的了。如果你能给我一些提示,我可以在自己的设备和模拟器上尝试这段代码。 - Jose L Ugia
你找到答案了吗,alekz? :) - Edison
显示剩余4条评论

2

我在一些设备上遇到了-1007错误,主要是在安卓9上,最终我解决了这个问题。原因是OMX.google.h264.encoder仅支持宽高均可被16整除的视频尺寸。我使用了displayMetrics.widthPixels和displayMetrics.heightPixels来确定视频尺寸,但并不符合所有设备的要求。

希望这能帮助到有需要的人!


1

我在 Android 模拟器 API 18 上发现了一个错误(在较新版本上录制正常)。

我发现,如果在初始化和启动我的 MediaRecorder 实例之前调用了 Camera.startPreview(),则在调用 MediaRecorder.stop 时会出现 stop failed: -1007 日志,但如果在初始化我的 MediaRecorder 之前调用 Camera.stopPreview(),则视频将可以正常录制。

希望这可以帮到你。


这是我的代码,我遇到了这个问题,那么我哪里出错了?https://stackoverflow.com/questions/47996933/mediarecorder-keeps-freezing-during-recording-cant-get-it-to-work - iBEK

1

我发布了一个不错的解决方法,用于查找MediaRecorder是否已经preparedstarted。简而言之,您应该检查MediaRecorder.maxAmplitude > 0,如果有任何录制内容,则应该是这种情况。我使用一个帮助程序来处理这个条件,直到它变成大于零为止。在此处阅读完整的解释:https://dev59.com/S3_gs4cB2Jgan1znSCZB#66821059


0
我在三星J4+上遇到了同样的问题,运行在Handler中的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

在OnCreate中使用HandlerThread Looper进行初始化:

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

当记录或停止按钮被点击时,请调用:
mCameraHandler.sendEmptyMessage(START)
mCameraHandler.sendEmptyMessage(STOP)

链接到我的混乱代码 xD


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接