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

native_video_player 封面
插件详情v4.0.1

native_video_player

一个 Flutter 小部件,使用原生实现,在 iOS 和 Android 上播放视频。

AndroidiOSmacOS
近 30 天下载
8740
喜欢数
89
Pub 分数
140

安装插件

flutter pub add native_video_player

插件介绍

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

一个 Flutter 包,可在 iOS、Android 和 macOS 上使用原生平台实现进行视频播放。它通过利用每个操作系统的原生视频播放器,为 Flutter 应用程序提供可靠且高性能的视频内容集成方式。这确保了对各种视频格式和硬件加速有更好的兼容性。该包专为寻求无缝视频播放而无需依赖跨平台抽象的开发者设计。

适合场景

  • 播放本地视频文件
  • 从URL流式传输视频
  • 在媒体丰富的应用程序中集成视频
  • 支持全屏视频播放
  • 使用原生性能构建视频播放器界面

主要特点

  • 在 iOS 和 Android 上使用原生视频播放器
  • 支持视频流和本地文件
  • 硬件加速播放
  • 跨平台兼容性(iOS、Android、macOS)
  • 与 Flutter 小部件的简单集成

适合对象

  • 需要高性能视频播放的开发人员
  • 需要原生视频功能的应用
  • 媒体或教育应用
  • 针对多个平台且视频行为一致的项目

使用建议

  • 仅限 iOS、Android 和 macOS
  • 无网页支持
  • 需要原生平台设置以启用高级功能
  • 依赖于平台特定的视频格式支持

原始 README

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

native_video_player

Pub

A Flutter widget to play videos on iOS, macOS and Android using a native implementation.

Perfect for building video-centric apps like TikTok, Instagram Reels, or YouTube Shorts, as well as general video playback needs.

Android iOS macOS
Support 16+ 9.0+ 10.11+
Implementation

Usage

Loading a video
@override
Widget build(BuildContext context) {
  return NativeVideoPlayerView(
    onViewReady: (controller) async {
      await controller.loadVideo(
        VideoSource(
          path: 'path/to/file',
          type: VideoSourceType.asset,
        ),
      );
    },
  );
}
Listen to events
StreamSubscription<void>? _eventsSubscription;

_eventsSubscription = controller.events.listen((event) {
  switch (event) {
    case PlaybackStatusChangedEvent():
      // Emitted when playback status changes (playing, paused, or stopped)
      final playbackStatus = controller.playbackStatus;
    case PlaybackPositionChangedEvent():
      // Emitted when playback position changes
      final position = controller.playbackPosition;
    case PlaybackReadyEvent():
      // Emitted when video is loaded and ready to play
      final height = controller.videoInfo?.height;
      final width = controller.videoInfo?.width;
      final duration = controller.videoInfo?.duration;
    case PlaybackEndedEvent():
      // Emitted when video playback ends
    case PlaybackSpeedChangedEvent():
      // Emitted when playback speed changes
    case VolumeChangedEvent():
      // Emitted when volume changes
    case PlaybackErrorEvent():
      // Emitted when an error occurs
      print('Playback error: ${event.errorMessage}');
  }
});

// Don't forget to dispose the subscription
@override
void dispose() {
  _eventsSubscription?.cancel();
  super.dispose();
}
Autoplay
bool isAutoplayEnabled = false;

Future<void> _loadVideoSource() async {
  await controller.loadVideo(videoSource);
  if (isAutoplayEnabled) {
    await controller.play();
  }
}
Playback loop
bool isPlaybackLoopEnabled = false;

void _onPlaybackEnded() {
  if (isPlaybackLoopEnabled) {
    controller.stop();
    controller.play();
  }
}

// Set up event listener
_eventsSubscription = controller.events.listen((event) {
  switch (event) {
    case PlaybackEndedEvent():
      _onPlaybackEnded();
    // ... handle other events ...
  }
});
Controller disposal
class VideoPlayerState extends State<VideoPlayer> {
  NativeVideoPlayerController? _controller;
  StreamSubscription<void>? _eventsSubscription;

  Future<void> _initController(NativeVideoPlayerController controller) async {
    _controller = controller;
    _eventsSubscription = _controller?.events.listen((event) {
      // ... handle events ...
    });
  }

  @override
  void dispose() {
    // Cancel any event subscriptions
    _eventsSubscription?.cancel();
    // Dispose of the controller
    _controller?.dispose();
    _controller = null;
    super.dispose();
  }
}

It's important to properly dispose of both the controller and any event subscriptions when you're done with them to prevent memory leaks. This typically happens in the dispose() method of your widget's State.

Advanced usage

See the example app for a complete usage example.

Support this project

Sponsors:

Thank you to all sponsors for supporting this project! ❤️

Other projects

All my projects

Credits

Created by @albemala (Twitter)

所属分类

依赖

依赖清单 2 项

源码仓库

使用此插件的项目