Flutter视频播放增强插件extended_video_player_android的使用

Flutter视频播放增强插件extended_video_player_android的使用

extended_video_player_androidextended_video_player 插件的一部分,用于在 Flutter 应用中实现视频播放功能。它提供了丰富的功能,包括本地和网络视频播放、缓存支持、播放控制等。

使用方法

extended_video_player_androidextended_video_player 的 Android 实现部分,因此可以直接通过 extended_video_player 包来使用,无需单独添加此包到 pubspec.yaml 文件中。但是,如果你需要直接使用其 API,则需要将其添加到你的 pubspec.yaml 文件中。

安装

首先,在 pubspec.yaml 文件中添加 extended_video_player

dependencies:
  extended_video_player: ^<最新版本号>

然后运行以下命令以安装依赖:

flutter pub get

示例代码

以下是一个完整的示例代码,展示了如何使用 extended_video_player 来播放本地和远程视频,并支持缓存功能。

示例代码

// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'package:extended_video_player_platform_interface/video_player_platform_interface.dart';
import 'package:flutter/material.dart';

import 'mini_controller.dart';

void main() {
  runApp(
    MaterialApp(
      home: _App(),
    ),
  );
}

class _App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        key: const ValueKey<String>('home_page'),
        appBar: AppBar(
          title: const Text('Video player example'),
          bottom: const TabBar(
            isScrollable: true,
            tabs: <Widget>[
              Tab(
                icon: Icon(Icons.cloud),
                text: 'Remote',
              ),
              Tab(
                icon: Icon(Icons.cloud),
                text: 'Remote with cache',
              ),
              Tab(icon: Icon(Icons.insert_drive_file), text: 'Asset'),
            ],
          ),
        ),
        body: TabBarView(
          children: <Widget>[
            _BumbleBeeRemoteVideo(),
            _BumbleBeeRemoteCacheVideo(),
            _ButterFlyAssetVideo(),
          ],
        ),
      ),
    );
  }
}

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

class _ButterFlyAssetVideoState extends State<_ButterFlyAssetVideo> {
  late MiniController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = MiniController.asset('assets/Butterfly-209.mp4');

