Flutter嵌入YouTube视频播放插件youtube_player_embed的使用

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

Flutter嵌入YouTube视频播放插件youtube_player_embed的使用

简介

youtube_player_embed 是一个轻量级且可定制的Flutter包,允许开发者将YouTube视频(包括YouTube Shorts)直接嵌入到他们的Flutter应用程序中。通过这个包,您可以无缝集成视频,具有高级事件处理、自动播放、静音和纵横比自定义等功能。

功能特性

  • 🎥 嵌入YouTube视频和Shorts:仅需少量配置即可轻松嵌入。
  • 🔄 支持自动播放:实现即时视频播放。
  • 🔇 静音选项:支持静音播放。
  • 📱 响应式设计:支持横向(16:9)和纵向(9:16)视频。
  • 💡 可定制化:移除YouTube品牌按钮以获得更简洁的UI。
  • 🔗 直接Shorts集成:无缝嵌入垂直YouTube Shorts。
  • 高级事件监听器:更新视频状态、时间跟踪、seek事件和静音/取消静音检测。
  • 🔑 增强控制:动态移除分享和品牌按钮。
  • 全屏支持:无缝进入和退出全屏。
  • ⏹️ 播放控制:编程控制播放、暂停、seek、静音和取消静音。
  • 🔍 自定义视频标题:动态设置或隐藏视频标题。
  • 🚀 性能优化:轻量高效,提供更流畅的用户体验。

安装

在您的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  youtube_player_embed: ^1.6.4

运行以下命令安装该包:

flutter pub get

使用示例

示例代码

import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';

void main() => runApp(const MyApp());

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final List<String> listOfVideos = ["pUb9EW7F63s", "3vPbzEhF63s"];
  String currentPlayingVideo = "";
  VideoController? videoController;

  @override
  void initState() {
    super.initState();
    currentPlayingVideo = listOfVideos.removeAt(0);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'YouTube Player Embed Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('YouTube Player Example'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            YoutubePlayerEmbed(
              key: ValueKey(currentPlayingVideo),
              callBackVideoController: (controller) {
                videoController = controller;
              },
              videoId: currentPlayingVideo, // 替换为YouTube Shorts或普通视频ID
              customVideoTitle: "بسم الله الرحمن الرحيم",
              autoPlay: false,
              hidenVideoControls: false,
              mute: false,
              enabledShareButton: false,
              hidenChannelImage: true,
              aspectRatio: 16 / 9,
              onVideoEnd: () {
                if (listOfVideos.isNotEmpty) {
                  setState(() {
                    currentPlayingVideo = listOfVideos.removeAt(0);
                  });
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text('No more videos to play!')),
                  );
                }
              },
              onVideoSeek: (currentTime) => print("Seeked to $currentTime seconds"),
              onVideoTimeUpdate: (currentTime) => print("Current time: $currentTime seconds"),
              onVideoStateChange: (state) {
                switch (state) {
                  case VideoState.playing:
                    print("Video is playing");
                    break;
                  case VideoState.paused:
                    print("Video is paused");
                    break;
                  case VideoState.muted:
                    print("Video is muted");
                    break;
                  case VideoState.unmuted:
                    print("Video is unmuted");
                    break;
                  case VideoState.fullscreen:
                    print("Video is in fullscreen");
                    break;
                  case VideoState.normalView:
                    print("Video is in normal view");
                    break;
                }
              },
            ),
            const SizedBox(height: 100),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                ElevatedButton(
                  onPressed: () async {
                    await videoController?.playVideo();
                  },
                  child: const Text("Play"),
                ),
                ElevatedButton(
                  onPressed: () async {
                    await videoController?.pauseVideo();
                  },
                  child: const Text("Pause"),
                ),
                ElevatedButton(
                  onPressed: () async {
                    await videoController?.muteOrUnmuteVideo();
                  },
                  child: const Text("Mute / Unmute"),
                ),
              ],
            ),
            const SizedBox(height: 50),
            ElevatedButton(
              onPressed: () async {
                await videoController?.seekTo(time: 4);
              },
              child: const Text("Seek to 4 seconds (for test)"),
            ),
          ],
        ),
      ),
    );
  }
}

