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

Xamarin.Android中基于Google.apis.youtube.v3播放YouTube直播流的技术咨询

我懂你的困扰——想用Google.Apis.YouTube.v3在Xamarin.Android里实现YouTube直播流播放,iframe功能太有限满足不了需求,但官方文档对新手太不友好,还找不到带播放器的完整示例对吧?别慌,我一步步给你拆解清楚怎么做:

第一步:先搞定API授权和项目配置
  • 首先得在Google Cloud Console里创建项目,启用YouTube Data API v3,然后生成一个API密钥(核心流程就是搜API库找到YouTube Data API v3启用,再去「凭据」页面创建API密钥)
  • 打开你的Xamarin.Android项目,通过NuGet安装两个依赖包:Google.Apis.YouTube.v3和Google.Apis.Core,这是调用API的基础
第二步:用API获取直播流的播放地址

划重点:Google.Apis.YouTube.v3本身不带播放器,它的作用是获取YouTube的各类数据(比如直播流的播放源、标题、状态)。所以你得先调用API拿到直播的HLS流地址,再用Android的播放器来播放。

给你一个获取直播流地址的简单代码示例:

using Google.Apis.YouTube.v3;
using Google.Apis.Services;

public async Task<string> FetchLiveStreamHlsUrl(string liveVideoId)
{
    // 初始化YouTube服务实例
    var youtubeService = new YouTubeService(new BaseClientService.Initializer()
    {
        ApiKey = "你的Google Cloud API密钥",
        ApplicationName = "你的Xamarin.Android应用名称"
    });

    // 请求视频的播放器相关信息
    var videoRequest = youtubeService.Videos.List("player");
    videoRequest.Id = liveVideoId; // 填入直播的视频ID(从直播URL里提取,比如https://youtube.com/watch?v=XXX里的XXX)

    var response = await videoRequest.ExecuteAsync();
    if (response.Items.Count == 0)
        return null;

    // 从返回的嵌入HTML里解析HLS流地址(格式是.m3u8结尾的链接)
    var embedHtml = response.Items[0].Player.EmbedHtml;
    var hlsMatch = System.Text.RegularExpressions.Regex.Match(embedHtml, @"https:\/\/.*\.m3u8");
    
    return hlsMatch.Success ? hlsMatch.Value : null;
}
第三步:用ExoPlayer播放直播流

拿到HLS地址后,推荐用ExoPlayer来播放(它对直播流的兼容性和稳定性都比原生MediaPlayer好):

  1. 先通过NuGet安装两个播放器依赖:Xamarin.AndroidX.Media3.ExoPlayer和Xamarin.AndroidX.Media3.UI
  2. 在你的布局文件里添加PlayerView控件:
<androidx.media3.ui.PlayerView
    android:id="@+id/live_player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. 在Activity里初始化播放器并加载直播流:
using AndroidX.Media3.ExoPlayer;
using AndroidX.Media3.Common;
using AndroidX.Media3.ExoSource.Hls;
using AndroidX.Media3.Datasource.Default;

private ExoPlayer _livePlayer;
private PlayerView _playerView;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.your_activity_layout);

    _playerView = FindViewById<PlayerView>(Resource.Id.live_player_view);
    // 初始化ExoPlayer实例
    _livePlayer = new ExoPlayer.Builder(this).Build();
    _playerView.Player = _livePlayer;

    // 获取直播流地址并播放
    var hlsUrl = await FetchLiveStreamHlsUrl("你的直播视频ID");
    if (!string.IsNullOrEmpty(hlsUrl))
    {
        // 创建HLS媒体源
        var dataSourceFactory = new DefaultHttpDataSource.Factory();
        var hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory)
            .CreateMediaSource(MediaItem.FromUri(hlsUrl));
        
        // 准备并开始播放
        _livePlayer.SetMediaSource(hlsMediaSource);
        _livePlayer.Prepare();
        _livePlayer.PlayWhenReady = true;
    }
}

protected override void OnDestroy()
{
    base.OnDestroy();
    // 务必释放播放器资源,避免内存泄漏
    _livePlayer.Release();
}
新手必看的关键注意点
  • 别搞混API和播放器的分工:Google.Apis.YouTube.v3只负责拿数据,播放得靠Android端的播放器实现,这是很多新手容易踩的坑
  • API有配额限制,不要频繁调用接口,比如可以缓存直播流地址,减少重复请求
  • 如果需要直播状态、弹幕互动这类进阶功能,可以调用API的LiveStreams.List或LiveChatMessages.List接口获取对应数据

内容的提问来源于stack exchange,提问作者A.aga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:07:29