video_player、chewie 播放视频

使用video_player播放视频

地址:https://pub.dev/packages/video_player

Android配置

/android/app/src/main/AndroidManifest.xml

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

Ios配置

Ios无需配置,注意要使用https协议

dependencies:
    video_player: ^2.4.7
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoPage extends StatefulWidget {
  const VideoPage({super.key});
  @override
  State<VideoPage> createState() => _VideoPageState();
}
class _VideoPageState extends State<VideoPage> {
  late VideoPlayerController _controller;
  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(
      'https://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4')
      ..initialize().then((_) {
      // Ensure the first frame is shown after the video is initialized, even
      before the play button has been pressed.
        print("initialized");
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("video VideoPlayer"),
      ),
      body: Center(
        child: _controller.value.isInitialized
        ? AspectRatio(
          aspectRatio: _controller.value.aspectRatio,
          child: VideoPlayer(_controller),
        )
        : AspectRatio(
          aspectRatio: _controller.value.aspectRatio,
          child: Container(color: Colors.red),
        ),
      ),
      floatingActionButton: FloatingActionButton(    
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
              ? _controller.pause()
              : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}

使用chewie播放视频

在 Flutter 里官方提供了一个 video_player插件可以播放视频。但是video_player有一些局限性。没法控制底部播放进度等。 所以我们主要给大家讲解一个第三方的视频播放库chewie。chewie是一个非官方的第三方视频播放组件,看起来好像是基于 HTML5 播放的组件。chewie 相对 video_player 来说,有控制栏和全屏的功能。Chewie 使用 video_player 引擎并将其包裹在友好的 Material 或 CupertinoUI 中!

https://pub.dev/packages/video_playe

https://pub.dev/packages/chewie

chewie基于video_player,所以要使用chewie必须配置video_player

dependencies:
    chewie: <latest_version>
    video_player: <latest_version>

完整demo

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
class ChewieVideoPage extends StatefulWidget {
  const ChewieVideoPage({super.key});
  @override
  State<ChewieVideoPage> createState() => _ChewieVideoPageState();
}
class _ChewieVideoPageState extends State<ChewieVideoPage> {
  late VideoPlayerController videoPlayerController;
  late ChewieController chewieController;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _initVideo();
  }
  _initVideo() async {
    videoPlayerController = VideoPlayerController.network(
      'https://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4');
    chewieController = ChewieController(
      videoPlayerController: videoPlayerController,
      aspectRatio: 3 / 2,
      autoPlay: true,
      looping: true,
    );
  }
  /*销毁*/
  @override
  void dispose() {
    videoPlayerController.dispose();
    chewieController.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('在线视频播放'),
      ),
      body: Center(
        child: SizedBox(
          child: AspectRatio(
            aspectRatio: 3 / 2,
            child: Chewie(
              controller: chewieController,
            ),
          ),
        )),
    );
  }
}

修改底部ActionSheet以及播放的速度

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';

class ChewieVideoPage extends StatefulWidget {
  const ChewieVideoPage({super.key});
  @override
  State<ChewieVideoPage> createState() => _ChewieVideoPageState();
}
class _ChewieVideoPageState extends State<ChewieVideoPage> {
  late VideoPlayerController videoPlayerController;
  late ChewieController chewieController;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _initVideo();
  }
  _initVideo() async {
    videoPlayerController = VideoPlayerController.network(
      'https://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4');
    chewieController = ChewieController(
      videoPlayerController: videoPlayerController,
      aspectRatio: 3 / 2,
      autoPlay: true,
      looping: true,
      optionsBuilder: (context, defaultOptions) async {
        //defaultOptions保存了对应的按钮 先打印然后再去自定义
        return await showModalBottomSheet(
          context: context,
          builder: (context) {
            return SizedBox(
              height: 120,
              child: ListView(
                children: [
                  ListTile(
                    title: const Text("播放速度"),
                    onTap: (){
                      defaultOptions[0].onTap!();
                    },
                  ),
                  ListTile(
                    title: const Text("取消"),
                    onTap: (){
                      Navigator.of(context).pop();
                    },
                  )
                ],
              ),
            );
          }
        );
      },
    );
  }
  /*销毁*/
  @override
  void dispose() {
    videoPlayerController.dispose();
    chewieController.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('在线视频播放'),
      ),
      body: Center(
        child: SizedBox(
          child: AspectRatio(
            aspectRatio: 3 / 2,
            child: Chewie(
              controller: chewieController,
            ),
          ),
        )),
    );
  }
}

results matching ""

    No results matching ""