Android YouTube 播放器直播

Android YouTube Player Livestream

我是 Android Dev 的新手,Java,总的来说 - 请耐心等待。我一直在试验 GitHub PierfrancescoSoffritti android-youtube-player 作为 Android 的可自定义开源 YouTube 播放器,它非常有效,但有一个例外。

主代码使用了一个videoID来播放:

YouTubePlayerView youTubePlayerView = findViewById(R.id.youtube_player_view);
getLifecycle().addObserver(youTubePlayerView);

youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
  @Override
  public void onReady(@NonNull YouTubePlayer youTubePlayer) {
    String videoId = "xxxx";
    youTubePlayer.loadVideo(videoId, 0);
  }
});

问题是,我想将它用于 YouTube 直播,如果重新创建流,videoId 可以更改。

如果您要嵌入网页,YouTube 提供了一种解决此问题的方法,即不使用 videoID,而是使用 channelID。这样,它将始终嵌入正确的当前正在播放的直播,而无需使用 VideoID.

https://www.youtube.com/embed/live_stream?channel=ChannelID

我知道有一个 YouTube API 可以以某种方式 return 来自 channelID 的当前正在播放的直播 videoID 如下:

https://www.googleapis.com/youtube/v3/search?part=snippet&channelId={CHANNEL_ID}&eventType=live&type=video&key={YOUR_API_KEY} 

但这就是我被困的地方。知道如何从 channelId 获取更新的直播 videoId 然后将其用作 PierfrancescoSoffritti android-youtube-player 中的字符串 videoId = "xxxx"; 吗?

public void onReady(@NonNull YouTubePlayer youTubePlayer) {
    String videoId = "xxxx";
    youTubePlayer.loadVideo(videoId, 0);

你基本上已经在回答你自己的问题了。

首先,您需要获取直播的视频 ID,为此您需要一个 youtubeAPI 密钥,据悉您不需要 pierfrancesco 的库。下面video说明获取方法。请注意您对 API 键设置的限制,因为如果它太受限制,它将无法工作(最好一开始根本不限制它)。 然后将 channelIDAPI key 填入您好心提供的 url

https://www.googleapis.com/youtube/v3/search?part=snippet&channelId={CHANNEL_ID}&eventType=live&type=video&key={YOUR_API_KEY}

您可能已经知道这一点,但您可以使用诸如 Volley 之类的东西来发出 http 请求。在 return 中,您将获得如下所示的 JSONObject:

{
  "kind": "youtube#searchListResponse",
  "etag": "kmbaHcb5CMLZ5VevVM",
  "regionCode": "NI",
  "pageInfo": {
    "totalResults": 1,
    "resultsPerPage": 1
  },
  "items": [
    {
      "kind": "youtube#searchResult",
      "etag": "RkUpUQpSKztQlA",
      "id": {
        "kind": "youtube#video",
        "videoId": "GLdex45V_RQ"// <------------------------- HERE IT IS
      },
      "snippet": {
        "publishedAt": "2021-10-14T21:05:37Z",
        "channelId": "UCeY0bbntWzzVIaj2z3QigXg",
        "title": "LIVE: NBC News NOW - October 15",
        "description": "NBC News NOW is live, reporting breaking news and developing stories in real time. We are on the scene, covering the most important stories of the day and ...",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/GLdex45V_RQ/default_live.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/GLdex45V_RQ/mqdefault_live.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/GLdex45V_RQ/hqdefault_live.jpg",
            "width": 480,
            "height": 360
          }
        },
        "channelTitle": "NBC News",
        "liveBroadcastContent": "live",
        "publishTime": "2021-10-14T21:05:37Z"
      }
    }
  ]
}

在那里你可以找到你正在寻找的 videoID 通过深入到那个对象。

之后,您只需将其传递给 pierfrancescos 的 loadVideo() 方法即可。如果 liveStream 失败或被重新创建(我敢打赌这不会经常发生),用户可以通过简单地重新打开应用程序来修复它(从那时起,一个新的请求被启动到 googleapi.com)但是,最有可能的是 pierfrancescos 错误之一捕获回调方法(如 onError())将被触发,允许您无缝地重新启动请求并在新的 videoID 下重新加载视频,而中断最少。

让我知道这是否适合你