返回首页

SkiaCamera:在 .NET MAUI 中的视频效果和字幕

本文描述了将 SkiaCamera 集成到 .NET MAUI 中用于实时视频处理:AI 字幕、SKSL 着色器、预录制和叠加层。安装、ProcessFrame/Preview 回调和 UI 设置的分解。带有 GPU 加速的照片/视频代码示例。

.NET MAUI SkiaCamera 中的视频 AI 字幕和着色器
Advertisement 728x90

.NET MAUI 中使用 SkiaCamera 实现实时视频处理与 AI 字幕

SkiaCamera 让你能从移动设备摄像头实时捕获照片和视频,同时应用特效、叠加层以及 AI 生成的字幕。每帧图像在编码前都会经过 Skia 画布处理,无需后期制作即可将处理后的数据无缝集成到最终 MP4 文件中。快速上手,只需安装 DrawnUi.Maui.Camera NuGet 包,并在 MauiProgram.cs 中用 builder.UseDrawnUi() 初始化 DrawnUI。

将组件放置在 draw:Canvas 中,并设置 RenderingMode="Accelerated"

<Grid VerticalOptions="Fill" HorizontalOptions="Fill">
    <draw:Canvas RenderingMode="Accelerated" Gestures="Lock">
        <camera:SkiaCamera x:Name="Camera" CaptureMode="Video" />
    </draw:Canvas>
</Grid>

将容器固定为 Fill 以避免渲染伪影。为确保视频方向正确,将应用锁定为竖屏模式:Android 通过 MainActivity.cs 中的 ScreenOrientation.SensorPortrait,iOS 通过 Info.plist 中的 UISupportedInterfaceOrientations

Google AdInline article slot

设置所需权限:

Camera.NeedPermissionsSet = NeedPermissions.Camera | NeedPermissions.Gallery | NeedPermissions.Microphone;

在画布首次渲染后或导航事件中启动摄像头。

摄像头控制与帧处理

IsOn 属性控制启动/停止。应用切换到后台时摄像头会自动暂停。预览通过 Display 属性中的 SkiaImage 渲染,非常适合添加模糊或其他特效。

Google AdInline article slot

启用实时处理:

UseRealtimeVideoProcessing = true;
ProcessFrame = OnFrameProcessing;
ProcessPreview = OnFrameProcessing;

处理函数接收 DrawableFrame,包含 SKCanvasSKImageScaleIsPreview 标志。在录制过程中,预览显示处理后帧的缩放版本——所见即所得(WYSIWYG)。

以下是自定义控制器 AppCamera 示例:

Google AdInline article slot
public partial class AppCamera : SkiaCamera
{
    public AppCamera()
    {
        NeedPermissionsSet = NeedPermissions.Camera | NeedPermissions.Gallery | NeedPermissions.Microphone;
        InjectGpsLocation = true;
        UseRealtimeVideoProcessing = true;
        VideoQuality = VideoQuality.Standard;
        EnableAudioRecording = true;
        ProcessFrame = OnFrameProcessing;
        ProcessPreview = OnFrameProcessing;
    }
}

带预录制的视频录制

开始录制:

if (CameraControl.IsRecording)
    await CameraControl.StopVideoRecording();
else
    await CameraControl.StartVideoRecording();

录制完成后移入相册:

private async void OnVideoRecordingSuccess(object sender, CapturedVideo capturedVideo)
{
    var publicPath = await CameraControl.MoveVideoToGalleryAsync(capturedVideo, MauiProgram.Album);
}

预录制使用内存环形缓冲区,在按下录制键前捕获 3–10 秒内容:

CameraControl.EnablePreRecording = true;
CameraControl.PreRecordDuration = TimeSpan.FromSeconds(5);

IsPreRecordingIsRecording 属性支持绑定,用于 UI 更新。取消时清空缓冲区:StopVideoRecording(true)

非常适合体育、野生动物或动作触发的安防摄像头等不可预测场景。

SKSL 着色器实现视频特效

使用 SKSL 着色器为预览、照片和视频应用滤镜。重写 RenderPreviewForProcessingRenderFrameForRecording

CameraControl.VideoEffect = ShaderEffect.Movie;

着色器在编码前渲染到 SKPaint 上,将特效直接烘焙进 MP4。UI 示例包含滤镜切换器:黑白片、电影效果等。

AI 字幕与音频可视化

基于 OpenAI 的字幕生成实时集成,并直接嵌入视频。音频可视化器(EQ)作为响应式叠加层,会根据设备旋转(通过 RotationChanged)进行调整。

设置区域:

  • 输入:摄像头选择、格式、模式。
  • 处理:音频监控、字幕、着色器。
  • 输出:音频/视频、预录制、质量。

UI 会独立旋转按钮图标,而不受屏幕锁定影响。

核心要点

  • SkiaCamera 通过 Skia 画布在 GPU 上处理帧,实现实时特效并直接烘焙到最终视频。
  • 预录制使用环形缓冲区捕获触发前事件,无需持续写入磁盘。
  • SKSL 着色器应用于预览和录制,无需后期处理;ProcessFrame/Preview 回调区分模式。
  • OpenAI AI 字幕和 EQ 叠加直接嵌入 MP4;UI 自适应方向。
  • 后台自动暂停,支持录制/预录制绑定属性。

— Editorial Team

Advertisement 728x90

继续阅读