API 参考

属性 类型 默认值 描述
videoId String 必填 要嵌入的YouTube视频ID
aspectRatio double null 视频的纵横比
enabledShareButton bool false 是否启用分享按钮
autoPlay bool true 视频加载时是否自动播放
mute bool false 视频默认是否静音
onVideoEnd VoidCallback? null 视频结束时触发的回调
onVideoSeek Function(double)? null seek操作发生时触发的回调
onVideoTimeUpdate Function(double)? null 视频时间更新时触发的回调
onVideoStateChange Function(VideoState)? null 视频状态变化(播放/暂停等)时触发的回调
customVideoTitle String? null 自定义视频标题
hidenVideoControls bool false 是否隐藏视频控件
hidenChannelImage bool true 是否隐藏频道图片

支持平台

  • Android
  • iOS
  • Web (有局限性)
  • Desktop

设置

Android 设置

确保在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

iOS 设置

  1. 更新 Info.plist

    Info.plist 文件中添加以下权限:

    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    <key>io.flutter.embedded_views_preview</key>
    <true/>
    
  2. 编辑 Podfile

    如果遇到问题,请在 iOS Podfile 中添加以下内容:

    target 'Runner' do
      use_frameworks!  # required by flutter_inappwebview
      ...
    end
    
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['SWIFT_VERSION'] = '5.0'  # required by flutter_inappwebview
          config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
      end
    end
    

更多信息

如果您有任何问题或建议,欢迎提交Issue或Pull Request。


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

1 回复

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


当然,以下是如何在Flutter项目中嵌入YouTube视频播放插件 youtube_player_embed 的详细代码案例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 youtube_player_embed 依赖。

dependencies:
  flutter:
    sdk: flutter
  youtube_player_embed: ^0.1.4  # 请注意版本号,确保使用最新版本

2. 导入包

在你的 Dart 文件中导入 youtube_player_embed 包。

import 'package:youtube_player_embed/youtube_player_embed.dart';

3. 创建 YouTubePlayerEmbed 小部件

接下来,你可以在你的 Flutter 应用中使用 YoutubePlayerEmbed 小部件来嵌入 YouTube 视频。

import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('YouTube Player Embed Example'),
        ),
        body: Center(
          child: YouTubePlayerEmbed(
            videoId: 'dQw4w9WgXcQ',  // 在这里替换成你想要的 YouTube 视频 ID
            showFullscreenButton: true,
            showRelatedVideos: false,
            showControls: true,
            autoPlay: false,
          ),
        ),
      ),
    );
  }
}

4. 运行应用

现在,你可以运行你的 Flutter 应用,并看到一个嵌入的 YouTube 视频播放器。

5. 自定义参数

YoutubePlayerEmbed 小部件提供了多个参数供你自定义播放器的行为:

  • videoId: YouTube 视频的唯一标识符。
  • showFullscreenButton: 是否显示全屏按钮。
  • showRelatedVideos: 视频播放结束后是否显示相关视频。
  • showControls: 是否显示播放控制。
  • autoPlay: 视频是否自动播放。

完整示例

以下是一个更完整的示例,包含了一些基本的布局和样式:

import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('YouTube Player Embed Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Embedded YouTube Video:',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 16),
              AspectRatio(
                aspectRatio: 16 / 9,
                child: YouTubePlayerEmbed(
                  videoId: 'dQw4w9WgXcQ',  // 在这里替换成你想要的 YouTube 视频 ID
                  showFullscreenButton: true,
                  showRelatedVideos: false,
                  showControls: true,
                  autoPlay: false,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例使用了 AspectRatio 来确保播放器保持正确的宽高比,并且添加了一些文本和间距来美化布局。

希望这些代码案例能帮助你在 Flutter 项目中成功嵌入 YouTube 视频播放插件 youtube_player_embed

回到顶部