🎞 Flutter media playback, broadcast & recording library for Windows, Linux & macOS. Written in C++ using libVLC & libVLC++. (Both audio & video)

Overview

dart_vlc

pub package CI/CD Donate

Flutter media playback, broadcast, recording & chromecast library for Windows, Linux & macOS.

Written in C++ using libVLC & libVLC++.

Installation

Flutter

dependencies:
  ...
  dart_vlc: ^0.1.6

Dart CLI

dependencies:
  ...
  dart_vlc_ffi: ^0.1.3

More on Dart CLI implementation here.

Feel free to open a new issue or discussion, if you found a bug or need assistance.

Support

Consider supporting the project by starring the repository or buying me a coffee.

Donate Donate

Thanks a lot for your support. Android support is on its way.

Documentation

Checkout Setup section to configure plugin on your platform.

Initialize the library

void main() {
  DartVLC.initialize();
  runApp(MyApp());
}

Create a new player instance.

Player player = Player(id: 69420);

For passing VLC CLI arguments, use commandlineArguments argument.

Player player = Player(
  id: 69420,
  commandlineArguments: ['--no-video']
);

Create a media for playback.

Media media0 = Media.file(
  File('C:/music.mp3')
);

Media media1 = Media.asset(
  'assets/audio/example.mp3'
);

Media media2 = Media.network(
  'https://www.example.com/music.aac'
);

// Clip the media.
Media media2 = Media.network(
  'https://www.example.com/music.aac',
  startTime: Duration(seconds: 20), // Start media from 20 seconds from the beginning.
  stopTime: Duration(seconds: 60), // End media at 60 seconds from the beginning. 
);

Create a list of medias using playlist.

Playlist playlist = new Playlist(
  medias: [
    Media.file(File('C:/music.mp3')),
    Media.file(File('C:/audio.mp3')),
    Media.asset('assets/audio/example.mp3'),
    Media.network('https://www.example.com/music.aac'),
  ],
);

Open a media or playlist into a player.

player.open(
  Media.file(File('C:/music0.mp3')),
  autoStart: true, // default
);
player.open(
  Playlist(
    medias: [
      Media.file(new File('C:/music0.mp3')),
      Media.file(new File('C:/music1.mp3')),
      Media.file(new File('C:/music2.mp3')),
    ],
  ),
  autoStart: false,
);

Control playback.

player.play();

player.seek(Duration(seconds: 30));

player.pause();

player.playOrPause();

player.stop();

Traverse through the playlist.

player.next();

player.back();

player.jump(10);

Manipulate an already playing playlist.

player.add(
  Media.file(File('C:/music0.mp3')),
);

player.remove(4);

player.insert(
  2,
  Media.file(File('C:/music0.mp3')),
);

player.move(0, 4);

Set playback volume & rate.

player.setVolume(0.5);

player.setRate(1.25);

Get & change playback device.

List<Device> devices = Devices.all;

player.setDevice(
  devices[0],
);

Save the video snapshot

player.takeSnapshot(file, 1920, 1080);

Show the video inside widget tree.

Show Video in the Widget tree.

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Video(
        player: player,
        height: 1920.0,
        width: 1080.0,
        scale: 1.0, // default
        showControls: false, // default
      ),
    );
  }
}

By default, Video widget's frame size will adapt to the currently playing video. To override this & define custom video frame size, pass videoDimensions argument while instanciating Player class as follows.

Player player = Player(
  id: 69420,
  videoDimensions: const VideoDimensions(640, 360)
);

Thanks to @tomassasovsky for adding visual controls to Video widget.

Change user agent

player.setUserAgent(userAgent);

Retrieve metadata of media.

Media media = Media.network(
  'https://www.example.com/media.mp3',
  parse: true,
  timeout: Duration(seconds: 10),
);

Map<String, String> metas = media.metas;

Listen to playback events.

(Same can be retrieved directly from Player instance without having to rely on stream).

Listen to currently loaded media & playlist index changes.

player.currentStream.listen((CurrentState state) {
  state.index;
  state.media;
  state.medias;
  state.isPlaylist;
});

Listen to playback position & media duration.

player.positionStream.listen((PositionState state) {
  state.position;
  state.duration;
});

Listen to playback states.

player.playbackStream.listen((PlaybackState state) {
  state.isPlaying;
  state.isSeekable;
  state.isCompleted;
});

Listen to volume & rate of the Player.

player.generalStream.listen((GeneralState state) {
  state.volume;
  state.rate;
});

Listen to dimensions of currently playing Video.

player.videoDimensionsStream.listen((VideoDimensions video) {
  video.width;
  video.height;
});

Listen to buffering progress of the playing Media.

player.bufferingProgressStream.listen(
  (double event) {
    this.setState(() {
      this.bufferingProgress = event;
    });
  },
);

Set an equalizer.

Create using preset.

Equalizer equalizer = Equalizer.createMode(EqualizerMode.party);
player.setEqualizer(equalizer);

Create custom equalizer.

Equalizer equalizer = Equalizer.createEmpty();
equalizer.setPreAmp(10.0);
equalizer.setBandAmp(31.25, -10.0);
equalizer.setBandAmp(100.0, -10.0);
player.setEqualizer(equalizer);

Get equalizer state.

equalizer.preAmp;
equalizer.bandAmps;

Broadcast a media.

Broadcasting to localhost.

Broadcast broadcast = Broadcast.create(
  id: 0,
  media: Media.file(File('C:/video.mp4')),
  configuration: BroadcastConfiguration(
    access: 'http',
    mux: 'mpeg1',
    dst: '127.0.0.1:8080',
    vcodec: 'mp1v',
    vb: 1024,
    acodec: 'mpga',
    ab: 128,
  ),
);
broadcast.start();

