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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:18:00