Flutter
dependencies:
...
dart_vlc: ^0.1.6Dart CLI
dependencies:
...
dart_vlc_ffi: ^0.1.3More on Dart CLI implementation here.
Feel free to open a new issue or discussion, if you found a bug or need assistance.
Consider supporting the project by starring the repository or buying me a coffee.
Thanks a lot for your support.
Checkout Setup section to configure plugin on your platform.
void main() {
DartVLC.initialize();
runApp(MyApp());
}Player player = Player(id: 69420);For passing VLC CLI arguments, use commandlineArguments argument.
Player player = Player(
id: 69420,
commandlineArguments: ['--no-video']
);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'
);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'),
],
);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,
);player.play();
player.seek(Duration(seconds: 30));
player.pause();
player.playOrPause();
player.stop();player.next();
player.back();
player.jump(10);player.add(
Media.file(File('C:/music0.mp3')),
);
player.remove(4);
player.insert(
2,
Media.file(File('C:/music0.mp3')),
);
player.move(0, 4);player.setVolume(0.5);
player.setRate(1.25);List<Device> devices = Devices.all;
player.setDevice(
devices[0],
);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.
player.setUserAgent(userAgent);Media media = Media.network(
'https://www.example.com/media.mp3',
parse: true,
timeout: Duration(seconds: 10),
);
Map<String, String> metas = media.metas;(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;
});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;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();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();Everything is already set up.
To run on macOS, install CMake through Homebrew:
brew install cmakeIf you encounter the error cmake: command not found during archiving:
- Download CMake and move it to the
ApplicationsFolder. - Run:
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --installFor using this plugin on Linux, you must have VLC & libVLC installed.
On debian based distros:
sudo apt-get install vlcsudo apt-get install libvlc-devOn Fedora:
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpmsudo dnf install vlcsudo dnf install vlc-develDisable 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'
endFor 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.
You can see an example project here.
dart_vlc running on Ubuntu Linux.
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]
Done
Mediaplayback fromFile.Mediaplayback from network.Mediaplayback from assets.play/pause/playOrPause/stop.- Multiple
Playerinstances. Playlist.next/back/jumpfor playlists.setVolume.setRate.seek.- Events.
- Automatic fetching of headers, libs & shared libraries.
- Changing VLC version from CMake.
- Event streams.
Player.currentStateindex: Index of current media inPlaylist.medias: List of all openedMedias.media: Currently playingMedia.isPlaylist: Whether a singleMediais loaded or aPlaylist.
Player.positionStateposition: Position of currently playing media inDuration.duration: Position of currently playing media inDuration.
Player.playbackStateisPlaying.isSeekable.isCompleted.
Player.generalStatevolume: Volume of currentPlayerinstance.rate: Rate of currentPlayerinstance.
add/insert/remove/moveMediainsidePlaylistduring playback.- Device enumeration & changing.
- Retrieving
Metaof aMedia. - Embedding
Videoinside the Flutter window. - Supporting live streaming links.
Broadcastclass for broadcastingMedia.Recordclass for recordingMedia.Chromecastclass.Equalizersupport.- 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.
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
Mediaplayback control (Maybe).
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:
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.
Copyright (C) 2021, Hitesh Kumar Saini [email protected].
This library & work under this repository is licensed under GNU Lesser General Public License v2.1.
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.