dependencies:
...
dart_vlc: ^0.0.4
- Create a new
Player
instance.
Player player = await Player.create(id: 69420);
- Create a single
Media
.
Media media0 = await Media.file(
new File('C:/music.mp3')
);
Media media1 = await Media.network(
'https://www.example.com/music.aac'
);
Media media2 = await Media.asset(
'assets/music.ogg'
);
- Create a list of
Media
s usingPlaylist
.
Playlist playlist = new Playlist(
medias: [
await Media.file(new File('C:/music.mp3')),
await Media.asset('assets/music.ogg'),
await Media.network('https://www.example.com/music.aac'),
],
);
- Open
Media
orPlaylist
into aPlayer
instance.
player.open(
new Playlist(
medias: [
await Media.file(new File('C:/music0.mp3')),
await Media.file(new File('C:/music1.mp3')),
await Media.file(new File('C:/music2.mp3')),
],
),
autoStart: true, // default
);
- Control playback.
player.play();
player.seek(Duration(seconds: 30));
player.pause();
player.playOrPause();
player.stop();
- Manipulate
Playlist
.
player.add(
await Media.file(new File('C:/music0.mp3')),
);
player.remove(4);
player.insert(
2,
await Media.file(new 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 = await Devices.all;
player.setDevice(
devices[0],
);
- Show the
Video
inside window.
Instanciate Player
as follows.
Player player = await Player.create(
id: 69420,
videoWidth: 480,
videoHeight: 320,
);
Show Video
in the Widget
tree.
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Video(
playerId: 69420,
height: 1920.0,
width: 1080.0,
scale: 1.0 // default
showControls: false // default
),
);
}
}
- Retrieve metadata of
Media
.
Media media = await Media.network(
'https://www.example.com/media.mp3',
parse: true,
timeout: new 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).
player.currentStream?.listen((CurrentState state) {
state.index;
state.media;
state.medias;
state.isPlaylist;
});
player.positionStream?.listen((PositionState state) {
state.position;
state.duration;
});
player.playbackStream?.listen((PlaybackState state) {
state.isPlaying;
state.isSeekable;
state.isCompleted;
});
player.generalStream?.listen((GeneralState state) {
state.volume;
state.rate;
});
NOTE: For using this plugin on Linux, you must have VLC & libVLC installed. On debian based distros, run:
sudo apt-get install vlc
sudo apt-get install libvlc-dev
Consider supporting the project by either/and:
- Starring the repository, to get this hardwork noticed.
- Buying me a coffee.
Thanks to following people for supporting this project. I'm REALLY GLAD to recieve your appreciation for the time I've spent:
- Pavel Zika
- Salman Aljabri
- @domingomg97
You can see an example project here.
Windows
The internal wrapper used in the plugin is here in the repository (Based on libVLC++). It makes handling of events and controls a lot easier & has additional features to it.
Same wrapper will be used for upcoming FFI version.
I preferred to do majority of plugin handling in C++ itself, thus Dart code is minimal & very slight mapping to it.
Done
Media
playback fromFile
.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 inPlaylist
.medias
: List of all openedMedia
s.media
: Currently playingMedia
.isPlaylist
: Whether a singleMedia
is loaded or aPlaylist
.
Player.positionState
position
: Position of currently playing media inDuration
.duration
: Position of currently playing media inDuration
.
Player.playbackState
isPlaying
.isSeekable
.isCompleted
.
Player.generalState
volume
: Volume of currentPlayer
instance.rate
: Rate of currentPlayer
instance.
add
/insert
/remove
/move
Media
insidePlaylist
during playback.- Device enumeration & changing.
- Retrieving
Meta
of aMedia
. - Embedding video inside the Flutter window.
Under progress or planned features (irrespective of order)...
- Supporting live streaming links.
- FFI version of the library for plain Dart applications.
- Writing metadata tags.
- Making things more efficient.
- Supporting native volume control/lock screen notifications (Maybe).
- Bringing project on other platforms like Android/iOS (Maybe).
- Adding headers for MRLs (Maybe).
- D-Bus MPRIS controls for
Media
playback control (Maybe).
First of all, thanks to the VideoLAN team for creating libVLC & libVLC++. Really great guys really great at their work.
Thanks to following members of libVLC community to give me bit of look & advice about how things work:
The code in the project is nicely arranged (I guess), I have added comments wherever I felt necessary.
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.
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 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 Desktop app.
The API style of this project is highly influenced by assets_audio_player due to its ease of use. This project will serve as a base to add Windows & Linux support to already existing audio playback libraries like just_audio and assets_audio_player.
Although, the mentioned repositories above are for audio playback, video playback is also a part of consideration for this project.