Android Camera API录制视频遇MediaRecorder启动失败-19错误求助
解决MediaRecorder录制视频的start failed -19及音频编码器异常问题
嘿,我来帮你搞定这个MediaRecorder的棘手问题!这两个错误我之前做相机开发时也踩过坑,咱们一步步拆解解决:
首先解决「start failed: -19」错误
这个错误的核心原因是MediaRecorder的参数配置不兼容,尤其是你没设置setVideoSize这一步——MediaRecorder需要明确的视频分辨率,默认尺寸大概率和你的相机硬件支持的格式不匹配,直接导致启动失败。
你需要先获取相机支持的有效视频尺寸,建议选和预览尺寸一致的(避免画面拉伸或兼容性问题),具体步骤:
- 通过
Camera对象获取参数:Camera.Parameters params = camera.getParameters(); - 获取支持的视频尺寸列表:
List<Camera.Size> supportedVideoSizes = params.getSupportedVideoSizes();- 如果这个列表为空,可以用预览尺寸列表替代:
params.getSupportedPreviewSizes();
- 如果这个列表为空,可以用预览尺寸列表替代:
- 从列表中选一个合适的尺寸,然后调用
recorder.setVideoSize(size.width, size.height);
另外,编码器和输出格式的搭配要严谨:你用的是OutputFormat.MPEG_4,视频编码器建议用MediaRecorder.VideoEncoder.H264(比DEFAULT更稳定),音频编码器AMR_NB是兼容MPEG-4的,但要注意配置顺序不能乱。
然后解决「audio source is set, but audio encoder is not set」异常
你移除编码器配置后出现这个错误,是因为你已经设置了AudioSource.MIC,但没有对应的音频编码器配置——MediaRecorder有个规则:如果设置了音频源,就必须同时设置音频编码器;反之如果不需要录制音频,直接删掉recorder.setAudioSource(MediaRecorder.AudioSource.MIC)这一行就行。
修改后的完整代码示例
private void startRecordingVideo() { // 先确保Camera对象已初始化并打开 Camera camera = Camera.open(); Camera.Parameters params = camera.getParameters(); // 获取支持的视频尺寸 List<Camera.Size> supportedSizes = params.getSupportedVideoSizes(); if (supportedSizes == null) { supportedSizes = params.getSupportedPreviewSizes(); } Camera.Size videoSize = supportedSizes.get(0); // 可根据需求选更合适的尺寸 recorder = new MediaRecorder(); // 注意MediaRecorder的配置顺序必须严格遵循:源→输出格式→编码器→其他参数 camera.unlock(); // 必须解锁相机,让MediaRecorder可以使用 recorder.setCamera(camera); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 配置匹配的编码器 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置视频尺寸 recorder.setVideoSize(videoSize.width, videoSize.height); // 可选:设置视频帧率,建议用相机支持的帧率 recorder.setVideoFrameRate(params.getPreviewFrameRate()); File file = getAlbumDir(); // 确保文件路径有效 if (file != null && file.getParentFile().exists()) { recorder.setOutputFile(file.getAbsolutePath()); } recorder.setMaxDuration(50000); recorder.setMaxFileSize(5000000); recorder.setPreviewDisplay(CameraBridgeViewBase.surfaceHolder.getSurface()); try { recorder.prepare(); recorder.start(); } catch (IllegalStateException | IOException e) { e.printStackTrace(); // 出错时记得释放资源 if (recorder != null) { recorder.stop(); recorder.release(); recorder = null; } camera.lock(); camera.release(); } }
额外注意事项
- 权限申请:确保你已经申请了
RECORD_AUDIO、CAMERA、WRITE_EXTERNAL_STORAGE(Android 10及以上可改用MediaStore)权限,并且在运行时获取了动态权限。 - Surface状态:要确保
CameraBridgeViewBase的Surface已经创建完成,避免在surfaceCreated之前调用录制方法。 - 资源释放:录制停止或出错时,一定要释放MediaRecorder和Camera资源,避免内存泄漏或硬件占用。
内容的提问来源于stack exchange,提问作者Megha Maniar
相关产品推荐
相关产品推荐