Dispose the Broadcast instance to release resources.

broadcast.dispose();

Record a media.

Thanks to @DomingoMG for adding Record and Chromecast classes.

Record record = Record.create(
  id: 205, 
  media: Media.network('https://www.example.com/streaming-media.MP3'), 
  pathFile: '/home/alexmercerind/recording.MP3',
);
record.start();

Setup

Windows

Everything is already set up.

macOS

To run on macOS, install CMake through Homebrew:

brew install cmake

If you encounter the error cmake: command not found during archiving:

  1. Download CMake and move it to the Applications Folder.
  2. Run:
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install

Linux

For using this plugin on Linux, you must have VLC & libVLC installed.

On Ubuntu/Debian:

sudo apt-get install vlc
sudo apt-get install libvlc-dev

On Fedora:

sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install vlc
sudo dnf install vlc-devel

iOS [WIP]

Disable bitcode generation for the whole project for MobileVLC to work. Add the following to the post_install function living in the Podfile of your iOS Flutter project. For reference look at the Podfile in the example project.

target.build_configurations.each do |config|
    config.build_settings['ENABLE_BITCODE'] = 'NO'
end

For the example project to work you need to configure a real device in the xcode project, or comment out the build script Build Device lib in in ios/dart_vlc.podspec.

Example

You can see an example project here.

dart_vlc running on Ubuntu Linux.

Workings

The repository contains a C++ wrapper based on libVLC++. This makes handling of events and controls a lot easier & has additional features in it. I preferred to do majority of handling in C++ itself, thus Dart code is minimal & very slight mapping to it.

This project might seem like a Flutter plugin, but it is based on FFI instead. Here are the FFI bindings to C++ wrapper, which are shared by all platforms & same can be used in Dart CLI apps aswell. Platform channel interface is only used for [flutter]

Progress

Done

  • Media playback from File.
  • Media playback from network.
  • Media playback from assets.
  • play/pause/playOrPause/stop.
  • Multiple Player instances.
  • Playlist.
  • next/back/jump for playlists.
  • setVolume.
  • setRate.
  • seek.
  • Events.
  • Automatic fetching of headers, libs & shared libraries.
  • Changing VLC version from CMake.
  • Event streams.
    • Player.currentState
      • index: Index of current media in Playlist.
      • medias: List of all opened Medias.
      • media: Currently playing Media.
      • isPlaylist: Whether a single Media is loaded or a Playlist.
    • Player.positionState
      • position: Position of currently playing media in Duration.
      • duration: Position of currently playing media in Duration.
    • Player.playbackState
      • isPlaying.
      • isSeekable.
      • isCompleted.
    • Player.generalState
      • volume: Volume of current Player instance.
      • rate: Rate of current Player instance.
  • add/insert/remove/move Media inside Playlist during playback.
  • Device enumeration & changing.
  • Retrieving Meta of a Media.
  • Embedding Video inside the Flutter window.
  • Supporting live streaming links.
  • Broadcast class for broadcasting Media.
  • Record class for recording Media.
  • Chromecast class.
  • Equalizer support.
  • Adding headers for Media.network (Not possible, added user agent).
  • Switching to FFI for more cross platform freedom.
  • Changing Video's frame size according to video.
  • Saving snapshot.

Under progress or planned features (irrespective of order)...

  • Removing libVLC++ dependency. (Maybe).
  • Subtitle control.
  • Audio track control.
  • Writing metadata tags.
  • Making things more efficient.
  • Supporting native volume control/lock screen notifications (Maybe).
  • Bringing project on other platforms like Android/iOS (Maybe).
  • D-Bus MPRIS controls for Media playback control (Maybe).

Acknowledgements

First of all, thanks to the VideoLAN team for creating libVLC & libVLC++. Really great guys really great at their work.

Thanks to @jnschulze for his awesome contributions to this project & to Flutter engine itself like adding texture support.

Thanks to @krjw-eyev for working on iOS support.

Thanks to @jnschulze & @namniav for working on macOS support.

Thanks to @stuartmorgan from The Flutter Team for helping out the project with his opinions.

Thanks to following members of libVLC community (irrespective of the order) for giving general ideas about libVLC APIs:

Contributions

The code in the project is nicely arranged and follows the clean architecture.

Contributions to the project are open, it will be appreciated if you discuss the bug-fix/feature-addition in the issues first.

License

Copyright (C) 2021, Hitesh Kumar Saini [email protected].

This library & work under this repository is licensed under GNU Lesser General Public License v2.1.

Vision

There aren't any media (audio or video) playback libraries for Flutter or Dart on Windows/Linux yet. So, this project is all about that. As one might be already aware, VLC is one of the best media playback tools out there.

So, now you can use it to play audio or video files from Flutter or Dart apps.

As the project has grown, awesome people from community have added support for iOS & macOS aswell.

