在任何应用开发中,视频播放都是一项常见任务,Flutter 应用也不例外。为了支持视频播放,Flutter 团队提供了 video_player 插件。你可以使用 video_player 插件播放存储在本地文件系统中的视频或者网络视频。

在 iOS 上,video_player 使用 AVPlayer 进行播放控制。在 Android 上,使用的是 ExoPlayer

这个章节讲解的是如何借助 video_player 包接收网络视频流,并加入基本的播放、暂停操作。

步骤

1. 添加 video_player依赖
2. 添加权限
3. 创建并初始化 VideoPlayerController
4. 展示视频播放器
5. 播放视频和暂停视频

1. 添加 video_player 依赖

这个章节基于一个 Flutter 插件: video_player。首先,添加依赖到 pubspec.yaml 中。

dependencies:flutter:sdk: fluttervideo_player:

2. 添加权限

然后,你需要确保你的应用拥有从网络中获取视频流的权限。因此,你需要更新你的 android和 ios配置。
  • Android 配置

在 AndroidManifest.xml文件中的 <application>配置项下加入如下权限。AndroidManifest.xml文件的路径是 <project root>/android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application ...></application><uses-permission android:name="android.permission.INTERNET"/>
</manifest>

  • iOS 配置
针对 iOS,你需要在 <project root>/ios/Runner/Info.plist路径下的 Info.plist文件中加入如下配置。
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/>
</dict>

请注意
video_player插件在 iOS 模拟器上不能使用,必须要在 iOS 真机上进行测试。

3. 创建并初始化 VideoPlayerController

