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

Xamarin.Forms项目iOS/Android端内嵌播放YouTube视频求原型指导

嘿,完全理解你作为Xamarin.Forms新手赶项目的焦虑!WebView确实不是跨平台播放YouTube视频的靠谱选择,不同设备的WebView差异大,编解码支持也乱。咱们直接用原生播放器+自定义渲染器来实现,操作真的很简单,我给你一个极简原型,一步步来:

第一步:创建Xamarin.Forms共享项目的自定义视频控件

先定义一个基础控件,用来承载两端的原生播放器,还能绑定YouTube视频ID:

using Xamarin.Forms;

namespace YourProjectNamespace
{
    public class NativeVideoPlayer : View
    {
        // 用于绑定YouTube视频ID的可绑定属性
        public static readonly BindableProperty VideoIdProperty =
            BindableProperty.Create(nameof(VideoId), typeof(string), typeof(NativeVideoPlayer), string.Empty);

        public string VideoId
        {
            get => (string)GetValue(VideoIdProperty);
            set => SetValue(VideoIdProperty, value);
        }
    }
}
第二步:实现iOS端自定义渲染器

iOS用AVPlayer来处理YouTube视频(它支持直接解析YouTube的播放链接),代码如下:

using AVKit;
using AVFoundation;
using YourProjectNamespace;
using YourProjectNamespace.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(NativeVideoPlayer), typeof(NativeVideoPlayerRenderer))]
namespace YourProjectNamespace.iOS
{
    public class NativeVideoPlayerRenderer : ViewRenderer<NativeVideoPlayer, AVPlayerViewController>
    {
        private AVPlayer _player;

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

            if (Control == null && e.NewElement != null)
            {
                // 通过视频ID拼接YouTube播放链接
                var videoUrl = $"https://www.youtube.com/watch?v={e.NewElement.VideoId}";
                if (AVPlayerItem.TryGetPlaybackMetadataIdentifier(videoUrl, out var playbackId))
                {
                    var playerItem = AVPlayerItem.FromPlaybackMetadataIdentifier(playbackId);
                    _player = new AVPlayer(playerItem);
                    var playerVC = new AVPlayerViewController
                    {
                        Player = _player,
                        ShowsPlaybackControls = true // 显示播放控件
                    };

                    SetNativeControl(playerVC);
                }
            }

            // 清理旧资源
            if (e.OldElement != null)
            {
                _player?.Pause();
                _player = null;
            }
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            // 当视频ID更新时重新加载视频
            if (e.PropertyName == NativeVideoPlayer.VideoIdProperty.PropertyName && Element != null)
            {
                _player?.Pause();
                var videoUrl = $"https://www.youtube.com/watch?v={Element.VideoId}";
                if (AVPlayerItem.TryGetPlaybackMetadataIdentifier(videoUrl, out var playbackId))
                {
                    var playerItem = AVPlayerItem.FromPlaybackMetadataIdentifier(playbackId);
                    _player?.ReplaceCurrentItemWithPlayerItem(playerItem);
                    _player?.Play();
                }
            }
        }
    }
}
第三步:实现Android端自定义渲染器

Android用默认的VideoView来播放,注意:YouTube官方不直接提供视频流URL,这里用简化的解析方式,如果你需要更稳定的播放,可以用ExoPlayer绑定库(它对YouTube视频支持更好)。代码如下:

using Android.App;
using Android.Widget;
using YourProjectNamespace;
using YourProjectNamespace.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(NativeVideoPlayer), typeof(NativeVideoPlayerRenderer))]
namespace YourProjectNamespace.Droid
{
    public class NativeVideoPlayerRenderer : ViewRenderer<NativeVideoPlayer, VideoView>
    {
        private MediaController _mediaControls;

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

            if (Control == null && e.NewElement != null)
            {
                var videoView = new VideoView(Context);
                // 添加播放控件
                _mediaControls = new MediaController(Context);
                _mediaControls.SetAnchorView(videoView);
                videoView.SetMediaController(_mediaControls);

                SetNativeControl(videoView);
                LoadVideo(e.NewElement.VideoId);
            }

            // 清理旧资源
            if (e.OldElement != null)
            {
                Control?.StopPlayback();
                _mediaControls?.Dispose();
            }
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            // 更新视频ID时重新加载
            if (e.PropertyName == NativeVideoPlayer.VideoIdProperty.PropertyName && Element != null)
            {
                LoadVideo(Element.VideoId);
            }
        }

        private void LoadVideo(string videoId)
        {
            // 注意:这里用的是简化的视频流解析方式,实际项目建议使用ExoPlayer以获得更稳定的播放体验
            var streamUrl = $"https://www.youtube.com/get_video_info?video_id={videoId}";
            Control?.SetVideoPath(streamUrl);
            Control?.Start();
        }
    }
}
第四步:在Xamarin.Forms页面中使用控件

直接在XAML里引用自定义控件,绑定视频ID即可:

<?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:YourProjectNamespace"
             x:Class="YourProjectNamespace.MainPage">

    <StackLayout Padding="20">
        <!-- 替换成你需要播放的YouTube视频ID -->
        <local:NativeVideoPlayer VideoId="dQw4w9WgXcQ" HeightRequest="300" />
    </StackLayout>

</ContentPage>
关键注意事项
  • iOS端:需要在Info.plist中添加网络权限,允许加载网络资源,添加NSAppTransportSecurity配置,允许HTTP/HTTPS请求。
  • Android端:在AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />。
  • YouTube视频流:官方不支持直接获取流URL,Android的示例用了简化方案,如果你需要生产环境稳定播放,建议切换到ExoPlayer,它有专门的YouTube播放支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:39:19