MediaRecorder崩溃求助:视频录制功能无法正常运行
从你贴的代码片段来看,我发现几个潜在问题,再结合Android视频录制的常见坑,给你梳理一下排查方向:
错误的录制状态标记逻辑
你的startRecord()方法里,不管preVideo()是否初始化成功,都直接把isRecording设为true。这会导致后续状态判断混乱——比如停止录制时,可能去调用一个未初始化完成的mRecorder.stop(),直接引发崩溃。
修复建议:把状态标记移到成功分支里:public void startRecord() { if (preVideo()) { mRecorder.start(); isRecording = true; // 仅初始化成功后标记 } }缺失MediaRecorder与Camera的关键绑定步骤
你用了MediaRecorder.VideoSource.SURFACE作为视频源,但代码里没有把Camera的预览Surface和MediaRecorder关联起来。如果是使用旧版Camera API(Android 5.0之前),还需要先调用mCamera.unlock(),再通过mRecorder.setCamera(mCamera)绑定相机;如果是Surface源,必须确保MediaRecorder的Surface和相机预览的Surface是同一个,否则会因为没有视频输入导致录制失败。未完成的输出文件配置与权限问题
你的mRecorder.setOutputFile(createFile()...代码不完整,这里要注意两点:createFile()必须返回可写入的合法路径——要提前检查存储权限(Android 10+建议用Scoped Storage,避免申请全存储权限),且文件后缀要和CamcorderProfile的格式匹配(比如QUALITY_HIGH通常对应.mp4)。- 必须确保已经申请并获取了
RECORD_AUDIO、CAMERA这两个核心权限,缺少任何一个都会导致MediaRecorder初始化失败。
遗漏了MediaRecorder的
prepare()调用
MediaRecorder的调用有严格的顺序要求:setAudioSource/setVideoSource → setProfile/setOutputFormat → setOutputFile → setSurface/setPreviewDisplay → prepare() → start()
你的代码里完全没有mRecorder.prepare()这一步!不调用prepare()就直接start(),会立刻抛出IllegalStateException,这是导致崩溃的高频原因。CamcorderProfile的兼容性问题
CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)不是所有设备都支持,部分低端设备可能没有这个高画质配置。建议先做兼容性检查:if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH)) { CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); mRecorder.setProfile(cpHigh); } else { // 降级到兼容的配置,比如QUALITY_MEDIUM CamcorderProfile cpMedium = CamcorderProfile.get(CamcorderProfile.QUALITY_MEDIUM); mRecorder.setProfile(cpMedium); }
内容的提问来源于stack exchange,提问作者Pinky

