如何在Android平台下录制H265(HEVC)编码格式的视频
解决方案
你当前使用的MediaStore.ACTION_VIDEO_CAPTURE调用系统相机录制的方式,指定编码格式需要分场景适配:
方案1:调用系统相机适配(仅Android 13+生效)
Android 13(API 33)开始官方新增了MediaStore.EXTRA_VIDEO_ENCODER参数,可向系统相机指定期望的视频编码格式,修改后代码如下:
private void recordVideo() { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // set video quality intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the video file name // 新增:Android 13及以上指定HEVC编码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.putExtra(MediaStore.EXTRA_VIDEO_ENCODER, MediaRecorder.VideoEncoder.HEVC); } // start the video capture Intent startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE); }
注意:该参数仅为给系统相机的建议值,最终是否输出HEVC格式,取决于你所用的系统相机App是否支持接收该参数,三星S10自带相机多数版本可支持该配置。
方案2:全版本兼容方案(自定义录制逻辑)
如果你的App需要兼容Android 13以下版本,或者系统相机不响应上述参数,需要放弃调用系统相机Intent,自行实现录制逻辑,核心是配置视频编码器为HEVC,两种常用实现方式:
方式A:使用MediaRecorder实现
核心配置代码如下:
// 先检查设备是否支持HEVC编码 private boolean isHevcSupported() { for (int i = 0; i < MediaCodecList.getCodecCount(); i++) { MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); if (!codecInfo.isEncoder()) continue; String[] types = codecInfo.getSupportedTypes(); for (String type : types) { if (type.equalsIgnoreCase("video/hevc")) { return true; } } } return false; } // MediaRecorder配置核心逻辑 MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 指定HEVC编码 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.HEVC); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 其余配置分辨率、比特率、输出文件、预览surface等逻辑自行补充
方式B:使用CameraX实现(更简单,兼容性更好)
CameraX是Jetpack推出的相机组件,适配绝大多数Android设备,核心配置如下:
VideoCapture videoCapture = new VideoCapture.Builder() .setVideoEncoderMimeType(MimeTypes.VIDEO_H265) // 指定HEVC编码 .setTargetResolution(new Size(1920, 1080)) .setBitRate(10_000_000) .build();
自行实现录制逻辑需要提前申请
CAMERA、RECORD_AUDIO以及对应存储权限。
内容的提问来源于stack exchange,提问作者angel_30
相关产品推荐
相关产品推荐