video_player插件成功安装且权限设置完成后,需要创建一个 VideoPlayerControllerVideoPlayerController类允许你播放不同类型的视频并进行播放控制。
在播放视频前,需要对播放控制器进行初始化。初始化过程主要是与视频源建立连接和播放控制的准备。
创建和初始化 VideoPlayerController时,请遵循以下步骤:
(1)创建一个 StatefulWidget组件和 State
(2)在 State类中增加一个变量来存放 VideoPlayerController
(3)在 State类中增加另外一个变量来存放 VideoPlayerController.initialize返回的 Future
(4)在 initState方法里创建和初始化控制器
(5)在 dispose方法里销毁控制器
class VideoPlayerScreen extends StatefulWidget {VideoPlayerScreen({Key key}) : super(key: key);@override_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}class _VideoPlayerScreenState extends State<VideoPlayerScreen> {VideoPlayerController _controller;Future<void> _initializeVideoPlayerFuture;@overridevoid initState() {// Create an store the VideoPlayerController. The VideoPlayerController// offers several different constructors to play videos from assets, files,// or the internet._controller = VideoPlayerController.network('https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',);_initializeVideoPlayerFuture = _controller.initialize();super.initState();}@overridevoid dispose() {// Ensure disposing of the VideoPlayerController to free up resources._controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {// Complete the code in the next step.}
}

4. 展示视频播放器
现在到了展示播放器的时候。video_player插件提供了 VideoPlayer组件来展示已经被 VideoPlayerController初始化完成的视频。默认情况下,VideoPlayer组件会尽可能撑满整个空间。但是这通常不会太理想,因为很多时候视频需要在特定的宽高比下展示,比如 16x9 或者 4x3。
因此,你可以把 VideoPlayer组件嵌进一个 AspectRatio组件中,保证视频播放保持正确的比例。
此外,你必须在 _initializeVideoPlayerFuture完成后才展示 VideoPlayer组件。你可以使用 FutureBuilder来展示一个旋转的加载图标直到初始化完成。请注意:控制器初始化完成并不会立即开始播放。
// Use a FutureBuilder to display a loading spinner while waiting for the
// VideoPlayerController to finish initializing.
FutureBuilder(future: _initializeVideoPlayerFuture,builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.done) {// If the VideoPlayerController has finished initialization, use// the data it provides to limit the aspect ratio of the VideoPlayer.return AspectRatio(aspectRatio: _controller.value.aspectRatio,// Use the VideoPlayer widget to display the video.child: VideoPlayer(_controller),);} else {// If the VideoPlayerController is still initializing, show a// loading spinner.return Center(child: CircularProgressIndicator());}},
)

5. 播放视频和暂停视频
默认情况下,播放器启动时会处于暂停状态。开始播放,需要调用 VideoPlayerController提供的 play()方法。停止播放,需要调用 pause()方法。
在这个示例中,向应用加入了一个 FloatingActionButton,这个按钮会根据播放状态展示播放或者暂停的图标。当用户点击按钮,会切换播放状态。如果当前是暂停状态,就开始播放。如果当前是播放状态,就暂停播放。
完整样例
import 'dart:async';import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';void main() => runApp(VideoPlayerApp());class VideoPlayerApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Video Player Demo',home: VideoPlayerScreen(),);}
}class VideoPlayerScreen extends StatefulWidget {VideoPlayerScreen({Key key}) : super(key: key);@override_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}class _VideoPlayerScreenState extends State<VideoPlayerScreen> {VideoPlayerController _controller;Future<void> _initializeVideoPlayerFuture;@overridevoid initState() {// Create and store the VideoPlayerController. The VideoPlayerController// offers several different constructors to play videos from assets, files,// or the internet._controller = VideoPlayerController.network('https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',);// Initialize the controller and store the Future for later use._initializeVideoPlayerFuture = _controller.initialize();// Use the controller to loop the video._controller.setLooping(true);super.initState();}@overridevoid dispose() {// Ensure disposing of the VideoPlayerController to free up resources._controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Butterfly Video'),),// Use a FutureBuilder to display a loading spinner while waiting for the// VideoPlayerController to finish initializing.body: FutureBuilder(future: _initializeVideoPlayerFuture,builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.done) {// If the VideoPlayerController has finished initialization, use// the data it provides to limit the aspect ratio of the video.return AspectRatio(aspectRatio: _controller.value.aspectRatio,// Use the VideoPlayer widget to display the video.child: VideoPlayer(_controller),);} else {// If the VideoPlayerController is still initializing, show a// loading spinner.return Center(child: CircularProgressIndicator());}},),floatingActionButton: FloatingActionButton(onPressed: () {// Wrap the play or pause in a call to `setState`. This ensures the// correct icon is shown.setState(() {// If the video is playing, pause it.if (_controller.value.isPlaying) {_controller.pause();} else {// If the video is paused, play it._controller.play();}});},// Display the correct icon depending on the state of the player.child: Icon(_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,),), // This trailing comma makes auto-formatting nicer for build methods.);}
}

Flutter 中文文档:视频的播放和暂停相关推荐

  1. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. 极速 (Fast):基于 Sk ...

  2. Flutter 中文文档:Flutter 中的布局

    要点 widgets 是用于构建 UI 的类. widgets 可以用于布局和展示 UI 元素. 通过组合简单的 widgets 来构建复杂的 widgets. Flutter 布局的核心机制是 wi ...

  3. Flutter 中文文档:点击、拖动和其他手势

    这个章节将会讲解如何监听和响应 Flutter 的手势操作 gestures.典型的手势操作包括点击.拖动和缩放. Flutter 中的手势有两个不同的层次:第一层是原始的指针指向事件,描述了屏幕上由 ...

  4. Flutter 中文文档:Flutter 应用里的国际化

    你将学习到 如何去获取设备的语言环境(用户首选的语言). 如何去管理特定语言环境下的 app 值. 如何去定义 app 支持的语言环境. 如果你的 app 会部署给说其他语言的用户使用,那么你就需要对 ...

  5. swift中文文档_Flutter 中文文档:使用 Packages

    Flutter 支持使用其他开发者向 Flutter 和 Dart 生态系统贡献的共享 package,这意味着你可以快速构建应用而不是一切从零开始. 现有的 package 支持许多使用场景,例如, ...

  6. [Chromium中文文档]Chrom{e,ium}{,OS}中的硬件视频加速

    Chrom{e,ium}{,OS}中的硬件视频加速 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_ ...

  7. 【Chromium中文文档】Chrom{e,ium}{,OS}中的硬件视频加速

    Chrom{e,ium}{,OS}中的硬件视频加速 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_ ...

  8. MoviePy - 中文文档2-快速上手-创建和导出video clips

    回到目录 创建和导出video clips video 和 audio clips是moviepy中的核心的对象.这篇博文,我们会介绍不同的短clip,展示如何创建他们,以及如何将它们导出到文件中.关 ...

  9. FFmpeg 中文文档

    ffmpeg的中文文档 Posted on 13 Feb 2015   ffmpegDocuments   添加评论 ffmpeg的文档,把之前三个文章直接合并而成的.没有新的内容和改动. 1. 概要 ...

最新文章

  1. 公司成立两周年感言_对我的副项目成立一周年的一些反思
  2. 使用CSS3美化复选框checkbox
  3. python异常处理的作用_python--异常处理
  4. LeetCode Add Strings(大整数加法)
  5. 【通知】有三AI学社正式成立了,高质量人脉圈子,欢迎入社
  6. python笔记之面向对象
  7. 常用音频软件:Cool edit pro
  8. 如何用各种编程语言杀死一条龙
  9. 如何在Python中安全地创建嵌套目录
  10. 总结07展望08.愿一切都好.
  11. .net开发常用工具备忘录
  12. 康德的道德观与哲学观
  13. 2007年测试员的工具选择排名
  14. java 钩子程序,在kill 的时候程序平滑退出
  15. 卷积神经网络--MINIST数据集
  16. C# 实现截图软件功能
  17. 接口测试一般都需要注意哪些方面
  18. 浅谈Flink对象重用(object reuse)
  19. win10下使用caffe训练自己的数据,车牌二分类
  20. FB和FF MIC的用途

热门文章

  1. 根据物体大小来计算相机的FOV
  2. 考研考试需要准备什么
  3. android之联网Nohttp
  4. 官盐?私盐? 致FS(一)
  5. static(静态)变量有什么作用?
  6. html错格布局,html中的colspan
  7. 说话就能轻松操控,科大讯飞语音唤醒技术带来便利体验!
  8. python PySide6 图书管理系统结合数据库实战教程之登录-注册界面(保姆级教程)(后续更新)
  9. 矩阵与矩阵相乘python代码实现
  10. Markdown特殊符号