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

如何提升.NET MAUI iOS应用中MediaPicker拍摄视频的分辨率?

提升.NET MAUI iOS应用拍摄视频/图片分辨率的方法

1. 优化MediaPicker参数配置

MediaPicker的CaptureVideoAsync和CapturePhotoAsync提供了重载,可通过MediaPickerOptions指定画质参数,优先利用平台支持的最高规格:

视频拍摄优化

var videoOptions = new MediaPickerOptions
{
    Title = "拍摄高清视频",
    VideoQuality = VideoQuality.UltraHigh // 对应iOS设备支持的4K分辨率(iOS 10+)
};

if (MediaPicker.IsCaptureSupported)
{
    FileResult file = await MediaPicker.CaptureVideoAsync(videoOptions);
    
    if (file != null)
    {
        _localFilePath = Path.Combine(FileSystem.CacheDirectory, file.FileName);
        using Stream srcStream = await file.OpenReadAsync();
        using FileStream localFileStream = File.OpenWrite(_localFilePath);
        await srcStream.CopyToAsync(localFileStream);
        
        mediaElement.Source = MediaSource.FromFile(_localFilePath);
        SemanticScreenReader.Announce(TestLabel.Text);
    }
}
else
{
    await Shell.Current.DisplayAlert("Oops..", "Your device is not supported", "Ok");
}

图片拍摄优化

var photoOptions = new MediaPickerOptions
{
    Title = "拍摄高清照片",
    PhotoSize = PhotoSize.Maximum // 使用设备支持的最大分辨率
};

var photoFile = await MediaPicker.CapturePhotoAsync(photoOptions);
// 后续文件处理逻辑同视频

注意:MediaPicker的参数受限于平台封装,若需要更精细化的相机控制(如自定义帧率、编码格式),需调用原生API。

2. 直接调用iOS原生AVFoundation框架

通过.NET MAUI依赖服务封装iOS原生AVFoundation代码,完全控制相机的分辨率、编码等参数:

步骤1:共享项目定义接口

public interface IHighResCameraService
{
    Task<string> Capture4KVideoAsync();
    Task<string> CaptureMaxResPhotoAsync();
}

步骤2:iOS平台实现接口

[assembly: Dependency(typeof(HighResCameraService))]
namespace YourAppNamespace.iOS.Services
{
    public class HighResCameraService : IHighResCameraService
    {
        private AVCaptureSession _captureSession;
        private AVCaptureMovieFileOutput _movieOutput;
        private string _outputFilePath;

        public async Task<string> Capture4KVideoAsync()
        {
            _captureSession = new AVCaptureSession();
            // 强制设置4K分辨率预设
            _captureSession.SessionPreset = AVCaptureSession.Preset4K3840x2160;

            // 配置后置摄像头输入
            var videoDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
            if (videoDevice == null) return null;

            var videoInput = AVCaptureDeviceInput.FromDevice(videoDevice);
            if (_captureSession.CanAddInput(videoInput))
                _captureSession.AddInput(videoInput);

            // 配置麦克风输入(录制声音)
            var audioDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
            var audioInput = AVCaptureDeviceInput.FromDevice(audioDevice);
            if (_captureSession.CanAddInput(audioInput))
                _captureSession.AddInput(audioInput);

            // 配置视频输出
            _movieOutput = new AVCaptureMovieFileOutput();
            if (_captureSession.CanAddOutput(_movieOutput))
                _captureSession.AddOutput(_movieOutput);

            // 设置输出文件路径
            _outputFilePath = Path.Combine(FileSystem.CacheDirectory, $"4k_video_{DateTime.Now.Ticks}.mov");
            var outputUrl = NSUrl.FromFilename(_outputFilePath);

            // 启动会话并开始录制
            _captureSession.StartRunning();
            _movieOutput.StartRecordingToOutputFile(outputUrl, new VideoRecordingCallback(this));

            // 示例:模拟录制5秒,实际项目需替换为用户交互触发停止
            await Task.Delay(5000);
            StopVideoRecording();

            return _outputFilePath;
        }

        private void StopVideoRecording()
        {
            _movieOutput.StopRecording();
            _captureSession.StopRunning();
        }

        // 视频录制完成回调
        private class VideoRecordingCallback : AVCaptureFileOutputRecordingDelegate
        {
            private readonly HighResCameraService _service;

            public VideoRecordingCallback(HighResCameraService service) => _service = service;

            public override void DidFinishRecordingToOutputFile(AVCaptureFileOutput captureOutput, NSUrl outputFileUrl, NSObject[] connections, NSError error)
            {
                // 可在此添加录制完成后的通知或后续处理
            }
        }

        // 最高分辨率照片拍摄实现
        public async Task<string> CaptureMaxResPhotoAsync()
        {
            _captureSession = new AVCaptureSession();
            _captureSession.SessionPreset = AVCaptureSession.PresetPhoto; // 设备支持的最高照片分辨率

            var videoDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
            var videoInput = AVCaptureDeviceInput.FromDevice(videoDevice);
            if (_captureSession.CanAddInput(videoInput))
                _captureSession.AddInput(videoInput);

            var stillOutput = new AVCaptureStillImageOutput();
            stillOutput.OutputSettings = new NSDictionary(AVVideo.CodecKey, AVVideo.CodecJPEG);
            if (_captureSession.CanAddOutput(stillOutput))
                _captureSession.AddOutput(stillOutput);

            _captureSession.StartRunning();

            // 捕获照片
            var connection = stillOutput.ConnectionFromMediaType(AVMediaType.Video);
            var sampleBuffer = await stillOutput.CaptureStillImageTaskAsync(connection);
            var imageData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer);

            // 保存照片到本地
            _outputFilePath = Path.Combine(FileSystem.CacheDirectory, $"max_res_photo_{DateTime.Now.Ticks}.jpg");
            imageData.Save(_outputFilePath, false);

            _captureSession.StopRunning();
            return _outputFilePath;
        }
    }
}

步骤3:共享项目调用服务

var cameraService = DependencyService.Get<IHighResCameraService>();
var videoPath = await cameraService.Capture4KVideoAsync();
if (!string.IsNullOrEmpty(videoPath))
{
    mediaElement.Source = MediaSource.FromFile(videoPath);
}

3. 配置iOS权限

确保iOS项目Info.plist中添加相机和麦克风权限声明:

<key>NSCameraUsageDescription</key>
<string>需要访问相机拍摄高清视频和照片</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风录制视频声音</string>

内容的提问来源于stack exchange,提问作者V. Braz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:35:04