调用MediaStore.ACTION_VIDEO_CAPTURE拍摄获取真实MP4视频的问题
解决方案
根因说明
你当前仅指定了文件后缀和MediaStore存储的MIME类型,调用MediaStore.ACTION_VIDEO_CAPTURE时使用的是系统自带相机应用,其输出格式默认遵循系统相机自身配置,多数Android设备默认输出3GP封装格式,仅修改后缀和MIME类型不会改变实际的音视频编码、封装逻辑,因此会得到后缀为MP4实际为3GP的伪格式文件,无法被iPhone识别。
另外你的代码中存在高危操作:getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,null); 这行代码会无差别删除用户设备上所有已入库的视频文件,必须立即删除。
修复方案
方案1:补充Intent强制格式参数(适配90%以上机型)
在启动录像的Intent中额外添加编码、格式、质量参数,强制系统相机输出H.264编码+MP4封装的标准视频,修改后的代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { ContentValues values = new ContentValues(3); values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); values.put(MediaStore.Video.Media.DISPLAY_NAME, "record_video_" + System.currentTimeMillis()); values.put(MediaStore.Video.Media.TITLE, "record_video"); // 删掉原来的高危删除代码!!! Uri outputFileUri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); Intent captureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); // 新增强制格式参数 captureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 1为最高质量 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { captureIntent.putExtra(MediaStore.EXTRA_OUTPUT_FORMAT, "video/mp4"); } captureIntent.putExtra("android.intent.extra.videoEncoder", MediaRecorder.VideoEncoder.H264); captureIntent.putExtra("android.intent.extra.audioEncoder", MediaRecorder.AudioEncoder.AAC); activityResultLauncher.launch(captureIntent); } else { Intent captureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), "video_" + System.currentTimeMillis() + ".mp4"); Uri outputFileUri = Uri.fromFile(file); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); // 低版本同样添加强制参数 captureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); captureIntent.putExtra("android.intent.extra.videoEncoder", MediaRecorder.VideoEncoder.H264); captureIntent.putExtra("android.intent.extra.audioEncoder", MediaRecorder.AudioEncoder.AAC); activityResultLauncher.launch(captureIntent); }
方案2:自行实现录像逻辑(全机型适配)
如果遇到定制ROM不兼容上述Intent参数的情况,可以直接使用MediaRecorder或者CameraX自行实现录像功能,完全可控输出格式:
- 配置
MediaRecorder时指定setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) - 视频编码设置为
MediaRecorder.VideoEncoder.H264 - 音频编码设置为
MediaRecorder.AudioEncoder.AAC
按上述配置输出的视频为标准MP4格式,可直接在iPhone、Windows、macOS等全平台播放。
内容的提问来源于stack exchange,提问作者Sam By
相关产品推荐
相关产品推荐

