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
是否为prepared
和started
。简而言之,您应该检查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