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
相关产品推荐
相关产品推荐

