搜索插件、代码仓与 APP 分类

插件详情v1.6.4

youtube_player_embed

一个用于嵌入 YouTube 视频的 Flutter 包,支持自定义选项。

AndroidiOSmacOSWindows
近 30 天下载
1000
喜欢数
33
Pub 分数
155

安装插件

flutter pub add youtube_player_embed

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个 Flutter 包,可实现 YouTube 视频在应用程序中的无缝嵌入,并提供可自定义的播放选项。它支持 Android、iOS、macOS 和 Windows 等多个平台,为开发者提供了灵活集成视频内容的方式。该包提供了一个简单的 API 来加载和控制视频,包括自动播放、循环播放和自定义控件等功能。非常适合需要丰富媒体体验的应用程序,例如教育平台、视频教程或娱乐应用。

适合场景

  • 在移动和桌面应用程序中嵌入 YouTube 视频
  • 创建视频教程界面
  • 构建丰富的媒体教育资源
  • 将视频流集成到社交应用中
  • 开发流媒体或娱乐平台

主要特点

  • 跨平台支持(Android、iOS、macOS、Windows)
  • 可自定义的播放器控件
  • 自动播放和循环选项
  • 响应式视频尺寸
  • 与 Flutter UI 的轻松集成

适合对象

  • 教育类应用程序开发者
  • 媒体和娱乐应用
  • 内容创作者
  • 需要视频集成的应用程序构建者
  • Flutter 初学者探索媒体功能

使用建议

  • 需要互联网连接以加载视频
  • 可能需要为自定义主题添加额外的样式
  • 仅限YouTube视频网址
  • 多个播放器可能带来的性能影响
  • 依赖于 YouTube 嵌入 API 的稳定性

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

youtube_player_embed

Pub Version BSD-3 License Top Language GitHub issues GitHub Stars

youtube_player_embed is a lightweight and customizable Flutter package that allows developers to embed YouTube videos, including YouTube Shorts, directly into their Flutter applications using an InAppWebView. With this package, you can seamlessly integrate videos with advanced event handling, autoplay, mute, and aspect ratio customization.


Features

  • 🎥 Embed YouTube Videos and Shorts easily with minimal configuration.
  • 🔄 Autoplay Support for instant video playback.
  • 🔇 Mute Option for silent playback.
  • 📱 Responsive Design supporting both horizontal (16:9) and vertical (9:16) videos.
  • 💡 Customizable options to remove YouTube branding buttons for a cleaner UI.
  • 🔗 Direct Shorts Integration for embedding vertical YouTube Shorts seamlessly.
  • ⏰ Advanced Event Listeners for video state updates, time tracking, seek events, and mute/unmute detection.
  • 🔑 Enhanced Control to programmatically remove share and branding buttons dynamically.
  • ⏯ Full-Screen Support with seamless entry and exit.
  • ⏹️ Playback Controls: Play, Pause, Seek, Mute, and Unmute programmatically.
  • 🔍 Custom Video Titles: Dynamically set or hide video titles.
  • 🚀 Performance Optimized: Lightweight and efficient for a smoother user experience.

image


Installation

Add the following dependency to your pubspec.yaml:

dependencies:
  youtube_player_embed: ^1.6.4

Run the following command to install the package:

flutter pub get

Usage

Import the package:

import 'package:youtube_player_embed/youtube_player_embed.dart';

Embed a YouTube video in your app:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    VideoController? videoController;

    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), // Unique key for the video (optional)
              callBackVideoController: (controller) {
                videoController = controller;
              },
              videoId:
                  currentPlayingVideo, // 'shorts_video_id' Replace with a YouTube Shorts or normal video ID
              customVideoTitle: "بسم الله الرحمن الرحيم",
              autoPlay: false,
              hidenVideoControls: false,
              mute: false,
              enabledShareButton: false,
              hidenChannelImage: true,
              aspectRatio: 16 / 9,
              onVideoEnd: () {
                print("video ended");
              },
              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 seconed (for test)"),
            ),
            ////
          ],
        ),
      ),
    );
  }
}

Example Project

A complete example project is available in the example directory.

To run the example:

cd example
flutter run

API Reference

YoutubePlayerView
Property Type Default Description
videoId String Required The YouTube video ID to embed.
aspectRatio double null Aspect ratio of the video.
enabledShareButton bool false Enable or disable the share button.
autoPlay bool true Whether the video should autoplay upon loading.
mute bool false Whether the video should be muted by default.
onVideoEnd VoidCallback? null Callback triggered when the video ends.
onVideoSeek Function(double)? null Callback triggered when the video seek occurs.
onVideoTimeUpdate Function(double)? null Callback triggered on video time updates.
onVideoStateChange Function(VideoState)? null Callback triggered on video state changes (play/pause/etc).
customVideoTitle String? null Custom title for the video displayed on top.
hidenVideoControls bool false Whether to hide the video controls.
hidenChannelImage bool true Whether to hide the channel image.

Supported Platforms

  • ✅ Android
  • ✅ iOS
  • ✅ Web (with limitations)
  • ✅ Desktop

Setup

Android Setup

Ensure you have added the following permissions in your AndroidManifest.xml:

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

To ensure proper functionality on iOS, follow these steps:

  1. Update the Info.plist
    Add the following permissions in your Info.plist file:

     <key>NSAppTransportSecurity</key>
     <dict>
       <key>NSAllowsArbitraryLoads</key>
       <true/>
     </dict>
     <key>io.flutter.embedded_views_preview</key>
     <true/>
    

If you still have this problem, try to edit iOS Podfile like this

  1. Edit the Podfile
    Add the following to your iOS Podfile if you encounter issues:

    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
    

Changelog

v1.6.4
  • Added programmatic playback controls: Play, Pause, Seek, Mute, Unmute.
  • Added support for custom video titles.
  • Enhanced dynamic hiding of video controls and channel images.
  • Improved error handling for invalid video IDs.
  • Added advanced event listeners for video state, time updates, and seek events.
  • Added mute/unmute detection.
  • Improved support for dynamic UI updates to remove share and branding buttons.
  • Enhanced full-screen entry and exit handling.

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests on the GitHub repository.


License

This project is licensed under the MIT License. See the LICENSE file for details.


Author

Developed by Mohamed Elsafty.
Feel free to reach out for support or feedback!


Feedback & Support

If you encounter any issues or have suggestions for improvement, please open an issue on GitHub or contact me at nesr107@gmail.com.

所属分类

依赖

依赖清单 1 项

源码仓库

使用此插件的项目

暂无相关数据。