简介
当初的app性能越来越弱小,除了根本的图文之外,还须要各种各样的其余的性能,比方视频,和直播。
直播可能会比较复杂,因为波及到了拉流和推流,须要服务器端的反对,然而视频播放就比较简单了,那么如何在flutter中应用媒体播放器呢?
一起来看看吧。
应用前的筹备工作
flutter自身是不反对媒体播放性能的,为了实现这个性能,咱们须要应用额定的第三方插件叫做video_player。
首先咱们须要向flutter利用中增加video_player。增加起来也非常简单,只须要执行上面的命令即可:
flutter pub add video_player
该命令会向pubspec.xml中增加如下的内容:
dependencies: flutter: sdk: flutter video_player: ^2.4.7
增加好依赖包之后,咱们还须要为利用增加相应的权限,你确保可能应用影音播放的权限。
如果是在android中,须要向AndroidManifest.xml文件中增加相似上面的内容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application ...> </application> <uses-permission android:name="android.permission.INTERNET"/></manifest>
在IOS中则须要在Info.plist中增加上面的内容:
<key>NSAppTransportSecurity</key><dict> <key>NSAllowsArbitraryLoads</key> <true/></dict>
在flutter中应用video_player
video_player中和video播放相干的类叫做VideoPlayerController,在IOS中底层应用的是AVPlayer,在Android中底层应用的是ExoPlayer。
VideoPlayerController有好几种构造方法,咱们一起来看看。
VideoPlayerController.asset
asset办法示意video是从应用程序的asset中获取的。
VideoPlayerController.network
network办法示意video是从网络中获取的。
VideoPlayerController.file
file办法示意video是通过'file://${file.path}' 这样的格局来获取的。
还有一个只用在andorid中的办法,示意从contentUri中加载video:
VideoPlayerController.contentUri
为了简略起见,这里咱们抉择网易下面的一个科教视频,作为要播放的video。
那么咱们能够通过 VideoPlayerController.network办法来构建这个controller:
videoPlayerController = VideoPlayerController.network( 'https://flv.bn.netease.com/1c04bfd72901f0661b486465e09cfdc01754c20db0686786f4e20a5f7d271ba0de6c1177a0da1c4c2d7c367e20ee16d4a90ac7ff4ea664820ba1b401f3e53f135f72cdff855e78ca5fb7849fb6ff7ccb9de1613ad3bfc59db83493b5f18a0a27f15048df6585361cd67c3b37551e10981c40dcdfdb77b7e6.mp4', );
在应用video之前,还须要进行初始操作,初始化是调用它的initialize办法,这个办法的作用是关上给定的数据源,并加载它的元数据。
因为initialize办法是一个耗时的操作,所以这个办法返回类型是Future:
Future<void> initialize() async {
咱们能够这样应用:
late Future<void> playerFuture;playerFuture = videoPlayerController.initialize();
有了播放器的Future,咱们能够配合flutter中的FutureBuilder一起应用:
body: FutureBuilder( future: playerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return AspectRatio( aspectRatio: videoPlayerController.value.aspectRatio, child: VideoPlayer(videoPlayerController), ); } else { return const Center( child: CircularProgressIndicator(), ); } }, ),
在FutureBuilder中,咱们通过判断connectionState来判断视频是否加载结束,如果没有加载结束,则应用CircularProgressIndicator示意正在加载中。
如果加载结束之后,就间接展现VideoPlayer组件即可。
因为不同的video有不同的纵横比,为了在flutter界面上完满的展现加载的video,咱们将VideoPlayer封装在一个AspectRatio组件中。
最初咱们还要增加一个管制安装,用来管制video的暂停和播放:
floatingActionButton: FloatingActionButton( onPressed: () { setState(() { if (videoPlayerController.value.isPlaying) { videoPlayerController.pause(); } else { videoPlayerController.play(); } }); }, child: Icon( videoPlayerController.value.isPlaying ? Icons.pause : Icons.play_arrow, ), )
这里通过videoPlayerController.value.isPlaying来判断视频是否在播放状态,同时在onPressed办法中调用了setState来调用videoPlayerController.pause或者videoPlayerController.play办法。
总结
这样一个能够播放内部视频的app就做好了,运行之后它的界面是这样的:
大家能够在这个播放器的根底上进行扩张,一个属于你本人的视频APP就实现了。
本文的例子:https://github.com/ddean2009/learn-flutter.git