Flutter视频缓存播放插件video_cached_player的使用

Flutter视频缓存播放插件video_cached_player的使用

video_cached_player 是一个 Flutter 插件,它基于官方的 video_player 包进行修改,支持在 Android 和 iOS 上进行视频缓存。Web 端的插件则与官方的 video_player 类似,不支持缓存。

为什么 fork

  • 原始创建者停止了更新和合并 PR,所以我重新发布了它。
  • 我认为 exo player 2.12 被下架了,导致我的构建失败。因此,我在 Android 上无法继续使用 implementation 'com.google.android.exoplayer:exoplayer-core:2.12.1',而是更新到了 implementation 'com.google.android.exoplayer:exoplayer-core:2.18.1'
  • 清除了过时的方法。
  • 修复了错误。
  • 遵循了 video_player 包的指导。

安装

首先,在你的 pubspec.yaml 文件中添加 video_cached_player 作为依赖项。

然后,遵循官方 video_player 包的 Android 和 iOS 配置步骤。该插件在桌面端不可用。

问题

  • maxFileSizemaxCacheSize 在 Android 上分别被硬编码为 100 MiB 和 1 GiB。

贡献者

示例代码

以下是一个完整的示例,展示了如何使用 video_cached_player 插件来缓存并播放视频。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // 这个小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你应用的主题。
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  // 这个小部件是你的应用的主页。它是有状态的,意味着它有一个包含影响其外观的字段的状态对象。
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final CachedVideoPlayerController controller =
      CachedVideoPlayerController.network(
    "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
    formatHint: VideoFormat.other,
    videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
  );

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

  Future<void> _initializeController(CachedVideoPlayerController controller) async {
    await controller.initialize().then((value) {
      controller.play();
    });
    if (mounted) {
      setState(() {});
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 这个方法会在每次调用 setState 时重新运行,就像上面的 _incrementCounter 方法一样。
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: controller.value.isInitialized
              ? AspectRatio(
                  aspectRatio: controller.value.aspectRatio,
                  child: CachedVideoPlayer(controller))
              : const CircularProgressIndicator()),
    );
  }

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

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

1 回复

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


video_cached_player 是一个用于 Flutter 的视频播放插件,它支持视频缓存功能,可以在视频播放时缓存视频数据,从而提升用户体验。以下是如何使用 video_cached_player 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 video_cached_player 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  video_cached_player: ^0.1.0 # 请使用最新版本

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

2. 导入插件

在需要使用 video_cached_player 的 Dart 文件中导入插件:

import 'package:video_cached_player/video_cached_player.dart';

3. 初始化播放器

在使用 VideoCachedPlayer 之前,你需要初始化它。通常在 initState 方法中进行初始化:

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

class _MyVideoPlayerState extends State<MyVideoPlayer> {
  VideoCachedPlayerController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = VideoCachedPlayerController(
      url: 'https://www.example.com/sample.mp4', // 视频的URL
      cacheConfig: CacheConfig(
        maxCacheSize: 100 * 1024 * 1024, // 最大缓存大小,单位是字节
        maxCacheFileCount: 10, // 最大缓存文件数量
      ),
    )..initialize().then((_) {
        setState(() {});
      });
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cached Video Player'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoCachedPlayer(_controller),
              )
            : CircularProgressIndicator(),
      ),
    );
  }
}

4. 控制视频播放

你可以使用 VideoCachedPlayerController 来控制视频的播放、暂停、停止等操作。例如:

// 播放视频
_controller.play();

// 暂停视频
_controller.pause();

// 停止视频
_controller.stop();

// 跳转到指定时间
_controller.seekTo(Duration(seconds: 10));

// 设置音量
_controller.setVolume(0.5);

// 设置播放速度
_controller.setPlaybackSpeed(1.5);

5. 处理视频状态

你可以监听视频的播放状态、缓冲状态等。例如:

_controller.addListener(() {
  if (_controller.value.isPlaying) {
    // 视频正在播放
  } else if (_controller.value.isBuffering) {
    // 视频正在缓冲
  } else if (_controller.value.isCompleted) {
    // 视频播放完成
  }
});

6. 清理缓存

你可以手动清理缓存:

VideoCachedPlayer.clearCache();

7. 其他配置

video_cached_player 还支持其他一些配置,例如设置缓存目录、自定义缓存策略等。你可以根据需要进行配置。

8. 处理错误

在使用过程中,可能会遇到一些错误,例如网络错误、视频格式不支持等。你可以通过监听 _controllererror 属性来处理这些错误。

_controller.addListener(() {
  if (_controller.value.hasError) {
    // 处理错误
    print(_controller.value.errorDescription);
  }
});

9. 完整示例

以下是一个完整的示例:

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

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

class _MyVideoPlayerState extends State<MyVideoPlayer> {
  VideoCachedPlayerController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = VideoCachedPlayerController(
      url: 'https://www.example.com/sample.mp4',
      cacheConfig: CacheConfig(
        maxCacheSize: 100 * 1024 * 1024,
        maxCacheFileCount: 10,
      ),
    )..initialize().then((_) {
        setState(() {});
      });
  }

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

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

void main() => runApp(MaterialApp(
  home: MyVideoPlayer(),
));
回到顶部