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

.NET MAUI实现同一相机视图中拍照与录视频功能需求

在同一相机视图中实现拍照/录像切换的解决方案

MediaPicker确实仅提供独立的CapturePhotoAsync()和CaptureVideoAsync()方法,无法在同一相机界面内切换拍摄模式。要实现需求,你需要绕开MediaPicker,直接使用平台原生相机组件或第三方跨平台库:

方案1:平台特定原生实现

针对不同平台编写原生代码,直接控制相机的拍摄模式切换:

Android(CameraX)

  1. 集成CameraX依赖到Android项目中
  2. 配置相机预览界面,添加拍照和录像的切换按钮
  3. 通过ImageCapture和VideoCapture对象分别处理拍照和录像逻辑,点击切换按钮时启用/禁用对应功能

核心代码示例:

// 初始化ImageCapture和VideoCapture
val imageCapture = ImageCapture.Builder().build()
val videoCapture = VideoCapture.Builder().build()

// 切换按钮点击事件
toggleBtn.setOnClickListener {
    if (isPhotoMode) {
        // 切换到录像模式,启用videoCapture
        videoCapture.startRecording(outputFileOptions, executor, callback)
    } else {
        // 切换到拍照模式,停止录像并执行拍照
        videoCapture.stopRecording()
        imageCapture.takePicture(outputFileOptions, executor, callback)
    }
    isPhotoMode = !isPhotoMode
}

iOS(AVFoundation)

  1. 使用AVCaptureSession搭建相机会话
  2. 添加AVCapturePhotoOutput和AVCaptureMovieFileOutput输出对象
  3. 通过切换输出对象的启用状态来实现拍摄模式切换

核心代码示例:

let captureSession = AVCaptureSession()
let photoOutput = AVCapturePhotoOutput()
let videoOutput = AVCaptureMovieFileOutput()

// 初始化时添加两个输出
captureSession.addOutput(photoOutput)
captureSession.addOutput(videoOutput)

// 切换按钮点击事件
@IBAction func toggleCaptureMode(_ sender: UIButton) {
    if isPhotoMode {
        // 切换到录像模式,禁用拍照输出并开始录像
        photoOutput.isEnabled = false
        videoOutput.startRecording(to: outputURL, recordingDelegate: self)
    } else {
        // 切换到拍照模式,停止录像并启用拍照输出
        videoOutput.stopRecording()
        photoOutput.isEnabled = true
        let photoSettings = AVCapturePhotoSettings()
        photoOutput.capturePhoto(with: photoSettings, delegate: self)
    }
    isPhotoMode = !isPhotoMode
}

方案2:使用第三方跨平台库

如果不想编写平台特定代码,可以选择成熟的跨平台相机库,比如Camera.MAUI(MAUI专用库),这类库通常支持在同一相机视图内切换拍照和录像模式。

以Camera.MAUI为例:

  1. 安装NuGet包Camera.MAUI
  2. 在XAML中添加相机预览控件
  3. 绑定拍照、录像按钮的命令,通过库提供的API切换拍摄模式

核心XAML示例:

<camera:CameraView x:Name="cameraView" 
                   CaptureMode="Photo"
                   HorizontalOptions="Fill"
                   VerticalOptions="Fill"/>

<Button Text="切换模式" 
        Clicked="ToggleCaptureMode_Clicked"/>
<Button Text="拍摄/停止" 
        Clicked="Capture_Clicked"/>

后台代码:

private void ToggleCaptureMode_Clicked(object sender, EventArgs e)
{
    cameraView.CaptureMode = cameraView.CaptureMode == CameraCaptureMode.Photo 
        ? CameraCaptureMode.Video 
        : CameraCaptureMode.Photo;
}

private async void Capture_Clicked(object sender, EventArgs e)
{
    if (cameraView.CaptureMode == CameraCaptureMode.Photo)
    {
        var photo = await cameraView.CapturePhotoAsync();
        // 处理拍摄后的照片
    }
    else
    {
        if (!cameraView.IsRecording)
        {
            await cameraView.StartRecordingAsync(outputPath);
        }
        else
        {
            await cameraView.StopRecordingAsync();
            // 处理录制后的视频
        }
    }
}

注意:使用第三方库时要提前配置好相机、存储权限,确保版本与项目框架兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:26