2013-04-05 1192 views
26

我正在用MediaRecorder录制视频。我的代码在2.3.3上正常工作,但在4.0.3上失败。MediaRecorder.stop()停止失败:-1007

的问题是以下几点:代码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 

UPDATE

我发现,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} 

然后我simplyCall mediaRecorder.start() 请注意,我需要的视频被编码成MP4格式。 此代码适用于Samsng Galaxy GIO(android 2.3.3),并按照宏基E305(android 4.0.2)上的描述失败

任何想法? 谢谢。

+0

我发现similiar问题,但它并没有帮助:https://code.google.com/p/android/issues/detail?id=38107 – alekz 2013-04-05 12:21:33

+0

您能不能告诉代码你如何准备MediaRecorder对象? – 2013-04-09 20:33:18

+0

某些代码片段可能也有帮助 – 2013-04-10 00:01:26

回答

20

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

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

你的传奇:)帮了我很多。我有一个正在进行的问题,这固定。在某些型号的手机上,我遇到了间歇性问题。特别是运行4.x.x的HTC Sensation无法在没有首先设置预览大小的情况下100%的时间录制视频,即使它只有1px宽。我遇到了奇怪的问题,它有时会记录明亮的绿色条纹视频,或者完全无法播放,但只有当分辨率为720x480或更高时。通过使用'setPreviewSize()'奇怪的问题得到解决。 :) – wired00 2013-05-28 06:29:36

+0

谢谢它帮助了我!但是当我离开我的应用程序时,我得到了空指针异常。 '10 -11 22:38:47.609:E/SurfaceView(18569):更新窗口时出现NullPointerException。 mSession = [email protected],mWindow = [email protected] 10-11 22:38:47.609:E/SurfaceView(18569):意外的NullPointerException。'你能帮我解答一下吗? – user2376920 2013-10-11 17:12:17

+0

我一段时间没有任何问题使用此代码,但由于我更新了我的Nexus 6到Android 6.0,该应用程序随机崩溃: 'parameters.setPreviewSize' – 2015-10-05 19:55:12

14

引述MediaRecorder.java “止损” 方法的文档中的4.0.3:

停止录制。在开始()后调用它。一旦停止记录, 您将不得不再次配置它,就好像它刚刚构建了 一样。请注意,如果 stop()被调用时没有收到有效的音频/视频数据,则应用程序会故意将RuntimeException抛出到 应用程序。如果在 start()后立即调用stop(),则会发生这种情况。由于 输出文件在发生这种情况时没有正确构建,故障使应用程序可以相应地采取措施清理输出文件(例如,删除输出文件) 。

而MediaPlayer报告这个“媒体服务器死亡”这一事实也是出于同样的原因。你可以发布你的代码的其余部分,看看是否有任何可能导致这个问题的误解?

+0

感谢您的回答。我已经知道抛出异常的原因。但我仍然无法得到,为什么MediaRecorder的配置不适用于acerE350(Android 4.0.3)以及错误“-1007”是什么意思。至于你的问题 - 我可以发布我的代码的其余部分,但它在其他几个手机上运行稳健...我检查了所有方法都按正确顺序调用,并且可以对MEdiaRecorders进行重新配置ServerDied错误,但我只想配置MediaRenderer以最高质量创建MP4视频。 – alekz 2013-04-13 18:24:50

+1

您是否有任何机会(即使很小),您开始和停止记录器太快?你想录制多少帧(或几秒)? – 2013-04-13 19:10:23

+0

我不这么认为。它适用于多款预算手机。代码非常标准。至于fps - 我已经尝试了30(QUALITY_HIGH配置文件)和15.都失败了。 – alekz 2013-04-15 05:59:59

0

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

我发现那是什么,如果我已经初始化并启动开始我MediaRecorder实例之前称为Camera.startPreview(),我会打电话MediaRecorder.stop时,你得到stop failed: -1007日志,但如果我初始化我MediaRecorder视频前叫Camera.stopPreview()将记录的罚款。

我希望这有助于

+0

https:// stackoverflow。com/questions/47996933/mediarecorder-keeping-freezing-recording-recording-can-get-to-work。这是我的代码,我有这个问题,所以我哪里错了? – iBEK 2017-12-28 02:29:36

相关问题