搜索插件、代码仓与 APP 分类

插件详情v3.3.1

video_player_win

适用于 Windows 的视频播放器,轻量级,使用 Windows 内置的 Media Foundation API。video_player 插件的 Windows 实现。

Windows
近 30 天下载
17.3万
喜欢数
71
Pub 分数
150

安装插件

flutter pub add video_player_win

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个轻量级的 Windows 版视频播放插件实现,利用原生 Media Foundation API 实现高效的视频播放。专为 Windows 设计,可与针对桌面平台的 Flutter 应用无缝集成。该包能够以极低的开销实现流畅的视频渲染,非常适合需要在 Windows 系统上可靠播放媒体的应用程序。它是更广泛的 video_player 生态系统的一部分,在无需额外依赖的情况下扩展了对 Windows 的功能支持。

适合场景

  • 在桌面应用程序中播放本地视频文件
  • 在 Windows Flutter 应用程序中流式传输视频
  • 将视频播放功能集成到基于Windows的多媒体工具中
  • 支持跨平台桌面应用程序中的视频内容
  • 在 Windows 上启用硬件加速播放

主要特点

  • 使用 Windows Media Foundation API
  • 轻便高效
  • Windows 上的原生性能
  • 与 video_player 的无缝集成
  • 通过 Flutter 实现跨平台兼容性

适合对象

  • 面向 Windows 桌面的 Flutter 开发人员
  • Windows 上需要原生视频播放的应用程序
  • 丰富的媒体桌面应用程序
  • 跨平台使用 video_player 的开发者
  • 需要低级别媒体控制的项目

使用建议

  • 仅限 Windows 的平台支持
  • 需要 Windows 7 或更高版本
  • 仅限桌面环境
  • 依赖 video_player 核心插件
  • 不支持 Linux 或 macOS

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

video_player_win

Flutter video player for Windows, lightweight, using Windows built-in Media Foundation API. Windows implementation of the video_player plugin.

Platform Support

This package itself support only Windows.

But use it with video_player, your app can support Windows / Android / iOS / Web at the same time.

Built-in control panel & Fullscreen & Subtitle support

Please use package video_player_control_panel instead.

Which also use this package to play video on Windows.

Features & Limitations

Features:

  • GPU hardware acceleration, low CPU usage (maybe support 4K 60fps video?)
  • No GPL / LGPL 3rd-party libraries inside.
  • Only one dll file (~130 KB) added as a plugin.
  • Support Windows / Android / iOS / Web by collaboration with video_player

Limitations:

  • This package doesn't support HLS (.m3u8)

But, since this package use Microsoft Media Foundation API, there are some limtations:

  • Playback will use codecs preloaded in Windows OS. If you want to play some video format that not supported by these preloaded codecs, you need to install 3rd-party codecs exe file, about 18 MB. (see the next section).

Supported Formats in Windows (Important !)

Ref: Windows preloaded codec list

This package use Windows built-in Media Foundation API. So playback video will use the codecs preload in your Windows environment. All the media format can be played by WMP (Windows Media Player) can also be played by this package. However, the preloaded codecs in Windows is limited.

If you have a media file cannot played by this package, ALSO CANNOT played by WMP (Windows Media Player), it means that this media file is not support by codecs preloaded in your Windows.

In this case, please install ONE of the following codec pack into your Windows:

You can auto-install codec by the following Dart code:

import 'dart:io';

Process.run('E:\\K-Lite_Codec_Pack_1730_Basic.exe', ['/silent']).then((value) {
  if (value.exitCode == 0) log("installation success");
  else log("installation failed");
});

After install the codec pack, most of the media format are supported.

Supported AV1 video

To play AV1 video,

You can silently auto-install codec by the following Dart code:

import 'dart:io';

Process.run('powershell', ['Add-AppxPackage', '-Path', 'E:\\av1-video-extension-1-1-52851-0.appx']).then((value) {
  if (value.exitCode == 0) log("installation success");
  else log("installation failed");
});

Problem shootting for building fail

If you build fail with this package, and the error message has the keyword "MSB3073":

  • run "flutter build windows" in command line in [Administrator] mode

Quick Start

Installation

Add this to your package's pubspec.yaml file:

dependencies:
  video_player: ^2.5.1
  video_player_win: ^3.0.0

Usage

video / audio playback

Play from network source:

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");
});

Play from file:

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

If the file is a video, build a display widget to show video frames:

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

operations

  • Play: controller.play();
  • Pause: controller.pause();
  • Seek: controller.seekTo( Duration(minute: 10, second:30) );
  • set playback speed: (normal speed: 1.0) controller.setPlaybackSpeed(1.5);
  • set volume: (max: 1.0 , mute: 0.0) controller.setVolume(0.5);
  • set looping: controller.setLooping(true);
  • free resource: controller.dispose();

Listen playback events and values

void onPlaybackEvent() {
	final value = controller.value;
	// value.isInitialized (bool)
	// value.size (Size, video size)
	// value.duration (Duration)
	// value.isPlaying (bool)
	// value.isBuffering (bool)
	// value.isCompleted (bool)
	// value.position (Duration)
}
controller.addListener(onPlaybackEvent);
...
controller.removeListener(onPlaybackEvent); // remember to removeListener()

Release resource

controller.dispose();

Keep aspect ratio of VideoPlayer

Widget player = Container(
  color: Colors.black,
  child: Center(
    child: AspectRatio(
      aspectRatio: controller!.value.aspectRatio,
      child: VideoPlayer(controller!),
    ),
  ),
);

standalone mode

If your app only runs on Windows, and you want to remove library dependencies as many as possible, you can modify pubspec.yaml file:

dependencies:
  # video_player: ^2.4.7 # mark this line, for Windows only app
  video_player_win:

and modify all the following class name in your code:

VideoPlayer -> WinVideoPlayer  // add "Win" prefix
VideoPlayerController -> WinVideoPlayerController  // add "Win" prefix

just only modify class names. All the properties / method are the same with video_player

Example

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 VideoPlayerController controller;

  @override
  void initState() {
    super.initState();
    controller = VideoPlayerController.file(File("E:\\test_youtube.mp4"));
    controller.initialize().then((value) {
      if (controller.value.isInitialized) {
        controller.play();
        setState(() {});
      } else {
        log("video file load failed");
      }
    });
  }

  @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: [
          VideoPlayer(controller),
          Positioned(
            bottom: 0,
            child: Column(children: [
              ValueListenableBuilder(
                valueListenable: controller,
                builder: ((context, value, child) {
                  int minute = controller.value.position.inMinutes;
                  int second = controller.value.position.inSeconds % 60;
                  return Text("$minute:$second", style: Theme.of(context).textTheme.headline6!.copyWith(color: Colors.white, backgroundColor: Colors.black54));
                }),
              ),
              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")),
            ])),
        ]),
      ),
    );
  }
}

所属分类

依赖

依赖清单 2 项

  • plugin_platform_interface^2.0.2
  • video_player_platform_interface^6.2.1

源码仓库

使用此插件的项目

所在榜单