Sistem strategi merupakan arsitektur inti dari AliPlayerKit. Sistem ini menggunakan mekanisme berbasis event untuk mengenkapsulasi logika pemantauan, analisis, dan optimasi player ke dalam komponen strategi yang independen, sehingga mendekopel logika bisnis player agar dapat digunakan kembali dan mudah diperluas.
Strategi bawaan
Sistem ini mencakup strategi-strategi berikut yang direkomendasikan out of the box:
Nama strategi | Nama kelas | Deskripsi | Callback opsional |
Statistik frame pertama |
| Menghitung waktu yang dibutuhkan dari |
|
Deteksi Stutter |
| Memantau status pemutaran dan pemuatan untuk menghitung jumlah stutter, total durasi stutter, dan laju stutter. |
|
Strategi bawaan tidak memerlukan konfigurasi dan diaktifkan secara otomatis setelah player dibuat. Untuk mengambil data dari suatu strategi, daftarkan instans baru strategi tersebut dengan callback yang diinginkan.
Penggunaan
Menggunakan strategi default
Strategi bawaan berjalan secara otomatis tanpa perlu konfigurasi apa pun:
final data = AliPlayerWidgetData(
videoSource: videoSource,
);
controller.configure(data);Mengganti strategi bawaan
Untuk mengambil data waktu proses, ganti strategi bawaan default dengan mendaftarkan instans baru yang memiliki nama yang sama menggunakan metode register(). Hal ini memungkinkan Anda menyediakan callback:
controller.strategyManager
..register(FirstFrameStrategy(
onPrepared: (cost) {
print('Time to prepare: ${cost.inMilliseconds}ms');
},
onFirstFrame: (cost) {
print('Time to first frame: ${cost.inMilliseconds}ms');
},
))
..register(StutterDetectStrategy(
onStutterDetected: (info) {
print('Stutters: ${info.stutterCount}, Stutter Rate: ${(info.stutterRate * 100).toStringAsFixed(1)}%');
},
));Mendaftarkan strategi dengan nama yang sudah ada secara otomatis menggantikan instans sebelumnya. Anda tidak perlu menghapusnya secara manual.
Mendaftarkan strategi kustom
Daftarkan instans strategi kustom dengan nama unik menggunakan register() untuk memperluas perilaku player:
controller.strategyManager.register(ResumePlayStrategy(
onPositionSaved: (position) {
print('Position saved: ${position.inSeconds}s');
},
));Untuk mempelajari cara mengembangkan strategi kustom, lihat bagian Pengembangan strategi kustom di bawah ini.
Mengelola strategi
Gunakan strategyManager untuk menghapus strategi saat waktu proses:
// Remove a strategy by name
controller.strategyManager.unregister('MyCustomStrategy');
// Remove all strategies
controller.strategyManager.clear();Pengembangan strategi kustom
Memperluas BasePlayerStrategy
Buat strategi kustom dengan memperluas BasePlayerStrategy. Framework secara otomatis mengelola siklus hidup pendengar:
class MyCustomStrategy extends BasePlayerStrategy {
@override
String get name => 'MyCustomStrategy';
@override
void onStart(AliPlayerWidgetController controller) {
// Subscribe to notifiers with listen(). The framework automatically cleans them up in onStop.
listen<int>(controller.playStateNotifier, (state) {
// Handle playback state changes
});
listen<Duration>(controller.currentPositionNotifier, (position) {
// Handle playback position changes
});
}
@override
void onReset() {
// Reset internal state when the video source changes (the strategy remains active)
}
}Metode siklus hidup
Metode | Pemicu | Tanggung jawab |
| Saat strategi dimulai. | Berlangganan sinyal status dan inisialisasi status internal. |
| Saat strategi berhenti (misalnya, ketika controller dihapus). | Melepas sumber daya. |
| Saat sumber video berubah. | Atur ulang penghitung atau stempel waktu internal. Strategi tetap aktif. |
Mekanisme keamanan callback
Strategi biasanya menggunakan callback untuk melaporkan data ke luar, misalnya untuk memberi tahu UI tentang pembaruan. Saat strategi dihentikan, UI terkait mungkin telah dihancurkan. Untuk mencegah potensi masalah, framework menyediakan dua lapis perlindungan:
Mekanisme | Ruang lingkup | Deskripsi |
| Callback berbasis Notifier | Setelah strategi berhenti, pendengar tidak lagi memicu |
| Callback aktif dalam | Secara aman memicu callback eksternal dan secara otomatis melewatkannya jika strategi telah dihentikan. |
class ResumePlayStrategy extends BasePlayerStrategy {
final void Function(Duration)? onPositionSaved;
@override
void onStop() {
super.onStop();
_savePosition();
}
void _savePosition() {
// Persistensi selalu dijalankan (untuk keamanan data)
storage.save(position);
// Secara aman picu callback eksternal dengan notify() (dilewati jika dihentikan)
notify(onPositionSaved, position);
}
}Prinsip Desain: Persistensi (untuk keamanan data) dan notifikasi (untuk pembaruan UI) adalah tanggung jawab yang terpisah. Anda dapat melakukan operasi persistensi dalam onStop(), tetapi notifikasi eksternal harus dilindungi oleh metode notify().
Sumber data dan sinyal status
Strategi pada dasarnya merupakan unit organisasi dasar dari logika bisnis. Karena melibatkan logika bisnis, strategi pasti melibatkan akuisisi dan pemrosesan data. Strategi memperoleh referensi lengkap ke controller dalam onStart dan dapat memperoleh data yang diperlukan melalui berbagai metode.
Sinyal status yang dapat diamati
Strategi berlangganan objek ValueNotifier pada controller dengan menggunakan metode listen():
Notifier | Tipe | Deskripsi |
|
| Event untuk panggilan |
|
| Sumber data telah dipersiapkan. |
|
| Frame pertama telah dirender. |
|
| Perubahan status pemutaran. |
|
| Posisi pemutaran saat ini. |
|
| Durasi total video. |
|
| Status pemuatan. |
Prinsip Desain: Strategi mengamati status player tetapi tidak mengontrol perilakunya secara langsung.
Sumber data lainnya
Strategi juga dapat memperoleh data dari API publik apa pun pada controller:
Sumber | Deskripsi | Contoh |
Pendengar ValueNotifier | Pendekatan reaktif berbasis dorong yang cocok untuk logika yang didorong oleh perubahan status. |
|
Data konfigurasi | Membaca informasi konfigurasi, seperti sumber data atau tipe skenario. |
|
Kueri aktif | Memanggil metode asinkron pada controller untuk mendapatkan data real-time. |
|
Injeksi konstruktor | Meneruskan dependensi eksternal melalui parameter konstruktor strategi. |
|
Jika data yang Anda butuhkan tidak memiliki Notifier yang sesuai, Anda dapat:
class MyCustomStrategy extends BasePlayerStrategy {
late AliPlayerWidgetController _controller;
@override
String get name => 'MyCustomStrategy';
@override
void onStart(AliPlayerWidgetController controller) {
_controller = controller;
// Metode 1: Gunakan Notifier yang sudah ada untuk memicu kueri aktif dalam callback.
listen<int>(controller.playStateNotifier, (state) {
// Saat status pemutaran berubah, lakukan kueri aktif untuk posisi pemutaran saat ini.
controller.getCurrentPosition().then((pos) {
// ...handle business logic
});
});
// Metode 2: Baca informasi konfigurasi secara langsung.
final videoSource = controller.widgetData?.videoSource;
// ...jalankan logika berbeda berdasarkan tipe sumber video.
}
}Notifier merupakan sumber data yang disarankan karena bersifat reaktif dan secara otomatis dibersihkan. Namun, strategi tidak terbatas hanya pada Notifier. API publik apa pun pada controller merupakan cara yang valid untuk mengambil data.
Cara kerja sistem strategi
Sistem strategi beroperasi melalui mekanisme berikut:
Pendaftaran otomatis:
StrategyManagermendaftarkan strategi bawaan yang direkomendasikan secara default saat dibuat.Binding siklus hidup: Strategi dimulai bersama metode
configure()controller dan dihapus bersama metodedestroy().Isolasi exception: Exception pada satu strategi tidak memengaruhi operasi strategi lainnya.
Keamanan callback: Framework menggunakan flag
isActiveuntuk memastikan callback eksternal tidak dipicu setelah strategi dihentikan.
Contoh praktis
Lihat example/lib/pages/strategy/strategy_demo_page.dart untuk contoh lengkap penggunaan sistem strategi, termasuk implementasi penuh strategi kustom untuk melanjutkan pemutaran.
Sistem strategi memungkinkan Anda mengenkapsulasi kebutuhan bisnis ke dalam strategi-strategi independen yang dapat dikombinasikan secara fleksibel untuk berbagai skenario.