.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。
设置所需权限:
Camera.NeedPermissionsSet = NeedPermissions.Camera | NeedPermissions.Gallery | NeedPermissions.Microphone;
在画布首次渲染后或导航事件中启动摄像头。
摄像头控制与帧处理
IsOn 属性控制启动/停止。应用切换到后台时摄像头会自动暂停。预览通过 Display 属性中的 SkiaImage 渲染,非常适合添加模糊或其他特效。
启用实时处理:
UseRealtimeVideoProcessing = true;
ProcessFrame = OnFrameProcessing;
ProcessPreview = OnFrameProcessing;
处理函数接收 DrawableFrame,包含 SKCanvas、SKImage、Scale 和 IsPreview 标志。在录制过程中,预览显示处理后帧的缩放版本——所见即所得(WYSIWYG)。
以下是自定义控制器 AppCamera 示例:
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);
IsPreRecording 和 IsRecording 属性支持绑定,用于 UI 更新。取消时清空缓冲区:StopVideoRecording(true)。
非常适合体育、野生动物或动作触发的安防摄像头等不可预测场景。
SKSL 着色器实现视频特效
使用 SKSL 着色器为预览、照片和视频应用滤镜。重写 RenderPreviewForProcessing 和 RenderFrameForRecording:
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
暂无评论。