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

Xamarin Forms C#中如何为MediaRecorder创建SurfaceView?

在Xamarin Forms Android中实现用于MediaRecorder的SurfaceView

直接按以下步骤部署就能得到可关联MediaRecorder的SurfaceView:

1. 在Forms项目中定义自定义视图

先创建一个空的自定义View,作为Android原生SurfaceView的绑定载体:

using Xamarin.Forms;

namespace YourAppNamespace
{
    public class MediaSurfaceView : View
    {
        // 仅作为自定义渲染器的绑定目标,无需额外逻辑
    }
}

2. 编写Android端自定义渲染器

在Android项目中创建渲染器类,将Forms的MediaSurfaceView映射为Android原生SurfaceView,并处理Surface的生命周期事件:

using Android.Content;
using Android.Views;
using YourAppNamespace;
using YourAppNamespace.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MediaSurfaceView), typeof(MediaSurfaceViewRenderer))]
namespace YourAppNamespace.Droid
{
    public class MediaSurfaceViewRenderer : ViewRenderer<MediaSurfaceView, Android.Views.SurfaceView>
    {
        private Android.Views.SurfaceView _surfaceView;
        // 暴露SurfaceHolder给外部,方便关联MediaRecorder
        public SurfaceHolder SurfaceHolder => _surfaceView?.Holder;

        public MediaSurfaceViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<MediaSurfaceView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                _surfaceView = new Android.Views.SurfaceView(Context);
                SetNativeControl(_surfaceView);
                // 监听Surface创建/销毁事件
                _surfaceView.Holder.AddCallback(new SurfaceHolderCallback(this));
            }
        }

        // 处理Surface生命周期的回调类
        private class SurfaceHolderCallback : Java.Lang.Object, ISurfaceHolderCallback
        {
            private readonly MediaSurfaceViewRenderer _renderer;

            public SurfaceHolderCallback(MediaSurfaceViewRenderer renderer)
            {
                _renderer = renderer;
            }

            public void SurfaceCreated(ISurfaceHolder holder)
            {
                // Surface创建完成后,在这里将其绑定到MediaRecorder
                // 示例:_yourMediaRecorder.SetPreviewDisplay(holder.Surface);
            }

            public void SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height)
            {
                // 尺寸变化时可调整MediaRecorder的视频参数
            }

            public void SurfaceDestroyed(ISurfaceHolder holder)
            {
                // Surface销毁时记得释放MediaRecorder资源
            }
        }
    }
}

3. 在Forms页面中使用自定义SurfaceView

通过XAML或代码将MediaSurfaceView添加到页面布局:

XAML示例

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.MainPage">

    <Grid>
        <!-- 让SurfaceView占满整个页面 -->
        <local:MediaSurfaceView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"/>
    </Grid>
</ContentPage>

4. 关联MediaRecorder到Surface

在Android项目的业务代码中,获取渲染器的SurfaceHolder并绑定到MediaRecorder:

// 获取Forms页面中的MediaSurfaceView实例
var mediaSurface = (MediaSurfaceView)FindByName("YourMediaSurfaceView");
// 获取对应的Android渲染器
var renderer = Platform.GetRenderer(mediaSurface) as MediaSurfaceViewRenderer;

if (renderer?.SurfaceHolder != null)
{
    var mediaRecorder = new MediaRecorder();
    // 配置MediaRecorder基础参数
    mediaRecorder.SetAudioSource(AudioSource.Mic);
    mediaRecorder.SetVideoSource(VideoSource.Camera);
    mediaRecorder.SetOutputFormat(OutputFormat.Mpeg4);
    mediaRecorder.SetAudioEncoder(AudioEncoder.AmrNb);
    mediaRecorder.SetVideoEncoder(VideoEncoder.Mpeg4Sp);
    // 设置输出文件路径
    mediaRecorder.SetOutputFile($"{Android.OS.Environment.ExternalStorageDirectory.AbsolutePath}/recorded_video.mp4");
    
    // 将Surface绑定到MediaRecorder
    mediaRecorder.SetPreviewDisplay(renderer.SurfaceHolder.Surface);
    
    mediaRecorder.Prepare();
    mediaRecorder.Start();
}

权限配置

别忘了在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:10:25