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

如何在Xamarin.Forms中设置自定义相机视频分辨率为480P/720P

解决Xamarin.Forms中自定义相机设置480P/720P视频分辨率的问题

嘿,这个问题我之前也踩过坑!Plugin.Media自带的VideoQuality枚举确实只提供了有限的选项,要实现480P或720P的视频录制,得直接深入原生平台去配置相机参数——毕竟这个插件只是封装了原生的相机能力,默认没暴露中间分辨率的配置入口。下面分Android和iOS两个平台给你具体的实现方案:

Android 端实现步骤

Android原生相机支持通过Intent参数直接指定视频分辨率,我们可以绕开Plugin.Media的默认枚举,自己构建录制Intent:

  1. 在Android项目中创建一个依赖服务接口的实现(比如IVideoRecorder),用来启动自定义分辨率的视频录制:
using Android.App;
using Android.Content;
using Android.Provider;
using Xamarin.Forms;

[assembly: Dependency(typeof(AndroidVideoRecorder))]
namespace YourAppName.Droid
{
    public class AndroidVideoRecorder : IVideoRecorder
    {
        public void StartVideoRecording(int width, int height)
        {
            var intent = new Intent(MediaStore.ActionVideoCapture);
            // 设置目标分辨率
            intent.PutExtra(MediaStore.ExtraVideoWidth, width);
            intent.PutExtra(MediaStore.ExtraVideoHeight, height);
            // 可选:设置视频比特率,提升画质(按需调整)
            intent.PutExtra(MediaStore.ExtraVideoBitRate, 5 * 1024 * 1024); // 5Mbps

            ((Activity)Forms.Context).StartActivityForResult(intent, 100);
        }
    }
}
  1. 在Forms项目中定义对应的接口:
public interface IVideoRecorder
{
    void StartVideoRecording(int width, int height);
}
  1. 调用时直接指定分辨率:
// 启动720P录制(1280x720)
DependencyService.Get<IVideoRecorder>().StartVideoRecording(1280, 720);
// 启动480P录制(640x480)
// DependencyService.Get<IVideoRecorder>().StartVideoRecording(640, 480);
  1. 最后记得在Android项目的MainActivity中重写OnActivityResult,处理录制完成后的视频文件:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == Result.Ok)
    {
        var videoUri = data.Data;
        // 这里可以处理视频文件,比如获取路径、上传等
    }
}

iOS 端实现步骤

iOS原生的UIImagePickerController支持通过VideoQuality属性设置录制预设,我们同样可以通过依赖服务来实现:

  1. 在iOS项目中实现IVideoRecorder接口:
using AVFoundation;
using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(IosVideoRecorder))]
namespace YourAppName.iOS
{
    public class IosVideoRecorder : IVideoRecorder
    {
        public void StartVideoRecording(int width, int height)
        {
            var picker = new UIImagePickerController();
            picker.SourceType = UIImagePickerControllerSourceType.Camera;
            picker.MediaTypes = new string[] { UTType.Movie };
            
            // 根据分辨率选择对应的预设
            if (width == 1280 && height == 720)
            {
                picker.VideoQuality = UIImagePickerControllerQualityType.Type1280x720;
            }
            else if (width == 640 && height == 480)
            {
                picker.VideoQuality = UIImagePickerControllerQualityType.Type640x480;
            }
            
            // 弹出录制界面
            UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(picker, true, null);
            
            // 处理录制完成事件
            picker.FinishedPickingMedia += (sender, e) =>
            {
                var videoUrl = e.MediaUrl;
                // 处理视频文件
                picker.DismissViewController(true, null);
            };
        }
    }
}
  1. 同样在Forms项目中调用依赖服务即可,和Android端的调用代码一致。

注意事项

  • 权限配置:Android需要在AndroidManifest.xml中添加CAMERA和RECORD_AUDIO权限;iOS需要在Info.plist中添加NSCameraUsageDescription和NSMicrophoneUsageDescription权限描述。
  • 设备兼容性:部分老旧设备可能不支持指定的分辨率,建议在启动录制前先检查设备是否支持目标分辨率(Android可以通过CameraManager查询,iOS可以通过AVCaptureSession的CanSetSessionPreset方法判断)。
  • 替代方案:如果觉得依赖原生代码太繁琐,也可以考虑使用更灵活的相机库,但Plugin.Media的场景下,上面的原生配置方案最直接。

内容的提问来源于stack exchange,提问作者Smile Azeez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:20:51