All Products
Search
Document Center

ApsaraVideo VOD:Sistem strategi

Last Updated:Sep 10, 2026

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

FirstFrameStrategy

Menghitung waktu yang dibutuhkan dari prepare ke prepared dan dari prepare ke rendered.

onPrepared, onFirstFrame

Deteksi Stutter

StutterDetectStrategy

Memantau status pemutaran dan pemuatan untuk menghitung jumlah stutter, total durasi stutter, dan laju stutter.

onStutterDetected

Catatan

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)}%');
    },
  ));
Catatan

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');
  },
));
Catatan

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

onStart

Saat strategi dimulai.

Berlangganan sinyal status dan inisialisasi status internal.

onStop

Saat strategi berhenti (misalnya, ketika controller dihapus).

Melepas sumber daya. BasePlayerStrategy secara otomatis membersihkan pendengar.

onReset

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

listen() built-in guard

Callback berbasis Notifier

Setelah strategi berhenti, pendengar tidak lagi memicu onChanged.

notify() convenience method

Callback aktif dalam onStop()

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);
  }
}
Catatan

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

prepareNotifier

int

Event untuk panggilan prepare().

isPreparedNotifier

bool

Sumber data telah dipersiapkan.

isRenderedNotifier

bool

Frame pertama telah dirender.

playStateNotifier

int

Perubahan status pemutaran.

currentPositionNotifier

Duration

Posisi pemutaran saat ini.

totalDurationNotifier

Duration

Durasi total video.

isLoadingStateNotifier

bool

Status pemuatan.

Catatan

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.

listen(controller.playStateNotifier, ...)

Data konfigurasi

Membaca informasi konfigurasi, seperti sumber data atau tipe skenario.

controller.widgetData?.videoSource

Kueri aktif

Memanggil metode asinkron pada controller untuk mendapatkan data real-time.

await controller.getCurrentPosition()

Injeksi konstruktor

Meneruskan dependensi eksternal melalui parameter konstruktor strategi.

MyStrategy(apiClient: dio)

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.
  }
}
Catatan

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:

  1. Pendaftaran otomatis: StrategyManager mendaftarkan strategi bawaan yang direkomendasikan secara default saat dibuat.

  2. Binding siklus hidup: Strategi dimulai bersama metode configure() controller dan dihapus bersama metode destroy().

  3. Isolasi exception: Exception pada satu strategi tidak memengaruhi operasi strategi lainnya.

  4. Keamanan callback: Framework menggunakan flag isActive untuk 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.