Flutter视频播放插件universal_videoplayer的使用

Flutter视频播放插件universal_videoplayer的使用

我们已经实现了一个跨平台视频播放器,提供了流畅的视频播放体验。

功能支持

功能 iOS Android Windows Linux macOS Web
网络视频 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
资源文件视频 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
本地文件视频 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
循环播放 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
自动播放 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
滑动控制音量 ✔️ ✔️ 键盘方向键 键盘方向键 键盘方向键 键盘方向键
滑动快进快退 ✔️ ✔️ 键盘方向键 键盘方向键 键盘方向键 键盘方向键
全屏模式 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
启动全屏模式 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
播放速度调节 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
快进快退 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
SRT字幕 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
定制化 部分 部分 部分 部分 部分 部分
画中画(PIP) 未实现(寻求帮助) ✔️ ✔️ 已实现(未测试) 已实现(崩溃,等待window_manager发布,GitHub已修复) 未实现

视频播放器控件

移动端控件

  • 水平滑动以在视频中向前或向后快进。 (seekSwipes)
  • 右侧屏幕垂直滑动以控制视频音量。 (volumeSwipes)
  • 左侧屏幕垂直滑动以控制视频亮度。 (brightnessSwipes)
  • 双击屏幕两侧以在视频中向前或向后快进。 (doubleTapToSeek)
  • 长按屏幕以加速视频,长按释放时减速。 (onLongPressSpeedUp)

桌面端控件

  • 单击鼠标以切换播放和暂停。 (desktopTapToPlayAndPause)
  • 双击鼠标以切换全屏模式。 (desktopDoubleTapToFullScreen)
  • 使用键盘上下箭头增加或减少视频音量。 (volumeArrows)
  • 使用键盘左右箭头在视频中向前或向后快进。 (seekArrows)
  • 按下Esc键关闭全屏模式。 (escapeKeyCloseFullScreen)
  • 按下数字小键盘小数点键(.)以切换视频适应模式。 (numPadDecimalKeyToggleFit)
  • 按下Enter键打开全屏模式。 (enterKeyOpensFullScreen)
  • 按下空格键切换播放和暂停视频。 (spaceKeyTogglePlay)

初始化

void main() {
  initMeeduPlayer(
    androidUseFVP: true,
    iosUseFVP: false,
  );
  runApp(const MyApp());
}

Android 和 iOS 替换原生视频播放器

Android

  • 添加此包并设置 androidUseFVPtrueinitMeeduPlayer 中。

iOS

  • 添加此包并在 initMeeduPlayer 中设置 iosUseFVPtrue

HLS 在 Web 上

pubspec.yaml 中添加:

  video_player_web_hls: ^1.0.0+3

index.html 文件中添加以下脚本:

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest" type="application/javascript"></script>

放在 <script src="main.dart.js" type="application/javascript"></script><script src="flutter.js" defer></script> 之前。

示例代码

以下是完整的示例代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:universal_videoplayer/meedu_player.dart';
import 'package:universal_videoplayer_example/pages/basic_example_page.dart';
import 'package:universal_videoplayer_example/pages/fullscreen_example_page.dart';
import 'package:logging/logging.dart';

void main() {
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((record) {
    print(
        '${record.loggerName}.${record.level.name}: ${record.time}: ${record.message}');
  });
  initMeeduPlayer(
    androidUseFVP: true,
    iosUseFVP: false,
  );
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
      routes: {
        "basic": (_) => const BasicExamplePage(),
        "fullscreen": (_) => const FullscreenExamplePage(),
      },
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
    // SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                const Padding(
                  padding: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
                  child: Text(
                    '基本示例',
                    style: TextStyle(
                      fontSize: 18,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                Wrap(
                  children: [
                    buildButton(
                      context,
                      text: '基本网络示例',
                      routeName: 'basic',
                      description: '加载网络视频示例。',
                    ),
                    buildButton(
                      context,
                      text: '全屏示例',
                      routeName: 'fullscreen',
                      description: '启用全屏模式示例。',
                    ),
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget buildButton(BuildContext context,
      {required String text,
      required String description,
      required String routeName}) {
    return Card(
      elevation: 30,
      margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
      child: InkWell(
        onTap: () {
          Navigator.pushNamed(context, routeName);
        },
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(text, style: const TextStyle(fontSize: 18.0)),
              const SizedBox(height: 8.0),
              Text(description, style: const TextStyle(fontSize: 14.0)),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


universal_videoplayer 是一个 Flutter 插件,用于在 Flutter 应用中播放视频。它支持多种平台,包括 Android、iOS 和 Web。以下是如何使用 universal_videoplayer 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  universal_videoplayer: ^0.1.0  # 请检查最新版本

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

2. 导入插件

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

import 'package:universal_videoplayer/universal_videoplayer.dart';

3. 创建视频播放器

你可以使用 UniversalVideoPlayerController 来控制视频播放器。以下是一个简单的示例:

class VideoPlayerScreen extends StatefulWidget {
  [@override](/user/override)
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  UniversalVideoPlayerController _videoPlayerController;

  [@override](/user/override)
  void initState() {
    super.initState();
    _videoPlayerController = UniversalVideoPlayerController()
      ..initialize('https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4')
      ..addListener(() {
        setState(() {});
      });
  }

  [@override](/user/override)
  void dispose() {
    _videoPlayerController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Universal Video Player'),
      ),
      body: Center(
        child: _videoPlayerController.value.isInitialized
            ? AspectRatio(
                aspectRatio: _videoPlayerController.value.aspectRatio,
                child: UniversalVideoPlayer(_videoPlayerController),
              )
            : CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _videoPlayerController.value.isPlaying
                ? _videoPlayerController.pause()
                : _videoPlayerController.play();
          });
        },
        child: Icon(
          _videoPlayerController.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}
回到顶部