我现在正在Flutter中开发视频播放器,并使用Chewie包,该包内部也使用Flutter的官方video_player。视频将以m3u8传输到Flutter App。我想让用户像Youtube一样选择视频质量(720p,480p等)。由于Flutter的video_player是基于Android的ExoPlayer,我知道ExoPlayer支持用户选择视频质量。Fluttervideo_player是否有任何选项、设置或配置可供用户选择视频质量?
m3u8
720p
480p
soat7uwm1#
这个answer被修改用于在web中创建这个视频播放器。您可以声明各种质量的源并根据需要切换到它们。
import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; void main() => runApp(VideoPlayerApp()); class VideoPlayerApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Video Player Demo', home: Container( padding: EdgeInsets.all(100), color: Colors.black, child: 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; int _playBackTime; //The values that are passed when changing quality Duration newCurrentPosition; String defaultStream = 'https://archive.org/download/Damas_BB_28F8B535_D_406/DaMaS.mp4'; String stream2 = 'https://archive.org/download/cCloud_20151126/cCloud.mp4'; String stream3 = 'https://archive.org/download/mblbhs/mblbhs.mp4'; @override void initState() { _controller = VideoPlayerController.network(defaultStream); _controller.addListener(() { setState(() { _playBackTime = _controller.value.position.inSeconds; }); }); _initializeVideoPlayerFuture = _controller.initialize(); super.initState(); } @override void dispose() { _initializeVideoPlayerFuture = null; _controller?.pause()?.then((_) { _controller.dispose(); }); super.dispose(); } Future<bool> _clearPrevious() async { await _controller?.pause(); return true; } Future<void> _initializePlay(String videoPath) async { _controller = VideoPlayerController.network(videoPath); _controller.addListener(() { setState(() { _playBackTime = _controller.value.position.inSeconds; }); }); _initializeVideoPlayerFuture = _controller.initialize().then((_) { _controller.seekTo(newCurrentPosition); _controller.play(); }); } void _getValuesAndPlay(String videoPath) { newCurrentPosition = _controller.value.position; _startPlay(videoPath); print(newCurrentPosition.toString()); } Future<void> _startPlay(String videoPath) async { setState(() { _initializeVideoPlayerFuture = null; }); Future.delayed(const Duration(milliseconds: 200), () { _clearPrevious().then((_) { _initializePlay(videoPath); }); }); } @override Widget build(BuildContext context) { return FutureBuilder( future: _initializeVideoPlayerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return Stack( children: <Widget>[ Center( child: AspectRatio( aspectRatio: _controller.value.aspectRatio, // Use the VideoPlayer widget to display the video. child: VideoPlayer(_controller), ), ), Align( alignment: Alignment.bottomCenter, child: Container( color: Colors.black54, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ Container( child: 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, ), ), ), Container( child: Text( _controller.value.position .toString() .split('.') .first .padLeft(8, "0"), ), ), Container( child: FlatButton( color: Colors.yellow, onPressed: () { _getValuesAndPlay(defaultStream); }, child: Text('Default Stream'), ), ), Container( child: FlatButton( color: Colors.red, onPressed: () { _getValuesAndPlay(stream2); }, child: Text('Video Stream 2'), ), ), Container( child: FlatButton( color: Colors.green, onPressed: () { _getValuesAndPlay(stream3); print('Green Button'); }, child: Text('Video Stream 3'), ), ) ], ), ), ), ], ); } else { // If the VideoPlayerController is still initializing, show a // loading spinner. return Center(child: CircularProgressIndicator()); } }, ); } }
字符串
1条答案
按热度按时间soat7uwm1#
这个answer被修改用于在web中创建这个视频播放器。您可以声明各种质量的源并根据需要切换到它们。
字符串