Flutter视频播放插件video_player_win的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter视频播放插件video_player_win的使用

简介

video_player_win 是一个为 Windows 平台设计的轻量级 Flutter 视频播放插件,它使用 Windows 内置的 Media Foundation API。它是 video_player 插件在 Windows 平台上的实现。

平台支持

  • 该插件本身仅支持 Windows。
  • video_player 插件结合使用时,您的应用可以同时支持 Windows、Android、iOS 和 Web。

功能和限制

功能

  • GPU硬件加速,低CPU占用(可能支持4K 60fps视频)
  • 不包含GPL/LGPL第三方库
  • 只添加一个约130KB的DLL文件作为插件
  • 通过与 video_player 合作,支持 Windows/Android/iOS/Web

限制

  • 不支持HLS (.m3u8) 格式
  • 播放依赖于Windows操作系统预加载的编解码器。如果需要播放不被这些预加载编解码器支持的格式,则需安装第三方编解码器包(如K-Lite Codec Pack或Windows 10 Codec Pack)。

支持的格式

由于 video_player_win 使用的是 Windows 内置的 Media Foundation API,因此它可以播放所有能被 Windows Media Player 播放的媒体格式。如果您遇到无法播放的文件,且该文件也不能通过 Windows Media Player 播放,那么您可能需要安装额外的编解码器包来扩展支持的格式范围。

对于 AV1 视频格式的支持,可以通过安装 Microsoft Store 的 AV1 编解码器 或者下载并安装 AV1 编解码器安装程序 来实现。

安装

将以下内容添加到项目的 pubspec.yaml 文件中:

dependencies:
  video_player: ^2.5.1
  video_player_win: ^2.0.0

或者从 GitHub 直接引用最新版本:

dependencies:
  video_player: ^2.5.1
  video_player_win:
    git:
      url: https://github.com/jakky1/video_player_win.git
      ref: master

使用方法

视频/音频播放

从网络资源播放

var controller = VideoPlayerController.network("https://www.your-web.com/sample.mp4");
controller.initialize().then((value) {
  if (controller.value.isInitialized) {
    controller.play();
  } else {
    log("video file load failed");
  }
}).catchError((e) {
  log("controller.initialize() error occurs: $e");
});

从文件播放

var controller = VideoPlayerController.file(File("E:\\test.mp4"));

如果文件是视频,构建一个显示视频帧的小部件:

Widget build(BuildContext context) {
  return VideoPlayer(controller);
}

操作

  • 播放:controller.play();
  • 暂停:controller.pause();
  • 定位:controller.seekTo(Duration(minutes: 10, seconds: 30));
  • 设置播放速度(正常速度:1.0):controller.setPlaybackSpeed(1.5);
  • 设置音量(最大:1.0,静音:0.0):controller.setVolume(0.5);
  • 设置循环:controller.setLooping(true);
  • 释放资源:controller.dispose();

监听播放事件和值

void onPlaybackEvent() {
  final value = controller.value;
  // value.isInitialized (bool)
  // value.size (Size, 视频尺寸)
  // value.duration (Duration)
  // value.isPlaying (bool)
  // value.isBuffering (bool)
  // value.isCompleted (bool)
  // value.position (Duration)
}
controller.addListener(onPlaybackEvent);
...
controller.removeListener(onPlaybackEvent); // 记得移除监听器

示例代码

下面是一个完整的示例代码,演示了如何使用 video_player_win 播放本地视频文件,并提供了一些基本控件:

