You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:51:35