4

我对 Android Dev、Java 和一般来说都很陌生 - 所以请耐心等待。我一直在试验GitHub PierfrancescoSoffrittiandroid-youtube-player这作为一个可定制的 Android 开源 YouTube 播放器非常有效,但有一个例外。

主要代码使用 avideoID来玩:

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 Livestream,videoId如果流被重新创建,它可以改变。

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

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

我知道有一个 YouTube API 可以通过以下方式以某种方式返回当前正在播放的videoID直播channelID

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

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

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

1 回答 1

4

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

首先,您需要获取直播的 videoID,为此您需要一个 youtubeAPI 密钥,您不需要 pierfrancesco 的库。以下视频说明了如何获取它。请注意您对 API 密钥的限制,因为如果它太受限制,它将无法工作(最好一开始就不要限制它)。然后您将channelIDAPI 密钥填写到您提供的 url 中

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

您可能已经知道这一点,但您可以使用诸如Volley之类的东西来发出 http 请求。作为回报,您将获得如下所示的 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 下重新加载视频,而中断最小。

让我知道这是否适合你

于 2021-10-15T04:44:58.750 回答