    _controller.addListener(() {
      setState(() {});
    });
    _controller.initialize().then((_) => setState(() {}));
    _controller.play();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          Container(
            padding: const EdgeInsets.only(top: 20.0),
          ),
          const Text('With assets mp4'),
          Container(
            padding: const EdgeInsets.all(20),
            child: AspectRatio(
              aspectRatio: _controller.value.aspectRatio,
              child: Stack(
                alignment: Alignment.bottomCenter,
                children: <Widget>[
                  VideoPlayer(_controller),
                  _ControlsOverlay(controller: _controller),
                  VideoProgressIndicator(_controller),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

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

class _BumbleBeeRemoteVideoState extends State<_BumbleBeeRemoteVideo> {
  late MiniController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();

    _controller = MiniController.network(
      'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
    );

    _controller.addListener(() {
      setState(() {});
    });
    _controller.initialize();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          Container(padding: const EdgeInsets.only(top: 20.0)),
          const Text('With remote mp4'),
          Container(
            padding: const EdgeInsets.all(20),
            child: AspectRatio(
              aspectRatio: _controller.value.aspectRatio,
              child: Stack(
                alignment: Alignment.bottomCenter,
                children: <Widget>[
                  VideoPlayer(_controller),
                  _ControlsOverlay(controller: _controller),
                  VideoProgressIndicator(_controller),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

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

class _BumbleBeeRemoteCacheVideoState
    extends State<_BumbleBeeRemoteCacheVideo> {
  late MiniController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();

    _controller = MiniController.network(
        'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
        videoPlayerParameters: VideoPlayerParameters(
            videoPlayerOptions:
                VideoPlayerOptions(enableCache: true,
                    maxCacheSize: 1024 * 1024 * 1024,
                    maxFileSize: 1024 * 1024 * 100)));

    _controller.addListener(() {
      setState(() {});
    });
    _controller.initialize();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          Container(padding: const EdgeInsets.only(top: 20.0)),
          const Text('With remote Cache mp4'),
          Container(
            padding: const EdgeInsets.all(20),
            child: AspectRatio(
              aspectRatio: _controller.value.aspectRatio,
              child: Stack(
                alignment: Alignment.bottomCenter,
                children: <Widget>[
                  VideoPlayer(_controller),
                  _ControlsOverlay(controller: _controller),
                  VideoProgressIndicator(_controller),
                ],
              ),
            ),
          ),
          TextButton(
            style: ButtonStyle(
              foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
            ),
            onPressed: () {
              _controller.clearCache();
            },
            child: const Text('clear cache'),
          )
        ],
      ),
    );
  }
}

class _ControlsOverlay extends StatelessWidget {
  const _ControlsOverlay({required this.controller});

  static const List<double> _examplePlaybackRates = <double>[
    0.25,
    0.5,
    1.0,
    1.5,
    2.0,
    3.0,
    5.0,
    10.0,
  ];

  final MiniController controller;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        AnimatedSwitcher(
          duration: const Duration(milliseconds: 50),
          reverseDuration: const Duration(milliseconds: 200),
          child: controller.value.isPlaying
              ? const SizedBox.shrink()
              : const ColoredBox(
                  color: Colors.black26,
                  child: Center(
                    child: Icon(
                      Icons.play_arrow,
                      color: Colors.white,
                      size: 100.0,
                      semanticLabel: 'Play',
                    ),
                  ),
                ),
        ),
        GestureDetector(
          onTap: () {
            controller.value.isPlaying ? controller.pause() : controller.play();
          },
        ),
        Align(
          alignment: Alignment.topRight,
          child: PopupMenuButton<double>(
            initialValue: controller.value.playbackSpeed,
            tooltip: 'Playback speed',
            onSelected: (double speed) {
              controller.setPlaybackSpeed(speed);
            },
            itemBuilder: (BuildContext context) {
              return <PopupMenuItem<double>>[
                for (final double speed in _examplePlaybackRates)
                  PopupMenuItem<double>(
                    value: speed,
                    child: Text('${speed}x'),
                  )
              ];
            },
            child: Padding(
              padding: const EdgeInsets.symmetric(
                // Using less vertical padding as the text is also longer
                // horizontally, so it feels like it would need more spacing
                // horizontally (matching the aspect ratio of the video).
                vertical: 12,
                horizontal: 16,
              ),
              child: Text('${controller.value.playbackSpeed}x'),
            ),
          ),
        ),
      ],
    );
  }
}

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

1 回复

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


extended_video_player_android 是 Flutter 中一个用于增强 Android 平台视频播放功能的插件。它基于 video_player 插件,提供了更多高级功能和自定义选项,例如支持更多的视频格式、更灵活的控制选项、以及更好的性能优化。

安装

首先,你需要在 pubspec.yaml 文件中添加 extended_video_player_android 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  extended_video_player_android: ^版本号

然后运行 flutter pub get 来安装依赖。

基本用法

你可以像使用 video_player 插件一样使用 extended_video_player_android,但它提供了更多的功能和选项。

1. 初始化视频播放器

import 'package:flutter/material.dart';
import 'package:extended_video_player_android/extended_video_player_android.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoPlayerScreen(),
    );
  }
}

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late ExtendedVideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = ExtendedVideoPlayerController.network(
      'https://www.example.com/sample.mp4',
    )..initialize().then((_) {
        setState(() {});
      });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Extended Video Player'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: ExtendedVideoPlayer(controller: _controller),
              )
            : CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
                ? _controller.pause()
                : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }
}

2. 更多高级功能

extended_video_player_android 提供了更多高级功能,例如:

  • 支持更多的视频格式:通过 ExtendedVideoPlayerController,你可以播放更多格式的视频。
  • 自定义播放控制:你可以自定义播放器的控制面板,添加更多按钮和功能。
  • 性能优化:插件对 Android 平台进行了优化,提供更流畅的播放体验。

自定义控制面板

你可以通过 ExtendedVideoPlayerController 提供的 API 来自定义控制面板。例如,你可以添加一个进度条、音量控制、全屏按钮等。

Widget _buildCustomControls() {
  return Column(
    children: [
      Slider(
        value: _controller.value.position.inSeconds.toDouble(),
        min: 0.0,
        max: _controller.value.duration.inSeconds.toDouble(),
        onChanged: (double value) {
          _controller.seekTo(Duration(seconds: value.toInt()));
        },
      ),
      Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          IconButton(
            icon: Icon(Icons.volume_up),
            onPressed: () {
              // 音量控制逻辑
            },
          ),
          IconButton(
            icon: Icon(Icons.fullscreen),
            onPressed: () {
              // 全屏逻辑
            },
          ),
        ],
      ),
    ],
  );
}
回到顶部