如何在Xamarin.Forms中设置自定义相机视频分辨率为480P/720P
解决Xamarin.Forms中自定义相机设置480P/720P视频分辨率的问题
嘿,这个问题我之前也踩过坑!Plugin.Media自带的VideoQuality枚举确实只提供了有限的选项,要实现480P或720P的视频录制,得直接深入原生平台去配置相机参数——毕竟这个插件只是封装了原生的相机能力,默认没暴露中间分辨率的配置入口。下面分Android和iOS两个平台给你具体的实现方案:
Android 端实现步骤
Android原生相机支持通过Intent参数直接指定视频分辨率,我们可以绕开Plugin.Media的默认枚举,自己构建录制Intent:
- 在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); } } }
- 在Forms项目中定义对应的接口:
public interface IVideoRecorder { void StartVideoRecording(int width, int height); }
- 调用时直接指定分辨率:
// 启动720P录制(1280x720) DependencyService.Get<IVideoRecorder>().StartVideoRecording(1280, 720); // 启动480P录制(640x480) // DependencyService.Get<IVideoRecorder>().StartVideoRecording(640, 480);
- 最后记得在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属性设置录制预设,我们同样可以通过依赖服务来实现:
- 在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); }; } } }
- 同样在Forms项目中调用依赖服务即可,和Android端的调用代码一致。
注意事项
- 权限配置:Android需要在
AndroidManifest.xml中添加CAMERA和RECORD_AUDIO权限;iOS需要在Info.plist中添加NSCameraUsageDescription和NSMicrophoneUsageDescription权限描述。 - 设备兼容性:部分老旧设备可能不支持指定的分辨率,建议在启动录制前先检查设备是否支持目标分辨率(Android可以通过
CameraManager查询,iOS可以通过AVCaptureSession的CanSetSessionPreset方法判断)。 - 替代方案:如果觉得依赖原生代码太繁琐,也可以考虑使用更灵活的相机库,但Plugin.Media的场景下,上面的原生配置方案最直接。
内容的提问来源于stack exchange,提问作者Smile Azeez
相关产品推荐
相关产品推荐

