在使用setVideoEncoder
进行视频编码设置时,可能会遇到各种报错,这些报错通常与配置顺序、参数设置不当或设备硬件限制有关,下面将详细分析这些报错的原因及解决方法,并提供相关示例代码和常见问题解答。
常见报错原因及解决方法

1. IllegalStateException: setVideoEncoder called in an invalid state
原因:在调用setVideoEncoder
之前,必须先调用setOutputFormat
方法,如果顺序错误,会报此异常。
解决方法:确保在调用setVideoEncoder
之前已经正确设置了输出格式。
- recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
2. IllegalArgumentException: setVideoSize called in a invalid state
原因:在设置视频分辨率之前,需要先设置视频源和输出格式。
解决方法:调整设置顺序,确保在设置分辨率之前已经设置了视频源和输出格式。

- recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- recorder.setVideoFrameRate(30);
- recorder.setVideoSize(640, 480);
3. IllegalStateException: start failed: 19
原因:设置的视频大小与摄像头支持的大小不匹配。
解决方法:获取摄像头支持的视频大小列表,并选择一个合适的大小。
- Camera camera = Camera.open();
- Camera.Parameters parameters = camera.getParameters();
- List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
- // 选择第一个支持的尺寸
- Camera.Size selectedSize = sizeList.get(0);
- recorder.setVideoSize(selectedSize.width, selectedSize.height);
- camera.release();
4. IllegalStateException: start failed: 38
原因:麦克风已经被其他应用占用。
解决方法:确保麦克风未被其他应用占用,或者使用不同的音频源。

- recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
5. IllegalStateException: start failed: 2147483648
原因:设备不支持指定的视频编码格式。
解决方法:更换为设备支持的编码格式,如H264。
- recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
示例代码
以下是一个简化的示例代码,展示了如何正确配置MediaRecorder
以录制视频:
- private void initRecorder() {
- mMediaRecorder = new MediaRecorder();
- mCamera = Camera.open(); // 打开摄像头
- mCamera.unlock();
- mMediaRecorder.setCamera(mCamera);
- mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
- mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
- mMediaRecorder.setVideoFrameRate(30);
- mMediaRecorder.setVideoSize(640, 480);
- mMediaRecorder.setOrientationHint(90); // 竖屏录制
- mMediaRecorder.setPreviewDisplay(new Surface(textureView.getSurfaceTexture()));
- mMediaRecorder.setOutputFile("/sdcard/video.mp4");
- mMediaRecorder.prepare();
- }
在使用setVideoEncoder
时,正确的配置顺序和参数设置至关重要,常见的问题包括配置顺序错误、参数不匹配以及设备硬件限制,通过遵循正确的配置步骤和使用设备支持的参数,可以有效避免这些错误,获取摄像头支持的视频大小和格式也是确保录制成功的关键。
FAQs
Q1: 为什么在调用setVideoEncoder
时会抛出IllegalStateException
?
A1:IllegalStateException
通常是因为在调用setVideoEncoder
之前没有正确设置输出格式(setOutputFormat
),确保在调用setVideoEncoder
之前已经设置了输出格式。
Q2: 如果设备不支持指定的视频编码格式怎么办?
A2: 如果设备不支持指定的视频编码格式,可以尝试更换为设备支持的其他编码格式,例如H264,可以通过查询设备的编码支持列表来选择合适的编码格式。