Android视频录制-mediaRecorder.start上的非法状态异常
我正在学习有关的教程 因此,我在尝试启动相机时遵循以下顺序:Android视频录制-mediaRecorder.start上的非法状态异常,android,android-camera,android-mediarecorder,Android,Android Camera,Android Mediarecorder,我正在学习有关的教程 因此,我在尝试启动相机时遵循以下顺序: 照相机,打开 照相机。解锁 mediaRecorder.setCamera mediaRecorder.setAudioSource mediaRecorder.setVideoSource mediaRecorder.setProfile mediaRecorder.setOutputFile 准备 mediaRecorder.start再次比较我的代码,您似乎错过了两个调用: mediaRecorder.setVideoSize(
mediaRecorder.setVideoSize(int width, int height)
mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)
后者最有可能导致崩溃,因为Android需要有效的预览界面才能开始录制。这样做是为了防止隐藏摄像头应用程序
在没有预览界面的情况下,有几十个与录制相关的问题,但这似乎总结了您需要做些什么来绕过此限制。
基本思想是将曲面的大小调整为1x1,并将其传递给
mediaRecorder
实例。请记住,这可能并不适用于所有设备。如果您多次访问麦克风硬件,例如,一次使用MediaRecorder和AudioRecord类,也会例外。我只是看了一下我的代码,配置了比您更多的东西。但是我认为主要的区别是mediaRecorder.setVideoSize(int-width,int-height)
和mediaRecorder.setPreviewDisplay(SurfaceHolder-surfacehold)
。也许设置其中一个可以帮助它工作。顺便说一句,你能粘贴你的堆栈跟踪吗?@EdsonMenegati谢谢你的回复。。。我没有使用预览窗口,所以我认为我不需要这些调用,但我会尝试添加setVideoSize,看看这是否会让事情变得明朗。我将在今天晚些时候发布完整的堆栈跟踪,这是否意味着您根本没有显示任何相机预览?@EdsonMenegati这是正确的。出于我的目的,我想录制视频,但不显示预览窗口。我现在正在做的基本工作就是启动/停止录制按钮,并将视频文件保存在某个地方。。。还是很惊讶它证明了这很麻烦!不幸的是,你不能这样做。在安卓系统中,如果您想录制,则必须显示相机预览。它以这种方式实现,以防止隐藏的摄像头应用程序。SO中有很多相关的问题,但是看看这个链接谢谢@Edson原来我没有包括预览,这导致了失败。根据问题中链接的指南,我添加了预览类并附加了surfaceview,解决了我的问题。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.microphone" />
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setVideoSize(int width, int height)
mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)