Flutter视频播放插件youtube的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter视频播放插件youtube的使用

简介

这个Flutter包提供了获取和管理YouTube视频信息的功能,包括关于视频和上传者的详细信息,以及各种缩略图分辨率。

GitHub Become_A_Sponsor

目录

配置

在获取视频详情之前,需要使用视频ID配置该包:

await Youtube.config(videoId: 'your_video_id');

访问视频信息

你可以使用提供的getter来访问视频和频道的详细信息:

var channelDetails = Youtube.channelDetails;
var videoDetails = Youtube.videoDetails;
var thumbnails = Youtube.thumbnails;

ChannelDetails

持有有关YouTube频道的详细信息。

属性

  • String name: 上传者名称。
  • String id: 频道ID。
  • String username: 上传者用户名。

示例

var channelDetails = Youtube.channelDetails;
print('Channel Name: ${channelDetails.name}');
print('Channel ID: ${channelDetails.id}');
print('Channel Username: ${channelDetails.username}');

VideoDetails

持有有关YouTube视频的详细信息。

属性

  • String title: 视频标题。
  • int duration: 视频时长(以秒为单位)。
  • int viewCount: 视频观看次数。
  • String defaultThumbnail: 默认缩略图URL。

示例

var videoDetails = Youtube.videoDetails;
print('Video Title: ${videoDetails.title}');
print('Video Duration: ${videoDetails.duration} seconds');
print('Video View Count: ${videoDetails.viewCount}');
print('Default Thumbnail: ${videoDetails.defaultThumbnail}');

Thumbnails

持有不同分辨率的视频缩略图URL。

属性

  • String fullhd: Full HD缩略图URL。
  • String hd: HD缩略图URL。
  • String sd: SD缩略图URL。
  • String hq: HQ缩略图URL。
  • String lq: LQ缩略图URL。

示例

var thumbnails = Youtube.thumbnails;
print('Full HD Thumbnail: ${thumbnails.fullhd}');
print('HD Thumbnail: ${thumbnails.hd}');
print('SD Thumbnail: ${thumbnails.sd}');
print('HQ Thumbnail: ${thumbnails.hq}');
print('LQ Thumbnail: ${thumbnails.lq}');

Video Information

包含视频的所有质量信息,包括直接流式传输和下载的URL、帧率、分辨率等。

属性

  • String url - 所有质量的视频URL,支持直接流式传输和下载。
  • int fps - 帧率。
  • String resolution - 分辨率。
  • String audio - 音频。
  • int filesize - 文件大小。
  • String quality - 质量。
  • String videoExtension - 视频扩展名。
  • int height - 视频高度。
  • int width - 视频宽度。

示例

以下是一个完整的示例代码,展示了如何使用此包来显示视频信息和缩略图。