Comments
  • Player::Open causes crash in release mode.

    Player::Open causes crash in release mode.

    I want to change video by click on each videos url.

    Player player = Player(id: 123); String url = 'http://company.com/video/1.mp4'; player.open( Media.network(url), );


    setState(() { url = 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'; });

    Thank you!

    bug critical 
    opened by huonsokly 35
  • `NativeVideo`: flickering under certain arrangements

    `NativeVideo`: flickering under certain arrangements

    Describe the bug Using the native video widget some times application crash(without showing any errors) and if it works the audio is playing correctly but with no output (black screen ) also a small window pops up in the center of the black screen and then disappers (doesent have text inside it from what i saw)

    Media

    both url and local files does the same bug

    Minimal reproducible code

    followed example code
    

    Flutter logs output is too long so i cant provide it

    [√] Flutter (Channel stable, 2.10.4, on Microsoft Windows [Version 10.0.19043.1586], locale en-US)
        β€’ Flutter version 2.10.4 at G:\My Work HDD2\flutter
        β€’ Upstream repository https://github.com/flutter/flutter.git
        β€’ Framework revision c860cba910 (2 weeks ago), 2022-03-25 00:23:12 -0500
        β€’ Engine revision 57d3bac3dd
        β€’ Dart version 2.16.2
        β€’ DevTools version 2.9.2
    
    [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
        β€’ Android SDK at C:\Users\zezo_\AppData\Local\Android\sdk
        β€’ Platform android-31, build-tools 31.0.0
        β€’ Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
        β€’ Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822)
        β€’ All Android licenses accepted.
    
    [√] Chrome - develop for the web
        β€’ Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
    
    [√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.11.8)
        β€’ Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
        β€’ Visual Studio Community 2019 version 16.11.32002.261
        β€’ Windows 10 SDK version 10.0.19041.0
    
    [√] Android Studio (version 2021.1)
        β€’ Android Studio at C:\Program Files\Android\Android Studio
        β€’ Flutter plugin can be installed from:
           https://plugins.jetbrains.com/plugin/9212-flutter
        β€’ Dart plugin can be installed from:
           https://plugins.jetbrains.com/plugin/6351-dart
        β€’ Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822)
    
    [√] IntelliJ IDEA Community Edition (version 2021.3)
        β€’ IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3
        β€’ Flutter plugin can be installed from:
           https://plugins.jetbrains.com/plugin/9212-flutter
        β€’ Dart plugin can be installed from:
           https://plugins.jetbrains.com/plugin/6351-dart
    
    [√] VS Code, 64-bit edition (version 1.65.2)
        β€’ VS Code at C:\Program Files\Microsoft VS Code
        β€’ Flutter extension can be installed from:
           https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
    
    [√] Connected device (3 available)
        β€’ Windows (desktop) β€’ windows β€’ windows-x64    β€’ Microsoft Windows [Version 10.0.19043.1586]
        β€’ Chrome (web)      β€’ chrome  β€’ web-javascript β€’ Google Chrome 100.0.4896.75
        β€’ Edge (web)        β€’ edge    β€’ web-javascript β€’ Microsoft Edge 100.0.1185.29
    
    [√] HTTP Host Availability
        β€’ All required HTTP hosts are available
    
    β€’ No issues found!
    
    

    Operating system:

    • Platform: Windows.

    • OS version: Windows 10 21H1.

    • [x] I confirm this is not a bug in the VLC app & only dart_vlc.

    • [ ] I have donated / sponsored dart_vlc.

    Screenshots If applicable, add screenshots to help explain your problem. Otherwise, do nothing.

    Imported using

    dependencies:
      dart_vlc:
        git:
          url: https://github.com/alexmercerind/dart_vlc.git
          ref: master
    
    dependency_overrides:
      dart_vlc_ffi:
        git:
          url: https://github.com/alexmercerind/dart_vlc.git
          ref: master
          path: ffi
    
    bug 
    opened by zezo357 23
  • Issue running in MacOS

    Issue running in MacOS

    Launching lib/main.dart on macOS in debug mode... lib/main.dart:1 Command CompileSwift failed with a nonzero exit code Command CompileSwift failed with a nonzero exit code CMake Error: The source directory "/Users/Mac15/Documents/Flutter Projects/sample flutter projects/sample_project/macos/Pods/projects/sample_project/macos/Flutter/ephemeral/.symlinks/plugins/dart_vlc/macos/deps" does not exist. Specify --help for usage, or press the help button on the CMake GUI. Command PhaseScriptExecution failed with a nonzero exit code Command CompileSwift failed with a nonzero exit code note: Using new build system note: Building targets in parallel note: Planning build note: Analyzing workspace note: Constructing build description note: Build preparation complete ** BUILD FAILED **

    question 
    opened by sanalkv 22
  • Missing file  β€œ../include/vlcpp/vlc.hpp”: No such file or directory

    Missing file β€œ../include/vlcpp/vlc.hpp”: No such file or directory

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: ε‘½δ»€β€œsetlocal [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: cd C:\Git\dasi-spd\windows\flutter\ephemeral.plugin_symlinks\dart_vlc\windows\bin [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: C: [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E tar xzf "C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/bin/vlc-3.0.9.2.7z" [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E tar xzf "C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/bin/libvlcpp.zip" [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E copy_directory C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/bin/vlc-3.0.9.2/sdk/include/vlc C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/include/vlc [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E copy_directory C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/bin/libvlcpp-master/vlcpp C:/Git/dasi-spd/windows/flutter/ephemeral/.plugin_symlinks/dart_vlc/windows/include/vlcpp [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: :cmEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: :cmErrorLevel [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: exit /b %1 [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: :cmDone [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(143,5): error MSB3073: :VCEndβ€ε·²ι€€ε‡ΊοΌŒδ»£η δΈΊ 1。 [C:\Git\dasi-spd\build\windows\plugins\dart_vlc\LIBVLC_EXTRACT.vcxproj] Exception: Build process failed.

    question 
    opened by yiky84119 22
  • Player: Add a new option to the open method

    Player: Add a new option to the open method

    It would be interesting to incorporate a variable called start at.

    player.open(
      Media.file(File('C:/music0.mp3')),
      autoStart: true, // default,
      startAt: Duration(minutes: 1, seconds: 30) // optional
    );
    
    enhancement 
    opened by DomingoMG 19
  • Video Widget: setState being called after being dismounted from Widget tree.

    Video Widget: setState being called after being dismounted from Widget tree.

    I'm using this package for streaming multiple cameras on a page of my Flutter App. With the new version (0.0.8) I'm facing a problem, I see all the images of the Players in a single Video, but in my code I create more than one Video. With the old version (0.0.7) I haven't this problem and the code was the same, with the asyncand the awaitcalls obviously.

    Below there is the code of my Streaming page:

    class CameraScreen extends StatefulWidget {
      CameraScreen(
          {required Key key,
          required this.onPageChange,
          required this.onLogout,
          required this.id})
          : super(key: key);
      final Function(String, String) onPageChange;
      final VoidCallback onLogout;
      final String id;
      @override
      CameraScreenState createState() => CameraScreenState();
    }
    
    class CameraScreenState extends State<CameraScreen>
        with TickerProviderStateMixin {
      PageConfig pageConfig = PageConfig();
      String project = '';
      List<ResponsiveGridCol> children = [];
      List<Player> players = [];
      List<dynamic> items = [];
      double initialSliderValue = 0;
    
    
      @override
      void initState() {
        DartVLC.initialize();
    
        project = Project.getCurrentProject();
        pageConfig = Project.getProjectPageDetails(widget.id);
        getData();
        super.initState();
      }
    
      @override
      void dispose() {
        stopAndDisposePlayers();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return CustomScaffold(
          text: pageConfig.name!,
          onPageChange: widget.onPageChange,
          onLogout: widget.onLogout,
          body: Padding(
            padding: const EdgeInsets.all(8.0),
            child: SingleChildScrollView(
              child: ResponsiveGridRow(
                children: children,
              ),
            ),
          ),
        );
      }
    
      void getData() {
        File cameraFile = File(AppStrings.CONFIG_DIRECTORY_PATH +
            project +
            AppStrings.CAMERA_CONFIG_FILE_NAME);
        items = jsonDecode(cameraFile.readAsStringSync());
        List<Video> videos = [];
        List<ResponsiveGridCol> widgets = [];
        for (int i = 0; i < items.length; i++) {
          var cameraConfig = Camera.fromJson(items[i]);
          Player player = Player(id: 100 + i, videoWidth: 400, videoHeight: 300);
          var media = Media.network(cameraConfig.url,
              parse: true, timeout: Duration(seconds: 2));
          player.open(media);
          player.play();
          players.add(player);
          var video = Video(
            playerId: 100 + i,
            width: 500,
            height: 375,
            showControls: false,
          );
          videos.add(video);
          widgets.add(
            ResponsiveGridCol(
              lg: 6,
              child: Card(
                child: Column(
                  children: [
                    Text(cameraConfig.title, style: AppStyles.BOLD),
                    Text(AppStrings.CAMERAS_TEXT),
                    video,
                    Divider(),
                    IconButton(
                      icon: Icon(Icons.open_in_browser),
                      onPressed: () {
                      },
                    )
                  ],
                ),
              ),
            ),
          );
        }
        for (var item in videos) {
          print(item.playerId);
        }
        if (mounted) {
          setState(() {
            children = widgets;
          });
        }
      }
    
    
      void stopAndDisposePlayers() {
        for (var player in players) {
          player.stop();
          player.dispose();
        }
      }
    }
    
    bug enhancement improvement 
    opened by MattiaudaNicolasCN 18
  • [only-video] High CPU Usage (in Windows)

    [only-video] High CPU Usage (in Windows)

    Running even the simple example app seems to cause high CPU usage and very high power usage.

    When playing: image

    When paused: image

    Comparing to VLC:

    When playing: image

    Comparing to MPV:

    When playing: image

    Honestly the usages of vlc and the app is very similar when considering only the player but an average should not use this much of resources for just video playback. Comparatively MPV seems to use very less amount of resources. The gap between 8% / 22% and 42% is just too much. My average app seems to use nearly 62% CPU which is just too much when someone is multitasking.

    enhancement improvement 
    opened by zyrouge 15
  • Loop media

    Loop media

    Hi,

    first of thanks for the awesome package!

    So, my problem is that I'm trying to loop a playlist. I've tried playlistMode, but when i add playlistMode: PlaylistMode.loop it gives me Undefined name 'PlaylistMode'.

    Would be great if you could look into it or have a solution.

    bug 
    opened by jonafeucht 14
  • Example App Not Working on MX Linux (Ubuntu based)

    Example App Not Working on MX Linux (Ubuntu based)

    I installed libvlc-dev (version 3.0.12-1~mx19+1) and included the library on my pubspec.yaml file. When I try to run the application i get this error:

    Launching lib/main.dart on Linux in debug mode...  
    clang: error: linker command failed with exit code 1 (use -v to see invocation)  
    Exception: Build process failed  
    Exited (sigterm)
    
    documentation question 
    opened by tomassasovsky 14
  • Bad performance in Windows 10

    Bad performance in Windows 10

    I'm working on a Flutter Windows application. When I'm trying to play multiple short audio files in a short succession the whole UI becomes very laggy and causes lag spikes. Sometimes the UI remains unresponsive until the sound playback finishes. Am I doing something wrong?

    The code looks something like this:

    // initilitzing the player
    Player soundPlayer = Player(id: 0, commandlineArguments: ['--no-video']);
    
    // method that plays a sound
    void playSound(String sound) {
        soundPlayer?.open(Media.asset(sound), autoStart: true);
    }
    

    Steps to reproduce: call playSound() multiple times in short succession (i.e. on a button click).

    Tested with:

    flutter 2.10.4
    dart_vlc: ^0.1.9
    dart_vlc_ffi: ^0.1.5+1
    windows 10
    
    invalid 
    opened by gkovac42 13
  • Fix: Create new texture when video frame size is changed.

    Fix: Create new texture when video frame size is changed.

    [WIP]

    • Add VideoResizeCallback to Player::OnVideo listener, to get callback ahead of buffer reallocation (if the frame size is changed).
    • Now PlayerRegisterTexture & PlayerUnregisterTexture are renamed to PlayerCreateVideoOutlet & PlayerDeleteVideoOutlet.
    • Now method channel call no longer creates texture ahead of time, but when first frame of the video is received.
    • If a new media of different video dimensions is opened, the previous texture is deleted & new is created (VideoOutlet::CreateNewTexture), whose texture ID is notified through the method channel.
    • Currently UnregisterTexture is causing exception (from VideoOutlet::DeleteTexture).
      • Not sure about the reason.
      • Although I'm sure that I'm NOT deleting the texture ID which was never created.

    Screenshot 2021-08-25 171022

    opened by alexmercerind 13
  • Loop a video with unusual pause intervals.

    Loop a video with unusual pause intervals.

    Because the video is as seamless as a gif. Introduce a video through this package and then set it to loop. There will be a noticeable pause before and after the switch.

    Here is a demo of the video.

    Honeycam 2022-12-13 03-51-11

    https://user-images.githubusercontent.com/13862699/207139591-e22e9ce6-b277-4fcd-ad44-366118c218b3.mp4

    bug 
    opened by ismanong 0
  • Unable to load audio files from /storage/emulated/0 and its sub-directories

    Unable to load audio files from /storage/emulated/0 and its sub-directories

    This plugin no more is able to load audio files from /storage/emulated/0 and its sub-directories . The error status is: LateError (LateInitializationError: Field 'dynamicLibrary')

    **Plugin version: dart_vlc: ^0.1.9 **

    Operating system: Tested on: Android OS emulator and the project was running on Parrot Security OS .

    Kindly, check .

    bug 
    opened by Farial-mahmod 1
  • ignore compile for unsupported platform

    ignore compile for unsupported platform

    how i can ignore compile lib for web?

    i check platform in my dart code and for Linux all ok. but for web see this:

    Launching lib/main.dart on Chrome in debug mode...
    Waiting for connection from debug service on Chrome...
    ../../.pub-cache/hosted/pub.dartlang.org/dart_vlc_ffi-0.2.0+1/lib/src/internal/ffi.dart:1:8: Error: Not found: 'dart:ffi'
    import 'dart:ffi';
           ^
    ../../.pub-cache/hosted/pub.dartlang.org/dart_vlc_ffi-0.2.0+1/lib/src/internal/dynamiclibrary.dart:1:8: Error: Not found: 'dart:ffi'
    import 'dart:ffi';
           ^
    ../../.pub-cache/hosted/pub.dartlang.org/dart_vlc_ffi-0.2.0+1/lib/src/internal/typedefs/player.dart:1:8: Error: Not found: 'dart:ffi'
    import 'dart:ffi';
           ^
    ../../.pub-cache/hosted/pub.dartlang.org/dart_vlc_ffi-0.2.0+1/lib/src/internal/typedefs/media.dart:1:8: Error: Not found: 'dart:ffi'
    import 'dart:ffi';
           ^
    Failed to compile application.
    
    
    bug 
    opened by Nightwelf 0
  • Video: Hardware Acceleration

    Video: Hardware Acceleration

    How is current video rendering?

    Currently, whenever you show a video using Video widget from package:dart_vlc, it produces redundant load on your CPU. It is because every frame is copied from GPU back to RAM through CPU for rendering inside Flutter i.e. no hardware-acceleration. This load on CPU increases significantly with higher resolution or higher FPS videos.

    This still works fine -ish with 720p videos (bearable CPU load).

    What is hardware acceleration?

    From Google:

    Hardware acceleration is the use of computer hardware designed to perform specific functions more efficiently when compared to software running on a general-purpose central processing unit.

    Playing a video should make use of dedicated hardware i.e. GPU (and not CPU). CPU is for general-purpose computation, not copying frames/buffers or rendering things efficiently. As discussed above, since every video frame is copied from GPU back to RAM through CPU for rendering inside Flutter, redundant CPU load is seen. This also increases the power usage (battery consumption).

    Currently, 720p videos result in bearable CPU load & work fine -ish. Higher than that, high CPU usage.

    NOTE: If you are showing the Video in a small part of the UI, you can limit the dimensions of each frame manually. This will reduce CPU usage & give you finer control to tweak the performance.

    Player player = Player(id: 0, videoDimensions: const VideoDimensions(640, 360));
    

    Why is hardware acceleration not supported (yet)?

    First of all, because this is way too complex to be part of someone's hobby. A funding is necessary here.

    Both, due to Flutter & libVLC's limitations at that time.

    When & how will be hardware accelerated video playback implemented?

    Fortunately, package:dart_vlc & my work in this regard is now sponsored by Stream.

    This is a concern for Windows & Linux currently. Scope of work may be increased as required, however package:video_player already seems to have hardware acceleration. Maybe I will add support to package:video_player itself at some point.


    Stream Chat

    Rapidly ship in-app messaging with Stream's highly reliable chat infrastructure and feature-rich SDKs, including Flutter!

    Try the Flutter Chat tutorial


    I made a POC implementation (posted on my Twitter) showing hardware-accelerated video rendering inside Flutter. It is using libmpv & ANGLE based Direct3D & open-gl interop. Notice minimal CPU 2 % - 5% usage. Slight usage can still be seen due to logging/flushing etc. for debugging. It will be improved. Same would have caused about 20-25% with package:dart_vlc (even more with higher resolution & FPS videos).

    I have decided to use libmpv because it has API for rendering video output using open-gl. Since, this package has everything specifically around VLC, it makes no sense to work on it here.

    Thus, expect a new package really-really soon with hardware accelerated video playback. Other than just hardware-accelerated video embedding, it has things like metadata / tags reader, shifting support, pitch shifting, volume boost, dynamic playlists & native OS controls etc. out-of-the-box along-side basic features. Audio-only support is ready & used in Harmonoid: A Material Design-led music player to play & manage music library. Most importantly: It is far smaller in size compared to package:dart_vlc, stable & even supports Windows 7.

    Switching to libmpv does not mean that I do not like VLC or the awesome work that developers have done on it. It is still the best of best (& my preferred) media player, which I have installed on every device I own. However, from the library / plugin standpoint, I'm not quite satisfied.

    https://user-images.githubusercontent.com/28951144/196414122-9e860a3b-df85-4352-96a3-1a5dbfaca4c4.mp4


    Thanks!


    You may subscribe to the issue for updates.

    improvement critical 
    opened by alexmercerind 1
  • Is it possibile to customize buffering?

    Is it possibile to customize buffering?

    Hi @alexmercerind, as the title suggests, I wanted to know if it is possible to perform a custom buffering.

    In particular I need to be able to perform a sequential fetching in different qualities from my CDN. I must therefore do a fetch to a different url (qualities) keeping the buffering already performed and passing as parameters the starting bytes and ending bytes to be buffered over.

    The desired behavior is like loading an m3u playlist made up of several "controllable" .ts files.

    I wanted to ask if this exists or it is possible to create a loading function like Media.stream

    Thanks again for your contribution!

    opened by 0Franky 6
Releases(v0.4.0)
  • v0.4.0(Nov 30, 2022)

    • Bumped ffi to 2.0.1.
    • Fixed locking of VLC::MediaList during modification.
    • Upgraded libVLC to 3.0.17.4.
    • BREAKING CHANGE: Discontinued NativeVideo implementation for Windows.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(May 25, 2022)

    • Fixed switch case directShow control (@Paradoxu).
    • Addressed few issues related to NativeVideo on Windows (@alexmercerind).
    • Fixed Bump flutter_native_view and window_manager to latest versions (@ashutosh2014, @alexmercerind).

    BREAKING CHANGE

    If you're using NativeVideo in your application, you'll need changes in your windows/runner/main.cpp file, as required by the flutter_native_view. Learn more about this here.

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(May 5, 2022)

    This new release of dart_vlc includes:

    • Addressed multiple Dart-sided memory leaks during FFI interop (@alexmercerind).
    • Introduce NativeVideo for Windows to render video playback performantly (uses flutter_native_view) (@alexmercerind).
    • Refactor native source code, move implementations to separate translation units & remove inline class methods (@alexmercerind).
    • Fix Video rendering when explicit VideoDimensions are passed (@alexmercerind).
    • Expose Player::SetHWND (@alexmercerind).
    • Added showFullscreenButton to Video widget (disabled by default) (@alexmercerind).
    Source code(tar.gz)
    Source code(zip)
  • v0.1.8(Sep 29, 2021)

    This new release of dart_vlc includes:

    • Added startTime and stopTime parameters to Media for clipping (@alexmercerind). (#126)
    • Added Player.bufferingProgress & Player.bufferingProgressStream to listen to buffering percentage of the player (@alexmercerind). (#162)
    • Video widget no longer turns black after being scrolled out of the view (@alexmercerind). (#142)
    • Now Linux uses texture registrar API for performant video playback (@alexmercerind) (πŸ’₯ REQUIRES Flutter master channel presently).
    • Now macOS uses texture registrar API for performant video playback (@jnschulze).
    • Initial work on iOS support has been started (@krjw-eyev).
    Source code(tar.gz)
    Source code(zip)
  • v0.1.7(Aug 25, 2021)

    This new release of dart_vlc includes:

    • Fixed Player.open (OnOpen event) randomly causing crash in release mode on Windows. (#124 & #136)
    • Using constant frame buffer size until #137 is resolved.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(Aug 22, 2021)

    This new release of dart_vlc includes:

    • A hotfix update to fix a critical bug.
    • Fixed a critical bug that resulted in a crash upon opening more than one Media in Playlist (apologies).
    • Implemented media and playlist equality operators. (Thanks to @jnschulze).
    • Added Player.takeSnapshot to save snapshot of a playing video.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.5(Aug 19, 2021)

    This new release of dart_vlc fixes & adds:

    • Added initial macOS support. (Thanks to @jnschulze).
    • Improved NativePort callbacks & removed unnecessary serialization.
    • Now using a common dartvlc wrapper CMake library for all platforms. (Thanks to @jnschulze).
    • Other bug-fixes related to Video playback on Windows. (Thanks to @jnschulze).
    • Setup garbage cleaning finalizers for memory allocated on heap (for C++/Dart FFI communication).
    • Removed deprecated libVLC API calls.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.4(Aug 16, 2021)

    This new release of dart_vlc adds & fixes:

    • Now Player no longer requires videoWidth & videoHeight to be passed for video playback.
    • Video widget now uses the dimensions of the currently playing video.
    • For overriding the automatic video dimensions retrieval, videoDimensions argument must be passed while instantiating Player class.
    • Video widget no longer asks for playerId argument, but player instead.
    • Added videoDimensionStream and videoDimension attributes to Player class to listen to currently playing video dimensions.
    • Migrated C++ code to use smart pointers instead of raw pointers.
    • Player.dispose no longer causing crash on Windows (#103).
    • Added Add fit and alignment properties to Video widget (Thanks to @jnschulze).
    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Aug 11, 2021)

  • v0.1.2(Aug 10, 2021)

    This new release of dart_vlc fixes & adds:

    • Now using flutter::TextureRegistrar for performant Video playback on Windows. (#54) (Thanks to @jnschulze).
    • Fixed autoStart in Player.open.
    • Fixed other crashes for Windows.
    • Improved stability.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Aug 5, 2021)

    This new release of dart_vlc fixes & adds:

    • Fixed setState being called after dispose (#75) (Finally)
    • Improved memory management.
    • Fixed ton of memory leaks.
    • Fixed Devices::all & Media::parse causing crash on Windows.

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jul 27, 2021)

    This new release of dart_vlc fixes:

    • Fixed build on Linux. (#83)
    • Changed cmake minimum required version to 3.10 for fixing use with snap installation. (#71 #81)
    • Fixed few memory leaks. (#80)
    • Fixed calling setState after dispose & other Video widget issues. (#69 #75)
    Source code(tar.gz)
    Source code(zip)
  • v0.0.9(Jul 7, 2021)

    This new release of dart_vlc fixes following issues:

    • Fixed multiple Video widgets not working after FFI migration. (No playerId was being sent along frame buffer through NativePort)
    • Now package contains complete libVLC & libVLC++ source inside.
      • No longer fetching from videoLAN & GitHub servers required.
      • No more build errors for developers in China.
    • Fixed Player::setPlaylistMode.
    • Fixed built-in play/pause button in Video widget.
    • Added back Media.asset for Flutter.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.8(Jul 5, 2021)

    This release of dart_vlc adds:

    • Now using FFI (instead of Platform channels).
    • Better performance, being direct C++ <-> Dart interop with no Flutter involvement.
    • Added Equalizer class.
    • Support for Dart CLI. See package dart_vlc_ffi.
    • Added commandlineArguments to Player constructor to pass VLC commandline arguments.
    • BREAKING CHANGES
      • Now plugin requires initialization in the main method, call DartVLC.initialize() to instantiate the plugin.
      • Now all the methods are synchronous & no longer require await. Please update your code.

    A lot of code has been refactored & complete functionality is nearly written from scratch, there can be many issues. Feel free to report.

    Thankyou.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.7(May 9, 2021)

    This new release of dart_vlc adds:

    • Added Player.setUserAgent.
    • Improved & fixed issues related to play/pause button in Video widget.
    • Fixed compilation issues on arch linux.
    • Fixes to device changing.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.6(Apr 29, 2021)

    This new release of dart_vlc adds:

    • Now Player class has sync constructor & no longer needs Player.create.
    • Fixed memory leaks on Windows & Linux.
    • Added controls to Video widget. Thanks to @tomassasovsky.
    • Added Record class for recording media. Thanks to @DomingoMG.
    • Added Chromecast class. Thanks to @DomingoMG.
    • Fixed Player.setPlaylistMode on Linux.
    • Event streams inside Player no longer can be null.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.5(Apr 24, 2021)

  • v0.0.4(Apr 2, 2021)

    This new release of dart_vlc adds:

    • Video Widget for showing video output from a Player inside Widget tree.
      • Player must be used as a controller for a Video.
      • Initialize Player with videoHeight and videoWidth optional parameters, if you wish to use it for video playback.
    • Null-safety migration.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.3(Mar 24, 2021)

    This new release of dart_vlc adds:

    • More advanced playlist modification methods like:
      • add for appending a new Media to the Playlist of the Player.
      • remove for removing a Media from the Playlist of the Player from certain index.
      • insert method for inserting Media to certain index.
      • move a Media from one index to another.
    • Ability to get all playback Devices on machine & change.
      • Devices.all gives List of all Devices.
      • Player.setDevice can be used to set a playback device for the Player instance.
    • Ability to retrieve metadata of a Media (either from Media.network or Media.file).
      • Now you can access metadata of a Media by passing parse: true for parsing the metadata.
      • Retrieved metadata is stored inside Media.metas as Map<String, String>.
    • Now event streams are splitted into four:
      • Player.currentStream
        • Contains:
          • index
          • media
          • medias
          • isPlaylist
      • Player.positionStream
        • Contains:
          • position
          • duration
      • Player.playbackStream
        • Contains:
          • isPlaying
          • isSeekable
          • isCompleted
      • Player.generalStream
        • Contains:
          • volume
          • rate
    • Thanks to @DomingoMG for thorough testing.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.2(Mar 17, 2021)

    This new release of dart_vlc adds:

    • Support for Flutter on Linux.
    • Fixed bug that caused index to not update properly in Playlist, when next or back or on completion of Media.
    • Changed default Player volume to 0.5.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.1(Mar 16, 2021)

    This first release of dart_vlc adds:

    • Media playback from file.
    • Media playback from network.
    • Media playback from assets.
    • play/pause/playOrPause/stop.
    • Multiple Player instances.
    • Playlist.
    • next/back/jump for playlists.
    • setVolume.
    • setRate.
    • seek.
    • Events.
    • Automatic fetching of headers, libs & shared libraries.
    • Changing VLC version from CMake.
    • Event streams.
      • Player.currentState
        • index: Index of current media in Playlist.
        • medias: List of all opened Medias.
        • media: Currently playing Media.
        • isPlaylist: Whether a single Media is loaded or a Playlist.
      • Player.positionState
        • position: Position of currently playing media in Duration.
        • duration: Position of currently playing media in Duration.
      • Player.playbackState
        • isPlaying.
        • isSeekable.
        • isCompleted.
      • Player.generalState
        • volume: Volume of current Player instance.
        • rate: Rate of current Player instance.
    Source code(tar.gz)
    Source code(zip)
Owner
Hitesh Kumar Saini
Flutter & React.js developer. Writes C++, Dart, JS & Python. Maintains few utility libraries. Designs beautiful UIs.
Hitesh Kumar Saini
🎡 A cross-platform media playback library for C/C++ with good number of features (only Windows & Linux).

libwinmedia A cross-platform media playback library for C/C++ & Flutter with good number of features. Example A very simple example can be as follows.

Harmonoid 38 Nov 2, 2022
A clean front-end plugin to Volumio, the Linux distribution for music playback. Volumio Touch Display Lite is written in Flutter and runs on flutter-pi.

EN | δΈ­ζ–‡ Touch Display Lite plugin for Volumio 3 Feng Zhou, 2021-12 Touch Display Lite is a clean and fast user interface for Volumio 3, the Linux dist

Feng Zhou 5 Jul 26, 2022
Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size.

desktop_window Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size. Usage import 'package:desktop_window/desktop_window.dart

ChunKoo Park 72 Dec 2, 2022
Flutter on Windows, MacOS and Linux - based on Flutter Embedding, Go and GLFW.

go-flutter - A package that brings Flutter to the desktop Purpose Flutter allows you to build beautiful native apps on iOS and Android from a single c

null 5.5k Jan 6, 2023
A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter

quick_usb A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter Usage List devices List devices with additional description Get device

Woodemi Co., Ltd 39 Oct 1, 2022
A simple-to-use flutter update package for Windows, MacOS, and Linux.

Updat - The simple-to-use, flutter-based desktop update package Updat is a simple-to-use reliable flutter-native updater that handles your application

Eduardo M. 14 Dec 21, 2022
A cross-platform app ecosystem, bringing iMessage to Android, PC (Windows, Linux, & even macOS), and Web!

BlueBubbles Android App BlueBubbles is an open-source and cross-platform ecosystem of apps aimed to bring iMessage to Android, Windows, Linux, and mor

BlueBubbles 318 Jan 8, 2023
A Flutter plugin to read πŸ”– metadata of 🎡 media files. Supports Windows, Linux & Android.

flutter_media_metadata A Flutter plugin to read metadata of media files. A part of Harmonoid open source project ?? Install Add in your pubspec.yaml.

Harmonoid 60 Dec 2, 2022
Flutter library for window blur & transparency effects for on Windows & Linux. πŸ’™

flutter_acrylic Window blur & transparency effects for Flutter on Windows & Linux Installation Mention in your pubspec.yaml. dependencies: ... flu

Hitesh Kumar Saini 437 Dec 31, 2022
A cross-platform (Windows/macOS) scanner plugin for Flutter

quick_scanner A cross-platform (Windows/macOS) scanner plugin for Flutter Usage QuickScanner.startWatch(); var _scanners = await QuickScanner.getScan

Woodemi Co., Ltd 5 Jun 10, 2022
TinyPNG4Flutter - A TinyPNG Compress Image Desktop GUI For Flutter. Support macOS and windows

TinyPNG4Flutter A TinyPNG Compress Image Desktop GUI For Flutter. Support macOS

ι€Έι£Ž 20 Dec 8, 2022
File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support.

A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.

Miguel Ruivo 987 Jan 6, 2023
A pure Dart implementation of Firebase with initial support aimed at FlutterFire for Linux & Windows.

FlutterFire Desktop A work in progress pure Dart implementation of Firebase with initial support aimed at FlutterFire for Linux & Windows. A FlutterFi

Invertase 293 Jan 4, 2023
A Dart FFI package to send πŸ’¬ toasts on Windows. Written in C++, based on WinToast.

desktoasts A Dart package to send native ?? toasts on Windows. Installation For Flutter dependencies: ... desktoasts: ^0.0.2 For Dart CLI here Sup

Hitesh Kumar Saini 37 Mar 7, 2022
A tutorial for creating an Ubuntu Linux Flutter app, using the yaru theme

Building a Yaru app with Flutter Summary URL https://github.com/ubuntu/user_manager Category Environment Linux Status Feedback Link Author Frederik Fe

Ubuntu 22 Dec 21, 2022
Flutter widgets and themes implementing the current macOS design language.

macos_ui Flutter widgets and themes implementing the current macOS design language. NOTE: This package depends on the excellent native_context_menu pl

Reuben Turner 1.1k Jan 1, 2023
Simple file explorer for desktop made with Flutter, highly inspired by macOS Finder

file_explorer A basic file explorer made with Flutter Getting Started This project is a starting point for a Flutter application. A few resources to g

Valentin 0 Nov 7, 2021
A macOS plugin which can register a callback for a global keyboard shortcut.

global_shortcuts A macOS plugin which can register a callback for a global keyboard shortcut. As the shortcut is global, the callback will be triggere

James Leahy 7 Jan 2, 2023
Embedded Linux embedding for Flutter

Embedded Linux (eLinux) embedding for Flutter This project was created to develop non-official embedded Linux embeddings of Flutter. This embedder is

Sony 918 Dec 30, 2022