import 'dart:developer';
import 'dart:io';

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late WinVideoPlayerController controller;

  void reload() {
    controller.dispose();
    controller = WinVideoPlayerController.file(File("D:\\test\\test_youtube.mp4"));

    controller.initialize().then((value) {
      if (controller.value.isInitialized) {
        controller.play();
        controller.setLooping(true);
        setState(() {});

        controller.addListener(() {
          if (controller.value.isCompleted) {
            log("ui: player completed, pos=${controller.value.position}");
          }
        });
      } else {
        log("video file load failed");
      }
    }).catchError((e) {
      log("controller.initialize() error occurs: $e");
    });
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    reload();
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('video_player_win example app'),
        ),
        body: Stack(children: [
          Container(
            color: Colors.black,
            child: WinVideoPlayer(controller),
          ),
          Positioned(
              bottom: 0,
              child: Column(children: [
                ValueListenableBuilder<WinVideoPlayerValue>(
                  valueListenable: controller,
                  builder: ((context, value, child) {
                    int minute = value.position.inMinutes;
                    int second = value.position.inSeconds % 60;
                    String timeStr = "$minute:$second";
                    if (value.isCompleted) timeStr = "$timeStr (completed)";
                    return Text(timeStr,
                        style: Theme.of(context).textTheme.headlineMedium!.copyWith(color: Colors.white, backgroundColor: Colors.black54));
                  }),
                ),
                ElevatedButton(onPressed: () => reload(), child: const Text("Reload")),
                ElevatedButton(onPressed: () => controller.play(), child: const Text("Play")),
                ElevatedButton(onPressed: () => controller.pause(), child: const Text("Pause")),
                ElevatedButton(onPressed: () => controller.seekTo(Duration(milliseconds: controller.value.position.inMilliseconds + 10 * 1000)), child: const Text("Forward")),
                ElevatedButton(onPressed: () {
                  int ms = controller.value.duration.inMilliseconds;
                  var tt = Duration(milliseconds: ms - 1000);
                  controller.seekTo(tt);
                }, child: const Text("End")),
              ])),
        ]),
      ),
    );
  }
}

此代码创建了一个简单的应用程序界面,允许用户播放、暂停、快进以及重新加载视频。同时,它还展示了如何获取和显示当前播放时间,并处理播放完成等事件。


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

1 回复

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


在Flutter中,video_player_win 是一个专门用于 Windows 平台的视频播放插件。虽然 video_player_win 并不是一个官方插件,但基于你的需求,我将展示一个使用 Flutter 的官方插件 video_playerchewie(用于封装 video_player 控件)在 Windows 平台播放视频的示例。请注意,video_player 插件支持多种平台,包括 Windows,而 chewie 提供了用户友好的播放界面。

首先,你需要在 pubspec.yaml 文件中添加这些依赖:

dependencies:
  flutter:
    sdk: flutter
  video_player: ^2.2.17  # 请检查最新版本号
  chewie: ^1.2.2  # 请检查最新版本号

然后运行 flutter pub get 来获取这些依赖。

接下来,在你的 Dart 文件中,你可以按照以下方式使用这些插件:

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

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

class VideoPlayerWithControls extends StatefulWidget {
  @override
  _VideoPlayerWithControlsState createState() => _VideoPlayerWithControlsState();
}

class _VideoPlayerWithControlsState extends State<VideoPlayerWithControls> {
  VideoPlayerController _controller;
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(
      'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
    )
      ..initialize()
      .then((_) {
        setState(() {});
        _createChewieController();
      });
  }

  void _createChewieController() {
    setState(() {
      _chewieController = ChewieController(
        _controller,
        aspectRatio: _controller.value.aspectRatio,
        autoPlay: false,
        looping: false,
      );
    });
  }

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ChangeNotifierProvider(
        create: (_) => VideoPlayerController.network(
          'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
        ),
        child: Consumer<VideoPlayerController>(
          builder: (context, controller, child) {
            return VideoPlayerWithControls();
          },
        ),
      ),
    );
  }
}

注意

  1. 上述代码使用了 provider 包来管理视频控制器的状态,但在这个示例中,我们直接在 VideoPlayerWithControls 中初始化了 VideoPlayerController。因此,ChangeNotifierProviderConsumer 的使用在这个简单示例中是多余的,你可以直接去掉它们。
  2. 如果你想在 Windows 上运行这个示例,确保你已经设置了 Flutter 的 Windows 开发环境。
  3. 由于 video_player 插件支持 Windows,上述代码在 Windows 上应该能够正常运行。

如果你确实需要使用 video_player_win 这个特定的插件(虽然它不是官方插件),你可能需要查找该插件的文档或仓库,因为它可能有自己的使用方法和API。然而,大多数情况下,官方的 video_player 插件已经足够满足需求。

回到顶部