media_kit 0.0.1 media_kit: ^0.0.1 copied to clipboard
A complete video & audio library for Flutter & Dart.
package:media_kit #
A complete video & audio library for Flutter & Dart.
Rapidly ship in-app messaging with Stream's highly reliable chat infrastructure & feature-rich SDKs, including Flutter!
Try the Flutter Chat tutorialInstallation #
Add in your pubspec.yaml
:
dependencies:
media_kit: ^0.0.1
# For video rendering.
media_kit_video: ^0.0.1
# For enabling support for more than 8 simultaneous players (only Flutter).
media_kit_native_event_loop: ^1.0.0
# Pick based on your requirements / platform:
media_kit_libs_windows_video: ^1.0.0 # Windows package for video (& audio) native libraries.
media_kit_libs_windows_audio: ^1.0.0 # Windows package for audio (only) native libraries.
media_kit_libs_linux: ^1.0.0 # Linux dependency package.
Platforms #
Platform | Audio | Video |
---|---|---|
Windows | Ready | Ready |
Linux | Ready | Ready |
macOS | WIP | WIP |
Android | Soon | Soon |
iOS | Soon | Soon |
Docs #
Brief Start #
Basic example.
import 'package:media_kit/media_kit.dart';
/// Create a new [Player] instance.
final player = Player();
...
/// Open some [Media] for playback.
await player.open(
Playlist(
[
Media('file:///C:/Users/Hitesh/Music/Sample.MP3'),
Media('file:///C:/Users/Hitesh/Video/Sample.MKV'),
Media('https://www.example.com/sample.mp4'),
Media('rtsp://www.example.com/live'),
],
),
);
...
/// Modify speed, pitch, volume or shuffle state.
player.rate = 1.0;
player.pitch = 1.2;
player.volume = 50.0;
player.shuffle = false;
...
/// Play / Pause
player.play();
player.pause();
player.playOrPause();
...
/// Release allocated resources back to the system.
player.dispose();
...
/// Subscribe to events.
player.streams.playlist.listen((event) {
/// Trigger UI updates etc.
print(event);
});
player.streams.playlist.listen((event) {
/// Trigger UI updates etc.
print(event);
});
player.streams.position.listen((event) {
/// Trigger UI updates etc.
print(event);
});
player.streams.duration.listen((event) {
/// Trigger UI updates etc.
print(event);
});
player.streams.audioBitrate.listen((event) {
/// Trigger UI updates etc.
if (event != null) {
print('${event ~/ 1000} KB/s');
}
});
Rendering Video #
Performant & H/W accelerated, automatically fallbacks to S/W rendering if system does not support it.
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
class MyScreen extends StatefulWidget {
const MyScreen({Key? key}) : super(key: key);
@override
State<MyScreen> createState() => _MyScreenState();
}
class MyScreenState extends State<MyScreen> {
// Create a [Player] instance from `package:media_kit`.
final Player player = Player();
// Reference to the [VideoController] instance from `package:media_kit_video`.
VideoController? controller;
@override
void initState() {
super.initState();
Future.microtask(() async {
// Create a [VideoController] instance from `package:media_kit_video`.
// Pass the [handle] of the [Player] from `package:media_kit` to the [VideoController] constructor.
controller = await VideoController.create(player.handle);
// Must be created before opening any media. Otherwise, a separate window will be created.
setState(() {});
});
}
@override
void dispose() {
Future.microtask(() async {
// Release allocated resources back to the system.
await controller?.dispose();
await player.dispose();
});
super.dispose();
}
@override
Widget build(BuildContext context) {
return Video(
/// Pass the [controller] to display the video output.
controller: controller,
);
}
}
Performance #
Although package:media_kit is already fairly performant, you can further optimize things as follows:
Note
- You can limit size of the video output by specifying
width
&height
. - By default, both
height
&width
arenull
i.e. output is based on video's resolution.
final controller = await VideoController.create(
player.handle,
width: 640, // default: null
height: 360, // default: null
);
Note
- You can switch between GPU & CPU rendering by specifying
enableHardwareAcceleration
. - By default,
enableHardwareAcceleration
istrue
i.e. GPU (Direct3D/OpenGL/METAL) is utilized.
final controller = await VideoController.create(
player.handle,
enableHardwareAcceleration: false, // default: true
);
Note
- You can disable event callbacks for a
Player
& save yourself few CPU cycles. - By default,
events
istrue
i.e. event streams & states are updated.
final player = Player(
configuration: PlayerConfiguration(
events: false, // default: true
),
);
Detailed Guide #
TODO: documentation
Try out the test application for now.
Setup #
Windows #
Everything ready. Just add one of the following packages to your pubspec.yaml
.
dependencies:
...
media_kit_libs_windows_video: ^1.0.0 # Windows package for video (& audio) native libraries.
media_kit_libs_windows_audio: ^1.0.0 # Windows package for audio (only) native libraries.
Linux #
System shared libraries from distribution specific user-installed packages are used by-default. You can install these as follows.
Ubuntu / Debian
sudo apt install libmpv-dev mpv
Packaging
There are other ways to bundle these within your app package e.g. within Snap or Flatpak. Few examples:
Goals #
The primary goal of package:media_kit is to become a strong, stable, feature-proof & modular media playback library for Flutter. The idea is to support both audio & video playback.
package:media_kit makes rendering hardware accelerated video playback possible in Flutter.
Since, targetting multiple features at once & bundling redundant native libraries can result in increased bundle size of the application, you can manually select the native libraries you want to bundle, depending upon your use-case. The code is architectured to support multiple platforms & features. Support for more platforms will be added in future.
Fund Development #
If you find package:media_kit package(s) useful, please consider sponsoring me.
Since this is first of a kind project, it takes a lot of time to experiment & develop. It's a very tedious process to write code, document, maintain & provide support for free. Your support can ensure the quality of the package your project depends upon. I will feel rewarded for my hard-work & research.
Thanks!
License #
Copyright © 2021 & onwards, Hitesh Kumar Saini <saini123hitesh@gmail.com>
This project & the work under this repository is governed by MIT license that can be found in the LICENSE file.