Flutter 在单个视频播放器中查看Youtube视频和普通视频的任何包或方式

Flutter 在单个视频播放器中查看Youtube视频和普通视频的任何包或方式,flutter,video-player,Flutter,Video Player,我在一个页面上播放两个链接的视频,它们是: Youtube网址 普通视频URL,如Vimeo等 我使用了这个著名的颤振软件包,也就是说,还使用了一个非常有用的软件包,它将视频播放器与所有内置控件包装在一起 现在,上面的一个能够运行正常的视频,而不是来自Youtube。对于Youtube视频,可以使用以下软件包:和 但是这里的挑战是,找到一种解决方法,既可以播放来自普通视频URL的视频,也可以播放来自YOUTUBE URL的视频,而不会出现任何问题。 我正在寻找出路,但在那之前什么也没找到。我

我在一个页面上播放两个链接的视频,它们是:

  • Youtube网址
  • 普通视频URL,如Vimeo等
我使用了这个著名的颤振软件包,也就是说,还使用了一个非常有用的软件包,它将视频播放器与所有内置控件包装在一起

现在,上面的一个能够运行正常的视频,而不是来自Youtube。对于Youtube视频,可以使用以下软件包:和

但是这里的挑战是,找到一种解决方法,既可以播放来自普通视频URL的视频,也可以播放来自YOUTUBE URL的视频,而不会出现任何问题。 我正在寻找出路,但在那之前什么也没找到。我希望在这里找到一些有用的答案,以便在颤振应用程序中使用它。谢谢

或者只能通过网络(使用流式url)、资产或文件视频。 因此,首先我们需要一种方法来确定视频URL是否来自youtube。 然后我们可以使用获取youtube视频流url,以便播放器可以复制

下面是我的一个项目的代码片段:

String convertUrlToId(String url, {bool trimWhitespaces = true}) {
  assert(url?.isNotEmpty ?? false, 'Url cannot be empty');
  String _url;
  if (!url.contains('http') && (url.length == 11)) return url;
  if (trimWhitespaces) {
    _url = url.trim();
  } else {
    _url = url;
  }

  for (final exp in [
    RegExp(r'^https:\/\/(?:www\.|m\.)?youtube\.com\/watch\?v=([_\-a-zA-Z0-9]{11}).*$'),
    RegExp(
        r'^https:\/\/(?:www\.|m\.)?youtube(?:-nocookie)?\.com\/embed\/([_\-a-zA-Z0-9]{11}).*$'),
    RegExp(r'^https:\/\/youtu\.be\/([_\-a-zA-Z0-9]{11}).*$')
  ]) {
    final Match match = exp.firstMatch(_url);
    if (match != null && match.groupCount >= 1) return match.group(1);
  }

  return null;
}

我可以在两个商店(app store和play store)都有的应用程序中使用youtube_explode_dart库吗?我不知道这是否有任何法律问题。
Future<String> _extractVideoUrl() async {
  if (%%IS_VIDEO_FROM_YOUTUBE%%) {
    final extractor = YoutubeExplode();
    final videoId = convertUrlToId(widget.videoUrl);
    final streamManifest = await extractor.videos.streamsClient.getManifest(videoId);
    final streamInfo = streamManifest.muxed.withHighestBitrate();
    extractor.close();
    return streamInfo.url.toString();
  }
  return null;
}
_videoPlayerController = VideoPlayerController.network(%%URL_EXTRACTED%%)..initialize();