import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:youtube/youtube.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Youtube.config(videoId: 'lpnKWK-KEYs');
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'YouTube Flutter Package',
      theme: ThemeData(
        primaryColor: Colors.white,
        scaffoldBackgroundColor: Colors.white,
        appBarTheme: const AppBarTheme(
          backgroundColor: Colors.red,
          foregroundColor: Colors.white,
          elevation: 0,
        ),
      ),
      home: const MyHomePage(title: 'YouTube Video Info'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ChannelDetails? _channelDetails;
  VideoDetails? _videoDetails;
  Thumbnails? _thumbnails;
  bool _isLoading = true;

  @override
  void initState() {
    super.initState();
    _fetchYoutubeData();
  }

  Future<void> _fetchYoutubeData() async {
    //await Youtube.config(videoId: 'D3GKd_MJiCQ');
    setState(() {
      _channelDetails = Youtube.channelDetails;
      _videoDetails = Youtube.videoDetails;
      _thumbnails = Youtube.thumbnails;
      _isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    var thumbnailsList = [
      _thumbnails?.fullhd,
      _thumbnails?.hd,
      _thumbnails?.hq,
      _thumbnails?.sd,
      _thumbnails?.lq
    ];
    var thumbnailListName = ["FULL HD", "HD", "HQ", "SD", "LQ"];
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () async {
              await _fetchYoutubeData();
            },
          ),
        ],
      ),
      body: _isLoading
          ? const Center(child: CircularProgressIndicator())
          : SingleChildScrollView(
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    _videoDetails?.defaultThumbnail != null
                        ? Image.network(_videoDetails!.defaultThumbnail!)
                        : const SizedBox.shrink(),
                    const SizedBox(height: 20),
                    _buildCarousel(thumbnailsList, thumbnailListName),
                    const SizedBox(height: 20),
                    _buildVideoDetailsCard(context),
                    const SizedBox(height: 20),
                    _buildUploaderDetailsCard(context)
                  ],
                ),
              ),
            ),
    );
  }

  Widget _buildCarousel(
      List<String?> thumbnailsList, List<String> thumbnailListName) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        const Text("All Thumbnail Sizes"),
        const Divider(),
        CarouselSlider(
          options: CarouselOptions(
            disableCenter: true,
            autoPlay: true,
          ),
          items: thumbnailsList
              .map(
                (item) => Card(
                  child: Column(
                    children: [
                      item != null
                          ? Image.network(item, fit: BoxFit.cover, height: 100)
                          : const SizedBox.shrink(),
                      Text(thumbnailListName[thumbnailsList.indexOf(item)])
                    ],
                  ),
                ),
              )
              .toList(),
        ),
      ],
    );
  }

  Widget _buildVideoDetailsCard(BuildContext context) {
    return Card(
      elevation: 5,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              'Video Details',
            ),
            const Divider(),
            Text('Title: ${_videoDetails?.title ?? 'N/A'}'),
            Text('View Count: ${_videoDetails?.viewCount.toString() ?? 'N/A'}'),
          ],
        ),
      ),
    );
  }

  Widget _buildUploaderDetailsCard(BuildContext context) {
    return Card(
      elevation: 5,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              'Uploader Details',
            ),
            const Divider(),
            Text('Uploader: ${_channelDetails?.name ?? 'N/A'}'),
            Text('Channel ID: ${_channelDetails?.id ?? 'N/A'}'),
            Text('Username: ${_channelDetails?.username ?? 'N/A'}'),
          ],
        ),
      ),
    );
  }
}

报告错误或问题

如果你遇到任何问题,欢迎在 GitHub 上提交ticket。新想法总是受欢迎的。

注意: 此包使用第三方API来获取数据。


更多关于Flutter视频播放插件youtube的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频播放插件youtube的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成YouTube视频播放功能,通常需要使用一些第三方插件,因为YouTube的视频播放涉及到特定的API和授权。一个常用的插件是 youtube_player_flutter。以下是如何在Flutter项目中集成和使用这个插件的示例代码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 youtube_player_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  youtube_player_flutter: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:youtube_player_flutter/models/video_player_options.dart';
import 'package:youtube_player_flutter/widgets/youtube_player.dart';

3. 使用 YouTubePlayer Widget

接下来,在你的 Flutter 组件中使用 YouTubePlayer widget。下面是一个简单的示例,展示如何在页面上嵌入一个 YouTube 视频:

import 'package:flutter/material.dart';
import 'package:youtube_player_flutter/models/video_player_options.dart';
import 'package:youtube_player_flutter/widgets/youtube_player.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: YouTubePlayerScreen(),
    );
  }
}

class YouTubePlayerScreen extends StatefulWidget {
  @override
  _YouTubePlayerScreenState createState() => _YouTubePlayerScreenState();
}

class _YouTubePlayerScreenState extends State<YouTubePlayerScreen> {
  late YoutubePlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = YoutubePlayerController(
      initialVideoId: 'YOUR_VIDEO_ID',  // 替换为你的YouTube视频ID
      flags: YoutubePlayerFlags(
        autoPlay: false,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('YouTube Player Example'),
      ),
      body: Center(
        child: YoutubePlayerView(
          controller: _controller,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.loadVideoById('ANOTHER_VIDEO_ID');  // 替换为另一个视频ID
          });
        },
        tooltip: 'Load Another Video',
        child: Icon(Icons.play_arrow),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

4. 注意事项

  • API Key: 对于某些功能(如获取视频信息),你可能需要一个YouTube Data API的API Key。这个插件的文档会详细解释如何获取和使用API Key。
  • 权限: 确保你的应用有适当的权限来访问YouTube服务。
  • 平台配置: 对于iOS和Android,你可能需要在各自的配置文件中添加一些特定的设置,比如API Key和权限。

5. 运行应用

完成上述步骤后,你可以运行你的Flutter应用,并查看嵌入的YouTube视频播放功能。

这个示例展示了基本的YouTube视频播放功能,包括初始化播放器、加载视频和播放视频。你可以根据需求进一步自定义和扩展功能。

回到顶部