全部产品
Search
文档中心

ApsaraVideo VOD:Fitur lanjutan

更新时间:Dec 17, 2025

Topik ini menyediakan contoh penggunaan fitur lanjutan ApsaraVideo Player SDK untuk Android. Untuk informasi selengkapnya mengenai fitur yang didukung dan cara penggunaannya, lihat Referensi API.

Penting

Untuk menjalankan demo, unduh dan ikuti petunjuk di Jalankan Demo untuk mengompilasi dan menjalankannya.

Verifikasi Kompetensi Profesional

Catatan

Beberapa fitur ApsaraVideo Player memerlukan lisensi Edisi Profesional. Untuk menggunakan fitur tersebut, Anda harus mendapatkan lisensi. Untuk informasi selengkapnya, lihat Fitur ApsaraVideo Player SDK dan Dapatkan lisensi untuk ApsaraVideo Player SDK.

Anda dapat mengatur listener saat aplikasi dimulai atau sebelum memanggil operasi API player apa pun.

import com.aliyun.private_service.PrivateService;


PrivateService.setOnPremiumLicenseVerifyCallback(new PrivateService.OnPremiumLicenseVerifyCallback() {
    @Override
    public void onPremiumLicenseVerifyCallback(PrivateService.PremiumBizType type, boolean isValid, String errorMsg) {
        Log.d(TAG, "onPremiumLicenseVerifyCallback: " + type + " isValid: " + isValid + " errorMsg: " + errorMsg);
    }
});

PremiumBizType adalah enumerasi fitur Edisi Profesional. Saat Anda menggunakan fitur terkait, player memverifikasi lisensi dan mengembalikan hasil melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan kegagalan.

Pemutaran

Putar balik daftar

ApsaraVideo Player SDK untuk Android menyediakan fitur list playback komprehensif yang ideal untuk feed video pendek. Saat dikombinasikan dengan fitur seperti preloading, fitur ini secara signifikan meningkatkan kecepatan startup video pendek.

Prosedur

  1. Buat player.

    Buat instans AliListPlayer menggunakan kelas AliPlayerFactory. Kode berikut merupakan contohnya:

    AliListPlayer aliListPlayer;
    .....
    aliListPlayer = AliPlayerFactory.createAliListPlayer(getApplicationContext());
    // traceId adalah pengenal unik untuk perangkat atau pengguna, seperti IMEI atau IDFA.
    aliListPlayer.setTraceId("traceId");

  2. Opsional: Atur listener.

    Mengatur listener bersifat opsional saat membuat list player. Namun, tanpa listener, Anda tidak dapat menerima notifikasi event dari player, seperti kegagalan pemutaran atau progres pemutaran. Kami menyarankan Anda mengatur listener, terutama yang penting seperti OnPreparedListener, OnErrorListener, OnCompletionListener, OnLoadingStatusListener, dan OnInfoListener.

    Klik untuk melihat kode

    aliListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            // Event penyelesaian pemutaran.
        }
    });
    aliListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // Event kesalahan.
        }
    });
    aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Event keberhasilan persiapan.
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // Callback untuk perubahan resolusi video.
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // Event rendering frame pertama.
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // Event informasi lainnya. Jenisnya bisa berupa awal putar ulang berulang, posisi buffer, posisi pemutaran saat ini, atau awal putar otomatis.
        }
    });
    aliListPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            // Buffering dimulai.
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            // Progres buffering.
        }
        @Override
        public void onLoadingEnd() {
            // Buffering berakhir.
        }
    });
    aliListPlayer.setOnSeekCompleteListener(new IPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete() {
            // Pencarian selesai.
        }
    });
    aliListPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            // Tampilkan subtitle.
        }
        @Override
        public void onSubtitleHide(long id) {
            // Sembunyikan subtitle.
        }
    });
    aliListPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            // Aliran audio atau video atau definisi beralih.
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // Gagal beralih aliran audio atau video atau definisi.
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // Event perubahan status player.
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // Event snapshot.
        }
    });
  3. Atur jumlah item yang akan dipre-load.

    Anda dapat mengatur jumlah item yang akan dipre-load untuk meningkatkan kecepatan startup. Kode berikut merupakan contohnya:

    // Atur jumlah item yang akan dipre-load. Total jumlah item yang dimuat adalah 1 + count × 2.
    aliListPlayer.setPreloadCount(int count);
  4. Tambahkan atau hapus beberapa sumber pemutaran.

    List playback mendukung dua jenis sumber pemutaran: Vid (termasuk VidSts dan VidPlayAuth) dan UrlSource. Kode berikut merupakan contohnya:

    • Url: URL pemutaran dapat berupa URL VOD pihak ketiga atau URL pemutaran di ApsaraVideo VOD. Anda dapat memanggil operasi GetPlayInfo untuk mendapatkan URL pemutaran video di ApsaraVideo VOD. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mendapatkan URL pemutaran video. Metode ini menghilangkan kebutuhan untuk menandatangani URL. Untuk informasi selengkapnya tentang cara memanggil API untuk mendapatkan URL pemutaran video, lihat Developer Portal.

    • Vid: ID audio atau video. Anda dapat memperoleh ID tersebut di konsol ApsaraVideo VOD dengan memilih Media > Audio/Video atau dengan memanggil operasi API sisi server seperti SearchMedia setelah audio atau video diunggah.

    // Tambahkan sumber pemutaran Vid.
    aliListPlayer.addVid(String videoId, String uid);
    // Tambahkan sumber pemutaran UrlSource.
    aliListPlayer.addUrl(String url, String uid);
    // Hapus sumber.
    aliListPlayer.removeSource(String uid);
    Catatan

    uid adalah pengenal unik untuk video. Jika terjadi crosstalk aliran selama pemutaran, periksa apakah uid yang sama digunakan untuk video yang berbeda. uid dapat berupa string apa pun.

  5. Atur tampilan.

    Player mendukung SurfaceView dan TextureView. Anda dapat memilih salah satunya.

    • Atur SurfaceView. Kode berikut merupakan contohnya:

      Klik untuk melihat kode

      SurfaceView surfaceView = findViewById(R.id.surface_view);
      surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(SurfaceHolder holder) {
              aliListPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
              aliListPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
              aliListPlayer.setSurface(null);
          }
      });
    • Atur TextureView. Kode berikut merupakan contohnya:

      Klik untuk melihat kode

      TextureView textureView = findViewById(R.id.texture_view);
      textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
          @Override
          public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
              aliListPlayer.setSurface(new Surface(surface));
          }
      
          @Override
          public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
              aliListPlayer.surfaceChanged();
          }
      
          @Override
          public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
              aliListPlayer.setSurface(null);
              return false;
          }
      
          @Override
          public void onSurfaceTextureUpdated(SurfaceTexture surface) {
      
          }
      });
  6. Putar sumber video.

    Setelah menambahkan satu atau beberapa sumber pemutaran dan mengaktifkan autoplay, Anda dapat memanggil moveTo untuk memutar sumber video. Kode berikut merupakan contohnya:

    Klik untuk melihat kode

    // Aktifkan autoplay.
    aliListPlayer.setAutoPlay(true);
    
    // Gunakan operasi API ini untuk URL.
    aliPlayer.moveTo(String uid);
    // Gunakan operasi API ini untuk VID. Anda harus melewatkan stsInfo, yaitu token STS sementara dan pasangan AccessKey. Anda perlu mendapatkannya terlebih dahulu. Untuk informasi selengkapnya, lihat Buat peran RAM dan berikan izin akses sementara menggunakan STS.
    aliPlayer.moveTo(String uid, StsInfo info);
  7. Putar video sebelumnya atau berikutnya.

    • Setelah memanggil moveTo untuk memutar sumber video, panggil operasi API moveToPrev dan moveToNext untuk memutar video sebelumnya dan berikutnya, menggunakan sumber video dari pemanggilan moveTo sebagai referensi. Kode berikut memberikan contohnya:

      Catatan

      Saat menggunakan view yang sama, memanggil moveto atau moveToNext untuk beralih sumber video dapat menyebabkan layar berkedip atau menjadi hitam. Dalam kasus ini, kami menyarankan Anda mengatur bidang mClearFrameWhenStop dari PlayerConfig ke false saat menginisialisasi listPlayer dan memanggil setConfig untuk menerapkan pengaturan tersebut.

      Klik untuk melihat kode

      // Aktifkan autoplay.
      aliListPlayer.setAutoPlay(true);
      
      // Pindah ke video berikutnya. Catatan: Metode ini hanya untuk sumber URL. Tidak berlaku untuk pemutaran VID.
      aliListPlayer.moveToNext();
      // Pindah ke video sebelumnya. Catatan: Metode ini hanya untuk sumber URL. Tidak berlaku untuk pemutaran VID.
      aliListPlayer.moveToPrev();
      // Pindah ke video berikutnya. Catatan: Metode ini hanya untuk pemutaran VID.
      aliListPlayer.moveToNext(StsInfo info);
      // Pindah ke video sebelumnya. Catatan: Metode ini hanya untuk pemutaran VID.
      aliListPlayer.moveToPrev(StsInfo info);
Catatan

Untuk pengalaman list playback yang lebih baik, kami menyarankan Anda menggunakan solusi mini-series kami. Untuk informasi selengkapnya, lihat Pengembangan sisi klien untuk mini-series.

Mainkan video dengan transparansi

Deskripsi fitur

ApsaraVideo Player SDK mendukung rendering saluran alpha untuk mencapai efek dinamis pada animasi hadiah transparan. Dalam skenario seperti saluran langsung, memutar animasi hadiah transparan tanpa menghalangi konten langsung secara signifikan meningkatkan pengalaman menonton dan interaksi pengguna.

Batasan

Fitur rendering transparan tersedia di All-in-One SDK V6.8.0 dan versi lebih baru atau ApsaraVideo Player SDK V6.9.0 dan versi lebih baru.

Keunggulan

Menggunakan video MP4 dengan informasi transparansi untuk efek hadiah memberikan kualitas animasi yang lebih baik, ukuran file yang lebih kecil, kompatibilitas yang lebih tinggi, dan efisiensi pengembangan yang lebih besar. Hal ini memungkinkan efek hadiah ditampilkan lebih baik kepada pengguna, sehingga meningkatkan pengalaman pengguna.

  1. Kualitas animasi yang lebih baik: Video MP4 dapat mempertahankan kualitas animasi asli, termasuk detail dan warna. Dibandingkan dengan format lain seperti APNG atau IXD, MP4 dapat lebih akurat mengembalikan efek animasi yang dibuat oleh desainer.

  2. Ukuran file yang lebih kecil: File video MP4 dapat dikompresi lebih efektif daripada format lain seperti APNG atau IXD. Hal ini meningkatkan kecepatan pemuatan dan mengurangi konsumsi lebar pita jaringan.

  3. Kompatibilitas yang lebih tinggi: MP4 adalah format video universal yang didukung secara luas di berbagai perangkat dan browser. Hal ini memastikan bahwa efek hadiah dapat diputar dan dilihat di perangkat utama.

  4. Efisiensi pengembangan yang lebih tinggi: Solusi teknis untuk menggunakan video MP4 sebagai efek hadiah relatif sederhana. Developer tidak perlu meneliti dan mengimplementasikan logika parsing dan rendering yang kompleks. Hal ini memungkinkan developer fokus pada fitur lain dan meningkatkan efisiensi pengembangan.

Contoh kode

Operasi API berikut ditambahkan untuk mengatur mode alpha (posisi saluran alpha dalam materi video: atas, bawah, kiri, atau kanan). Nilai default adalah None.

Catatan
  • Posisi saluran alpha dalam sumber video harus konsisten dengan parameter yang diatur untuk setAlphaRenderMode.

  • Ukuran tampilan player harus proporsional dengan resolusi sumber video.

/**
 * Mengatur mode rendering alpha.
 *
 * @param alphaRenderMode Mode rendering alpha yang ditentukan. Lihat {@link AlphaRenderMode}.
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------Penggunaan View-------------
// View perlu diatur menjadi transparan.
//TextureView
TextureView aliplayerView; // View untuk pemutaran.
aliplayerView.setOpaque(false);

//SurfaceView
SurfaceView aliplayerView; // View untuk pemutaran.
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); // Tempatkan SurfaceView di bagian atas jendela tampilan.

//-----------Penggunaan AliPlayer-----------
// Atur mode alpha.
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// Atur materi yang sesuai dengan mode alpha.
UrlSource urlSource = new UrlSource();
urlSource.setUri("https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/business_requirements_sample/alpha_channel/alpha_right.mp4");
aliPlayer.setDataSource(urlSource);
aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
    @Override
    public void onCompletion() {
        // Opsional: Jika ada masalah koneksi setelah pemutaran instans tunggal selesai, Anda dapat membersihkan layar.
        aliPlayer.clearScreen();
    }
}
aliPlayer.setAutoPlay(true);
aliPlayer.prepare();

Subtitle eksternal

Catatan

Untuk contoh kode lengkap, lihat modul ExternalSubtitle di API-Example. Proyek ini adalah proyek contoh berbasis Java untuk ApsaraVideo Player SDK untuk Android guna membantu Anda mengintegrasikan fitur inti SDK dengan cepat.

ApsaraVideo Player SDK untuk Android mendukung penambahan dan pengalihan subtitle eksternal. SDK mendukung format subtitle SRT, SSA, ASS, dan VTT.

Kode berikut merupakan contohnya:

  1. Buat view untuk menampilkan subtitle.

    Anda dapat membuat view berbeda untuk format subtitle yang berbeda.

    Klik untuk melihat kode

    // Digunakan untuk menampilkan subtitle SRT dan VTT.
    SubtitleView subtitleView = new SubtitleView(getContext());
    // Untuk player V7.6.0 dan versi lebih baru, kami menyarankan menggunakan VttSubtitleView untuk menampilkan subtitle SRT dan VTT.
    VttSubtitleView vttSubtitleView = new VttSubtitleView(getContext());
    // Digunakan untuk menampilkan subtitle ASS dan SSA.
    AssSubtitleView assSubtitleView = new AssSubtitleView(getContext());
    // Tambahkan view subtitle ke layout view.
    viewGroup.addView(assSubtitleView);

    Saat Anda mengintegrasikan player V7.6.0 atau versi lebih baru dan menggunakan VttSubtitleView untuk menampilkan subtitle SRT dan VTT, Anda harus mengatur listener berikut:

    // Wajib untuk player V7.6.0 dan versi lebih baru.
    mAliPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            int viewWidth = getWidth();
            int viewHeight = getHeight();
            IPlayer.ScaleMode mode = mVideoListPlayer.getScaleMode();
            SubTitleBase.VideoDimensions videoDimensions = SubTitleBase.getVideoDimensionsWhenRenderChanged(width, height, viewWidth, viewHeight, mode);
            vttSubtitleView.setVideoRenderSize(videoDimensions.videoDisplayWidth, videoDimensions.videoDisplayHeight);
        }
    });
  2. Tambahkan subtitle.

    Penting

    File subtitle harus diatur di onPrepared.

    mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Atur subtitle (harus diatur di onPrepared).
            mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL);
        }
    });
  3. Atur listener terkait subtitle.

    Klik untuk melihat kode

    mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
                @Override
                public void onSubtitleExtAdded(int trackIndex, String url) {
                    // trackIndex: Indeks subtitle. true: Tampilkan subtitle yang ditentukan. false: Sembunyikan subtitle yang ditentukan.
                    mAliPlayer.selectExtSubtitle(trackIndex, true);
                }
    
                @Override
                public void onSubtitleShow(int trackIndex, long id, String data) {
                    // Subtitle
                    SubtitleView.Subtitle subtitle = new SubtitleView.Subtitle();
                    subtitle.id = String.valueOf(id);
                    subtitle.content = data;
                    // Tampilkan subtitle.
                    mSubtitleView.show(subtitle);
                }
    
                @Override
                public void onSubtitleHide(int trackIndex, long id) {
                    // Hapus subtitle.
                    mSubtitleView.dismiss(String.valueOf(id));
                }
    
                @Override
                public void onSubtitleHeader(int trackIndex, String header) {
                }
            }
        );

Pemutaran hanya audio

Anda dapat menonaktifkan pemutaran video untuk memutar hanya audio. Anda harus mengonfigurasi PlayerConfig sebelum mempersiapkan player.

PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true;  // Aktifkan pemutaran hanya audio.
aliPlayer.setConfig(config);

Beralih antara decoding software dan hardware

Catatan

Metode decoding harus dialihkan sebelum pemutaran dimulai. Mengalihkan metode decoding selama pemutaran tidak berlaku.

ApsaraVideo Player SDK untuk Android menyediakan kemampuan decoding hardware untuk H.264 dan H.265. SDK juga menyediakan sakelar enableHardwareDecoder. Sakelar ini diaktifkan secara default. Jika inisialisasi decoding hardware gagal, player secara otomatis beralih ke decoding software untuk memastikan pemutaran video normal. Kode berikut merupakan contohnya:

// Aktifkan decoding hardware. Ini diaktifkan secara default.
aliPlayer.enableHardwareDecoder(true);

Jika player secara otomatis beralih dari decoding hardware ke software, callback dipicu melalui onInfo. Kode berikut merupakan contohnya:

mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
            // Beralih ke decoding software.
        }
    }
});

Pemutaran adaptif H.265

Jika model perangkat saat ini berada dalam blacklist H.265 berbasis cloud atau jika decoding hardware aliran H.265 gagal, fallback adaptif terjadi. Proses fallback adalah sebagai berikut: Jika aliran cadangan H.264 diatur, aliran cadangan tersebut diputar secara otomatis. Jika tidak ada aliran cadangan H.264 yang diatur, player secara otomatis fallback ke decoding software H.265.

Catatan
  • Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah untuk decoding adaptif yang dikombinasikan dengan kemampuan cloud dan klien. Anda harus mengirimkan tiket untuk mengajukan lisensi.

  • Layanan bernilai tambah untuk decoding adaptif yang dikombinasikan dengan kemampuan cloud dan klien terutama mencakup: 1. Pengiriman dinamis data kompatibilitas decoding hardware berbasis cloud. 2. Fallback adaptif dari aliran H.265 ke aliran H.264.

  • SDK masih dapat secara otomatis beralih ke decoding software saat decoding hardware gagal, bahkan jika layanan bernilai tambah tidak diaktifkan.

Kode berikut menunjukkan cara mengatur aliran cadangan:

// Lapisan aplikasi memelihara Map yang menyimpan semua pasangan kunci-nilai URL asli-URL cadangan. Saat beralih, URL cadangan ditanyakan di Map berdasarkan URL asli.
 AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
    @Override
    public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
        String kurl = original_url;
        if (!H265toH264Map.get(kurl).isEmpty()) {
            return H265toH264Map.get(kurl);
        } else {
            return "";
        }
    }
});

Secara adaptif beralih definisi video berdasarkan kondisi jaringan

Catatan
  • Aliran video HLS multi-bitrate adaptif dapat dihasilkan menggunakan kelompok template transkoding pengemasan video di ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Konfigurasikan adaptive bitrate streaming untuk VOD.

  • Untuk aliran adaptif yang dihasilkan oleh transkoding di ApsaraVideo VOD, jika Anda menggunakan Vid untuk pemutaran, Anda harus mengatur daftar definisi pemutaran default ke DEFINITION_AUTO untuk mendapatkan dan memutar aliran video adaptif. Jika tidak, player memilih aliran video definisi rendah untuk pemutaran berdasarkan logika default. Untuk urutan pemutaran definisi default, lihat Jika video ditranskode menjadi beberapa definisi, definisi mana yang akan diputar oleh SDK player secara default?. Kode berikut menunjukkan cara menentukan daftar definisi untuk pemutaran VidAuth:

    VidAuth vidAuth = new VidAuth();
    List<Definition> list = new ArrayList<>();
    list.add(Definition.DEFINITION_AUTO);
    vidAuth.setDefinition(list);

ApsaraVideo Player SDK untuk Android mendukung adaptive bitrate streaming untuk aliran video HLS dan DASH. Setelah prepare berhasil, Anda dapat memanggil getMediaInfo untuk mendapatkan informasi tentang setiap aliran bitrate dalam objek TrackInfo. Kode berikut merupakan contohnya:

List<TrackInfo> trackInfos  = aliPlayer.getMediaInfo().getTrackInfos();

Selama pemutaran, Anda dapat memanggil metode selectTrack player untuk beralih aliran bitrate pemutaran. Atur nilainya ke AUTO_SELECT_INDEX untuk mengaktifkan adaptive bitrate streaming. Kode berikut merupakan contohnya:

int index = trackInfo.getIndex();
// Beralih bitrate.
aliPlayer.selectTrack(index);
// Beralih bitrate dan beradaptasi.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

Hasil peralihan dikembalikan dalam callback setelah Anda mengatur OnTrackChangedListener (sebelum memanggil selectTrack). Kode berikut merupakan contohnya:

aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
    @Override
    public void onChangedSuccess(TrackInfo trackInfo) {
        // Berhasil beralih.
    }
    @Override
    public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
        // Gagal beralih. Dapatkan alasan kegagalan dari errorInfo.getMsg().
    }
});

Opsional: Sebelum memanggil metode selectTrack player untuk beralih aliran pemutaran ke adaptive bitrate streaming, Anda dapat mengatur definisi maksimum untuk peralihan ABR (adaptive bitrate) dalam konfigurasi. Hal ini mencegah peralihan otomatis ke bitrate yang tidak diharapkan. Kode berikut merupakan contohnya: Agar pengaturan berlaku, kami menyarankan Anda memanggil kode ini sebelum player memanggil metode prepare atau list player memanggil metode moveTo.

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // Atur batas atas jumlah piksel untuk definisi ABR menjadi 921600 (lebar × tinggi = 1280 × 720), sehingga jumlah piksel definisi yang dapat dialihkan oleh ABR kurang dari atau sama dengan nilai ini.
aliPlayer.setConfig(config);

Ambil snapshot

ApsaraVideo Player SDK untuk Android menyediakan fitur snapshot untuk mengambil snapshot video saat ini. Fitur ini diimplementasikan oleh operasi API snapshot. Fitur ini menangkap data mentah dan mengembalikannya sebagai bitmap. Antarmuka callback adalah OnSnapShotListener. Kode berikut merupakan contohnya:

// Atur callback snapshot.
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // Bitmap yang diperoleh dan lebar serta tinggi gambar.
    }
});
// Ambil snapshot frame pemutaran saat ini.
aliPlayer.snapshot();

Pratinjau

ApsaraVideo Player SDK untuk Android, bersama dengan konfigurasi ApsaraVideo VOD, mengimplementasikan fitur pratinjau. Fitur ini mendukung metode pemutaran VidSts dan VidAuth (direkomendasikan untuk ApsaraVideo VOD). Untuk informasi selengkapnya tentang cara mengonfigurasi dan menggunakan fitur pratinjau, lihat Pratinjau video.

Setelah mengonfigurasi fitur pratinjau, Anda dapat menggunakan metode VidPlayerConfigGen.setPreviewTime() untuk mengatur durasi pratinjau untuk player. Kode berikut menunjukkan contoh untuk pemutaran VidSts:

VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20); // Pratinjau 20 detik
vidSts.setPlayConfig(configGen); // Atur untuk sumber pemutaran
...

Saat durasi pratinjau diatur, server tidak mengembalikan konten video lengkap saat memutar video melalui ApsaraVideo Player SDK untuk Android. Sebaliknya, server hanya mengembalikan konten untuk durasi pratinjau yang ditentukan.

Catatan
  • VidPlayerConfigGen mendukung pengaturan parameter permintaan yang didukung oleh server. Untuk informasi selengkapnya, lihat Parameter permintaan.

  • Fitur pratinjau saat ini tidak didukung untuk video format FLV dan MP3.

Atur blacklist

ApsaraVideo Player SDK untuk Android menyediakan mekanisme blacklist decoding hardware. Untuk perangkat yang tidak dapat menggunakan decoding hardware untuk pemutaran, Anda dapat langsung menggunakan decoding software untuk mencegah kesalahan. Kode berikut merupakan contohnya:

DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
Catatan

Blacklist secara otomatis dihapus setelah Anda keluar dari aplikasi.

Atur Referer

ApsaraVideo Player SDK untuk Android mendukung pengaturan Referer. Bersama dengan pengaturan Referer blacklist dan whitelist di konsol, hal ini memungkinkan Anda mengontrol izin akses. Anda dapat menggunakan metode PlayerConfig untuk mengatur Referer permintaan. Kode berikut menunjukkan contoh pengaturan SDK player:

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Atur Referer. Contoh: http://example.aliyundoc.com. (Catatan: Saat mengatur Referer, Anda perlu menyertakan bagian protokol di awal.)
config.mReferrer = referrer;
....// Pengaturan lainnya
  // Atur konfigurasi untuk player.
aliPlayer.setConfig(config);

Atur User-Agent

ApsaraVideo Player SDK untuk Android memungkinkan Anda menggunakan PlayerConfig untuk mengatur User-Agent (UA) permintaan. Setelah diatur, player menyertakan informasi UA dalam permintaannya. Kode berikut merupakan contohnya:

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Atur UA.
config.mUserAgent = "User-Agent yang akan diatur";
....// Pengaturan lainnya
  // Atur konfigurasi untuk player.
aliPlayer.setConfig(config);

Konfigurasikan waktu dan jumlah percobaan ulang jaringan

Anda dapat menggunakan kelas PlayerConfig untuk mengatur timeout jaringan dan jumlah percobaan ulang untuk ApsaraVideo Player SDK untuk Android. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Atur timeout jaringan dalam milidetik.
config.mNetworkTimeout = 5000;
// Atur jumlah percobaan ulang saat timeout. Interval untuk setiap percobaan ulang adalah networkTimeout. networkRetryCount=0 berarti tidak ada percobaan ulang, dan kebijakan percobaan ulang ditentukan oleh aplikasi. Nilai default adalah 2.
config.mNetworkRetryCount=2;
....// Pengaturan lainnya
  // Atur konfigurasi untuk player.
aliPlayer.setConfig(config);
Catatan
  • Jika Anda mengatur NetworkRetryCount dan masalah jaringan menyebabkan status loading, player mencoba ulang sebanyak NetworkRetryCount kali. Interval untuk setiap percobaan ulang adalah mNetworkTimeout.

  • Jika player masih dalam status loading setelah beberapa kali percobaan ulang, event onError dipanggil. Dalam kasus ini, ErrorInfo.getCode() mengembalikan ErrorCode.ERROR_LOADING_TIMEOUT.

  • Jika NetworkRetryCount diatur ke 0 dan koneksi jaringan timeout, player memanggil event onInfo. Untuk event ini, InfoBean.getCode() mengembalikan InfoCode.NetworkRetry. Pada titik ini, Anda dapat memanggil metode reload player untuk memuat ulang jaringan atau melakukan pemrosesan lainnya.

Konfigurasikan cache dan kontrol latensi

ApsaraVideo Player SDK untuk Android menyediakan antarmuka untuk mengatur cache dan kontrol latensi melalui PlayerConfig. Kode berikut merupakan contohnya:

Klik untuk melihat kode

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Delay maksimum. Catatan: Ini efektif untuk streaming langsung. Saat delay besar, SDK player akan melakukan sinkronisasi frame untuk memastikan delay player berada dalam rentang ini.
config.mMaxDelayTime = 5000;
// Durasi buffer maksimum dalam ms. Player memuat paling banyak data buffer sebanyak ini setiap kali.
config.mMaxBufferDuration = 50000;
// Durasi buffer tinggi dalam ms. Saat data sedang dimuat karena kondisi jaringan buruk, jika durasi buffer yang dimuat mencapai nilai ini, status loading berakhir.
config.mHighBufferDuration = 3000;
// Durasi buffer awal dalam ms. Semakin pendek waktu ini diatur, semakin cepat pemutaran dimulai. Namun, hal ini juga dapat menyebabkan player memasuki status loading segera setelah pemutaran dimulai.
config.mStartBufferDuration = 500;
....// Pengaturan lainnya
// Durasi buffer mundur maksimum dalam ms. Default adalah 0.
config.mMaxBackwardBufferDurationMs = 0;

// Atur konfigurasi untuk player.
aliPlayer.setConfig(config);

Penting
  • Hubungan antara tiga durasi buffer harus: mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration.

  • Saat durasi buffer maksimum (mMaxBufferDuration) lebih dari 5 menit, untuk mencegah pengecualian memori yang disebabkan oleh buffer yang terlalu besar, sistem secara default menggunakan durasi efektif 5 menit.

Atur header HTTP

Menggunakan metode PlayerConfig, Anda dapat menambahkan parameter header HTTP ke permintaan player. Kode berikut merupakan contohnya:

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Definisikan header.
String[] headers = new String[1];
headers[0]="Host:example.com"; // Misalnya, untuk mengatur Host di header.
// Atur header.
config.setCustomHeaders(headers);
....// Pengaturan lainnya
  // Atur konfigurasi untuk player.
aliPlayer.setConfig(config);

Gambar-dalam-Gambar (PiP)

Catatan

Untuk contoh kode lengkap, lihat modul PictureInPicture di API-Example. Proyek ini adalah proyek contoh berbasis Java untuk ApsaraVideo Player SDK untuk Android guna membantu Anda mengintegrasikan fitur inti SDK dengan cepat.

Prosedurnya adalah sebagai berikut:

  1. Dalam file AndroidManifest.xml, deklarasikan izin PiP.

    <activity
      android:name=".PictureInPictureActivity"
      android:exported="true"
      android:supportsPictureInPicture="true"
      android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
  2. Alihkan Activity target ke mode PiP.

    Rational aspectRatio = new Rational(16, 9); // Rasio aspek jendela PiP, yang dapat disesuaikan sesuai kebutuhan.
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    Anda dapat memilih untuk memicu mode PiP dari event OnClick, saat meninggalkan aplikasi, atau saat kembali ke aplikasi. Metode implementasinya adalah sebagai berikut:

    Dipicu oleh OnClick

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Rational aspectRatio = new Rational(16, 9); // Rasio aspek jendela PiP.
            PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
            pipBuilder.setAspectRatio(aspectRatio);
            enterPictureInPictureMode(pipBuilder.build());
        }
    });

    Dipicu saat meninggalkan aplikasi

    @Override
    protected void onUserLeaveHint() {
        super.onUserLeaveHint();
        Rational aspectRatio = new Rational(16, 9); // Rasio aspek jendela PiP.
        PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
        pipBuilder.setAspectRatio(aspectRatio);
        enterPictureInPictureMode(pipBuilder.build());
    
        Log.e(TAG, "PiP onUserLeaveHint");
    }

    Dipicu saat kembali ke aplikasi

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // Dipicu dari tombol kembali.
        enterPictureInPictureMode();
    }
  3. Tangani UI untuk menampilkan dan menyembunyikan jendela PiP.

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // Penanganan saat memasuki mode PiP.
            // sembunyikan UI
            Log.e(TAG, "Memasuki mode PiP");
        } else {
            // Penanganan saat keluar dari mode PiP.
            // tampilkan UI 
            Log.e(TAG, "Keluar dari mode PiP");
        }
    }

Fallback RTS langsung

Catatan

Untuk contoh kode lengkap, lihat modul RtsLiveStream di API-Example. Proyek ini adalah proyek contoh berbasis Java untuk ApsaraVideo Player SDK untuk Android guna membantu Anda mengintegrasikan fitur inti SDK dengan cepat.

Untuk informasi selengkapnya, lihat Streaming langsung RTS.

Beralih antara saluran suara kiri dan kanan

ApsaraVideo Player SDK untuk Android menggunakan metode setOutputAudioChannel untuk mengatur saluran suara output. Jika sumber input adalah dual-channel, Anda dapat menggunakan metode berikut untuk beralih ke saluran kiri atau kanan. Jika sumber input adalah single-channel, pengaturan ini tidak berpengaruh.

Catatan

Pengaturan saluran suara output memengaruhi rendering audio dan callback data PCM.

/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT: Beralih ke saluran kiri untuk pemutaran.
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT: Beralih ke saluran kanan untuk pemutaran.
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE: Jangan beralih saluran, pertahankan saluran sumber input untuk pemutaran.
*/
aliPlayer.setOutputAudioChannel();

Parsing aliran audio

Anda dapat mengatur listener untuk mendapatkan data aliran audio dan video. Audio dan video tidak boleh berupa aliran terenkripsi karena aliran terenkripsi tidak dapat diparse.

Klik untuk melihat kode

// Konfigurasi opsional 1: Apakah akan mengembalikan alamat data dasar.
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true; // Apakah hanya mengembalikan alamat data video dasar.
config.mAudioDataAddr = true; // Apakah hanya mengembalikan alamat data audio dasar.
aliPlayer.setRenderFrameCallbackConfig(config);

// Konfigurasi opsional 2: Saat decoding hardware diaktifkan, RenderFrame mengembalikan texture_oes_id. Saat decoding software diaktifkan, RenderFrame mengembalikan data sumber.
aliPlayer.enableHardwareDecoder(true);
// Atur listener untuk mendapatkan data audio dan video.
aliPlayer.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // Data video
    } else {
        // Data audio
    }
    return false;
});

Atur warna latar belakang video

ApsaraVideo Player SDK untuk Android mendukung pengaturan warna latar belakang untuk rendering player. Operasi API dan petunjuk penggunaannya adalah sebagai berikut:

Contoh operasi API

/**
 * Mengatur warna latar belakang video.
 * @param color  ARGB
 */
abstract public void setVideoBackgroundColor(int color);

Petunjuk penggunaan

// Parameter adalah data heksadesimal 8-bit. 8 bit dikelompokkan berpasangan, mewakili A (transparansi alpha), R (merah), G (hijau), dan B (biru) secara berurutan.
// Misalnya, 0x0000ff00 merepresentasikan hijau.
aliPlayer.setVideoBackgroundColor(0x0000ff00);

Tentukan nama domain pemutaran untuk VidAuth

Anda dapat menggunakan metode VidAuth untuk menentukan bidang seperti nama domain yang sesuai dengan VID. Untuk informasi selengkapnya tentang bidang yang didukung, lihat Parameter permintaan GetPlayInfo. Operasi API dan petunjuk penggunaannya adalah sebagai berikut:

Contoh operasi API

/**
 * Mengatur parameter pemutaran.
 *
 * @param playConfig Parameter pemutaran.
 */
public void setPlayConfig(VidPlayerConfigGen playConfig);

Petunjuk penggunaan

Anda dapat menggunakan metode addPlayerConfig antarmuka VidPlayerConfigGen untuk menambahkan bidang playDomain.

vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// Tambahkan bidang playDomain. Untuk informasi selengkapnya tentang bidang yang dapat ditambahkan, lihat
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);

Plugin decoding H.266

H.266 (VVC/Versatile Video Coding) adalah standar encoding video generasi berikutnya yang secara signifikan menghemat bitrate sambil mempertahankan kualitas gambar yang sama. Untuk mengoptimalkan performa dan mengontrol ukuran SDK utama, kemampuan decoding bernilai tambah H.266 dikemas secara independen sebagai plugin, yang mendukung integrasi sesuai permintaan.

Prasyarat

  1. ApsaraVideo Player SDK atau All-in-One SDK adalah V7.6.0 atau versi lebih baru.

  2. Lisensi Edisi Profesional telah diperoleh. Untuk informasi selengkapnya, lihat Dapatkan lisensi untuk ApsaraVideo Player SDK.

  3. ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung pemutaran video H.266 yang ditranskode oleh Transcoding Alibaba Cloud.

Integrasikan plugin

ApsaraVideo Player SDK

Integrasi Maven (disarankan)

Dalam file build.gradle aplikasi Anda, tambahkan dependensi untuk versi plugin yang ditentukan:

Catatan

Untuk versi terbaru ApsaraVideo Player SDK untuk Android, lihat Catatan rilis untuk ApsaraVideo Player SDK untuk Android.

// x.x.x harus konsisten dengan nomor versi ApsaraVideo Player SDK.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

Integrasi lokal

Anda dapat mengunduh versi terbaru ApsaraVideo Player SDK untuk Android, dan menyalin paket AlivcVVCCodec ke direktori libs proyek Anda (jika folder libs tidak ada, buat secara manual). Untuk informasi selengkapnya, lihat Integrasi lokal.

All-in-One SDK

Integrasi Maven

Dalam file build.gradle aplikasi Anda, tambahkan dependensi untuk versi plugin yang ditentukan:

// x.x.x harus konsisten dengan nomor versi All-in-One SDK yang Anda gunakan.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

Aktifkan plugin

Catatan

Mulai dari ApsaraVideo Player SDK V7.7.0 untuk Android, plugin diaktifkan secara default setelah integrasi dan tidak perlu diaktifkan secara manual.

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

Kode kesalahan terkait

Untuk kode kesalahan terkait plugin decoding H.266, lihat FAQ umum untuk player di berbagai klien.

Segarkan otomatis sumber pemutaran

Mengaktifkan fitur penyegaran otomatis sumber pemutaran mencegah gangguan pemutaran yang disebabkan oleh kedaluwarsa autentikasi. Fitur ini memicu listener saat sumber menjadi tidak valid dan mendapatkan alamat pemutaran baru, yang memastikan pemutaran video berkelanjutan dan lancar.

Prasyarat

  1. ApsaraVideo Player SDK atau All-in-One SDK adalah V7.9.0 atau versi lebih baru.

  2. Anda menggunakan sumber VidAuth untuk pemutaran atau bisnis Anda telah mengonfigurasi penandatanganan URL.

Sumber VidAuth

Contoh operasi API

/**
 * Mengatur listener untuk event kedaluwarsa sumber VidAuth.
 *
 * Fitur ini memungkinkan penyegaran otomatis sumber VidAuth untuk menghindari gangguan pemutaran
 * yang disebabkan oleh kedaluwarsa. Saat listener dipicu, Anda dapat menyegarkan sumber VidAuth
 * dan mengembalikan VidAuth yang diperbarui menggunakan {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener Antarmuka untuk mendengarkan event kedaluwarsa sumber VidAuth. Lihat {@link OnVidAuthExpiredListener}.
 *
 */
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);

Komponen fitur

Komponen fitur

/**
 * Listener untuk notifikasi kedaluwarsa sumber VidAuth.
 * Menangani event saat sumber VidAuth kedaluwarsa.
 */
public interface OnVidAuthExpiredListener {

    /**
     * Dipanggil saat player mendeteksi bahwa sumber VidAuth telah kedaluwarsa. Kedaluwarsa sumber VidAuth mencakup kedaluwarsa PlayAuth dan alamat pemutaran.
     *
     * Anda dapat menyegarkan sumber VidAuth dalam callback ini dan mengembalikan VidAuth baru
     * menggunakan {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource Objek sumber VidAuth yang kedaluwarsa. Lihat {@link VidAuth}.
     * @param callback Callback yang digunakan untuk memberikan sumber VidAuth yang diperbarui ke player. Lihat {@link SourceRefreshCallback}.
     */
    void onVidAuthExpired(VidAuth expiredSource, SourceRefreshCallback<VidAuth> callback);
}

/**
 * Antarmuka callback untuk menangani hasil penyegaran sumber pemutaran.
 *
 * Antarmuka ini berlaku untuk jenis sumber pemutaran yang memerlukan pembaruan dinamis,
 * seperti sumber URL atau sumber VidAuth. Saat player memicu permintaan penyegaran,
 * hasil penyegaran dapat dikembalikan melalui antarmuka ini dengan memanggil metode `onSuccess` atau `onError`.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Dipanggil oleh player saat operasi penyegaran berhasil.
     *
     * @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui. Lihat {@link SourceBase}.
     *
     * Metode ini menunjukkan bahwa operasi penyegaran berhasil diselesaikan. Developer harus menyediakan
     * sumber pemutaran baru dalam metode ini agar player dapat memuat resource terbaru.
     */
    void onSuccess(T newSource);

    /**
     * Dipanggil oleh player saat operasi penyegaran gagal.
     *
     * @param errorMsg String yang menjelaskan alasan kegagalan.
     *
     * Metode ini menunjukkan bahwa operasi penyegaran gagal. Developer dapat menggunakan `errorMsg`
     * untuk menangkap detail kegagalan dan melanjutkan penanganan berikutnya.
     */
    void onError(String errorMsg);
}

Petunjuk penggunaan

Anda dapat memperoleh kredensial pemutaran dengan memanggil operasi API GetVideoPlayAuth. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mendapatkan kredensial guna menghindari penandatanganan sendiri. Untuk informasi selengkapnya, lihat OpenAPI Portal.

// Atur listener untuk kedaluwarsa kredensial pemutaran VID.
aliPlayer.setOnVidAuthExpiredListener(new AliPlayer.OnVidAuthExpiredListener() {
    @Override
    public void onVidAuthExpired(VidAuth vidAuth, UrlPlayer.SourceRefreshCallback<VidAuth> sourceRefreshCallback) {
        
        String vid = vidAuth.getVid();

        // ------------------- Awal implementasi pengguna -------------------
        // Panggil fungsi yang Anda implementasikan sendiri untuk mendapatkan PlayAuth baru dari server aplikasi.
        // clinetGetPlayAuthFunction adalah contoh nama fungsi. Ganti dengan implementasi Anda sendiri.
        clinetGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * Callback untuk berhasil mendapatkan kredensial baru.
             * @param newPlayAuth String kredensial pemutaran baru yang diperoleh dari server Anda.
             */
            @Override
            public void onAuthSuccess(String newPlayAuth) {                
                // 1. Perbarui objek vidAuth lama dengan PlayAuth baru.
                vidAuth.setPlayAuth(newPlayAuth);
                
                // 2. Berikan kembali objek yang diperbarui ke player melalui callback SDK.
                sourceRefreshCallback.onSuccess(vidAuth);
            }

            /**
             * Callback untuk gagal mendapatkan kredensial baru.
             * @param errorMessage Pesan kesalahan detail.
             */
            @Override
            public void onAuthError(String errorMessage) {                
                // Berikan pesan kesalahan kembali ke player melalui callback SDK.
                sourceRefreshCallback.onError(errorMessage);
            }
        });
        // ------------------- Akhir implementasi pengguna -------------------
    }
});

UrlSource sumber

Contoh operasi API

/**
 * Mengatur listener untuk event kedaluwarsa sumber URL.
 *
 * Fitur ini memungkinkan penyegaran URL untuk menghindari gangguan pemutaran yang disebabkan oleh
 * kedaluwarsa URL karena autentikasi. Saat listener dipicu,
 * Anda dapat menyegarkan sumber URL dan mengembalikan sumber URL yang diperbarui menggunakan {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener Listener untuk menangani event kedaluwarsa sumber URL. Lihat {@link OnURLSourceExpiredListener}.
 *
 * <p>Untuk informasi selengkapnya tentang mengonfigurasi autentikasi URL, lihat
 * <a href="https://www.alibabacloud.com/help/id/vod/user-guide/configure-url-signing">dokumentasi autentikasi URL</a>.</p>
 */
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);

Komponen fitur

Komponen fitur

/**
 * Antarmuka callback untuk menangani hasil penyegaran sumber pemutaran.
 *
 * Antarmuka ini berlaku untuk jenis sumber pemutaran yang memerlukan pembaruan dinamis,
 * seperti sumber URL atau sumber VidAuth. Saat player memicu permintaan penyegaran,
 * hasil penyegaran dapat dikembalikan melalui antarmuka ini dengan memanggil metode `onSuccess` atau `onError`.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Dipanggil oleh player saat operasi penyegaran berhasil.
     *
     * @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui. Lihat {@link SourceBase}.
     *
     * Metode ini menunjukkan bahwa operasi penyegaran berhasil diselesaikan. Developer harus menyediakan
     * sumber pemutaran baru dalam metode ini agar player dapat memuat resource terbaru.
     */
    void onSuccess(T newSource);

    /**
     * Dipanggil oleh player saat operasi penyegaran gagal.
     *
     * @param errorMsg String yang menjelaskan alasan kegagalan.
     *
     * Metode ini menunjukkan bahwa operasi penyegaran gagal. Developer dapat menggunakan `errorMsg`
     * untuk menangkap detail kegagalan dan melanjutkan penanganan berikutnya.
     */
    void onError(String errorMsg);
}

/**
 * Listener untuk notifikasi kedaluwarsa sumber URL.
 * Ini membantu memproses sumber yang kedaluwarsa dan mencegah gangguan pemutaran.
 */
public interface OnURLSourceExpiredListener {

    /**
     * Dipanggil saat player mendeteksi bahwa sumber URL (UrlSource) telah kedaluwarsa.
     *
     * Anda dapat menyegarkan sumber URL dalam callback ini dan mengembalikan UrlSource baru
     * menggunakan {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource Objek UrlSource yang kedaluwarsa. Lihat {@link UrlSource}.
     * @param callback Callback penyegaran yang digunakan untuk mengembalikan UrlSource yang diperbarui ke player. Lihat {@link SourceRefreshCallback}.
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

Petunjuk penggunaan

// Atur listener kedaluwarsa URL player.
mAliyunVodPlayer.setOnURLSourceExpiredListener(new UrlPlayer.OnURLSourceExpiredListener() {
    @Override
    public void onUrlSourceExpired(UrlSource urlSource, UrlPlayer.SourceRefreshCallback<UrlSource> sourceRefreshCallback) {
        String expiredUrl = urlSource.getUri();
        Log.d(TAG, "[onUrlSourceExpired] Menerima URL yang kedaluwarsa: " + expiredUrl);

        // 1. Periksa apakah kunci autentikasi valid (dengan asumsi authenticationKey adalah variabel anggota kelas).
        if (authenticationKey == null || authenticationKey.trim().isEmpty()) {
            Log.e(TAG, "Penyegaran gagal: Kunci autentikasi kosong.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Kunci autentikasi tidak ada.");
            return; // Kunci tidak valid, keluar lebih awal.
        }

        // 2. Hitung periode timeout (validitas) untuk alamat pemutaran.
        // Jika variabel anggota validTime valid, gunakan; jika tidak, default ke 3600 detik (1 jam).
        long validityDuration = (AliyunVodPlayerView.this.validTime > 0) ? validTime : 3600;
        long newExpireTime = (System.currentTimeMillis() / 1000) + validityDuration;

        // 3. Ekstrak URL asli dari URL yang kedaluwarsa (menggunakan penandatanganan Jenis A sebagai contoh).
        // Pulihkan alamat resource asli dengan menghapus bagian parameter URL (seperti "?auth_key=").
        int authKeyIndex = expiredUrl.indexOf("?auth_key=");
        if (authKeyIndex == -1) {
            authKeyIndex = expiredUrl.indexOf("&auth_key=");
        }
        // Pastikan penanganan aman bahkan jika auth_key tidak ditemukan.
        String originalUrl = (authKeyIndex != -1) ? expiredUrl.substring(0, authKeyIndex) : expiredUrl;

        // 4. Gunakan kelas utilitas untuk menghasilkan URL bertanda tangan baru.
        String newAuthUrl = CdnAuthUtil.aAuth(originalUrl, authenticationKey, newExpireTime);

        // 5. Periksa URL bertanda tangan yang dihasilkan dan kembalikan hasil melalui callback.
        if (newAuthUrl != null && !newAuthUrl.isEmpty()) {
            Log.i(TAG, "Penyegaran berhasil, URL baru: " + newAuthUrl);
            // Seperti yang dipersyaratkan oleh SDK, buat objek UrlSource dan atur URL baru.
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "Penyegaran gagal: Gagal menghasilkan URL berotorisasi baru.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Gagal menghasilkan URL baru.");
        }
    }
});

Fungsi utilitas tambahan

Contoh berikut menggunakan penandatanganan Jenis A.

Fungsi utilitas tambahan

// Fungsi untuk menghasilkan URL bertanda tangan.
private String generateAuthUrl(String uri, String key, long exp) {
    Pattern uriPattern = Pattern.compile("^(https?://)?([^/?]+)(/[^?]*)?(\\?.*)?$");
    Matcher m = uriPattern.matcher(uri);

    if (!m.matches()) {
        return null;
    }

    String scheme = (m.group(1) != null) ? m.group(1) : "http://";
    String host = m.group(2);
    String path = (m.group(3) != null) ? m.group(3) : "/";
    String args = (m.group(4) != null) ? m.group(4) : "";

    String rand = "0";
    String uid = "0";

    String sstring = String.format("%s-%d-%s-%s-%s", path, exp, rand, uid, key);
    String hashvalue = md5sum(sstring);
    String authKey = String.format("%d-%s-%s-%s", exp, rand, uid, hashvalue);

    if (!args.isEmpty()) {
        return String.format("%s%s%s%s&auth_key=%s", scheme, host, path, args, authKey);
    } else {
        return String.format("%s%s%s%s?auth_key=%s", scheme, host, path, args, authKey);
    }
}

// Fungsi utilitas untuk menghitung MD5.
private String md5sum(String src) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(src.getBytes(StandardCharsets.UTF_8));
        byte[] digest = md.digest();

        StringBuilder hexString = new StringBuilder();
        for (byte b : digest) {
            hexString.append(String.format("%02x", b));
        }
        return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("Algoritma MD5 tidak ditemukan", e);
    }
}

Performa

Atur skenario pemutaran

Mengatur skenario pemutaran secara otomatis mengonfigurasi parameter optimal (termasuk pengaturan buffer, sakelar fitur, dll.) untuk skenario tersebut. Fitur ini juga kompatibel dengan pengaturan parameter kustom yang dibuat melalui antarmuka setConfig (pengaturan kustom memiliki prioritas lebih tinggi).

Catatan
  • Setelah mengatur skenario pemutaran, Anda dapat menggunakan antarmuka getConfig untuk melihat konfigurasi parameter.

Contoh operasi API

/**
 * Mengatur skenario player.
 *
 * @param scene Skenario.
 */
abstract public void setPlayerScene(PlayerScene scene);

Skenario pemutaran

public enum PlayerScene {
    /**
     * Tidak ada skenario.
     */
    NONE,
    /**
     * Skenario video panjang: berlaku untuk video lebih dari 30 menit.
     */
    LONG,
    /**
     * Skenario video menengah: berlaku untuk video antara 5 hingga 30 menit.
     */
    MEDIUM,
    /**
     * Skenario video pendek: berlaku untuk video antara 0 detik hingga 5 menit.
     */
    SHORT,
    /**
     * Skenario streaming langsung.
     */
    LIVE,
    /**
     * Skenario langsung RTS.
     */
    RTS_LIVE
}

Petunjuk penggunaan

// Atur skenario video pendek.
aliPlayer.setPlayerScene(PlayerScene.SHORT)

// Atur skenario video menengah.
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)

// Atur skenario video panjang.
aliPlayer.setPlayerScene(PlayerScene.LONG)

// Atur skenario streaming langsung.
aliPlayer.setPlayerScene(PlayerScene.LIVE)

Pre-rendering

ApsaraVideo Player SDK untuk Android mendukung rendering frame pertama dengan cepat sebelum pemutaran dimulai, yang dapat meningkatkan kecepatan startup.

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Mengaktifkan fitur ini memengaruhi urutan pemicu callback keberhasilan persiapan dan rendering frame pertama. Saat dinonaktifkan, callback keberhasilan persiapan dipicu sebelum callback rendering frame pertama. Saat diaktifkan, callback rendering frame pertama mungkin dipicu sebelum callback keberhasilan persiapan karena perbedaan kecepatan decoding dan rendering, tetapi hal ini tidak memengaruhi pemutaran.

Kode berikut merupakan contohnya:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

Cache lokal

Catatan

Untuk contoh kode lengkap, lihat modul Preload di API-Example. Proyek ini adalah proyek contoh berbasis Java untuk ApsaraVideo Player SDK untuk Android guna membantu Anda mengintegrasikan fitur inti SDK dengan cepat.

ApsaraVideo Player SDK untuk Android menyediakan fitur cache lokal. Fitur ini meningkatkan kecepatan startup, kecepatan pencarian, dan mengurangi tersendat saat pengguna memutar ulang video, sekaligus menghemat trafik.

Enable local cache

Fitur cache lokal dinonaktifkan secara default. Untuk menggunakannya, Anda harus mengaktifkannya secara manual. Fitur ini dikontrol oleh enableLocalCache di AliPlayerGlobalSettings. Kode berikut merupakan contohnya:

Klik untuk melihat kode

// Aktifkan cache lokal (jalur default).
AliPlayerGlobalSettings.enableLocalCache(true, this);

/**
 *  Anda juga dapat menggunakan kode di bawah ini untuk mengatur cache.
 *  Aktifkan cache lokal. Setelah diaktifkan, akan di-cache ke file lokal.
 *  @param enable: Sakelar fitur cache lokal. true: aktifkan, false: nonaktifkan. Default adalah nonaktifkan.
 *  @param maxBufferMemoryKB: Ditinggalkan di V5.4.7.1 dan versi lebih baru, tidak lagi berpengaruh.
 *  @param localCacheDir: Harus diatur. Direktori untuk file cache lokal, harus berupa jalur mutlak.
 *  AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * Konfigurasi untuk membersihkan file cache lokal.
 * @param expireMin - Ditinggalkan di V5.4.7.1 dan versi lebih baru, tidak lagi berpengaruh.
 * @param maxCapacityMB - Kapasitas cache maksimum dalam MB. Default adalah 20 GB. Selama pembersihan, jika ukuran total cache melebihi batas ini, file cache tertua akan dihapus satu per satu, diurutkan berdasarkan waktu akses terakhir, hingga ukuran total kurang dari atau sama dengan kapasitas maksimum.
 * @param freeStorageMB - Ruang disk bebas minimum dalam MB. Default adalah 0. Selama pembersihan, mirip dengan maxCapacityMB, jika ruang disk saat ini kurang dari nilai ini, file cache akan dihapus satu per satu sesuai aturan hingga ruang bebas lebih besar dari atau sama dengan nilai ini atau semua cache dihapus.
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * Atur callback untuk nilai hash URL yang dimuat. Jika tidak diatur, SDK menggunakan algoritma MD5.
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
Catatan
  • Jika URL pemutaran video memiliki parameter autentikasi, parameter autentikasi berubah selama caching lokal dan pemutaran. Untuk meningkatkan rasio hit cache untuk URL yang sama dengan autentikasi berbeda, Anda dapat menghapus parameter autentikasi dari URL sebelum menghitung nilai hash (misalnya, MD5) melalui antarmuka setCacheUrlHashCallback. Misalnya, jika URL pemutaran video dengan parameter autentikasi adalah http://****.mp4?aaa, gunakan http://****.mp4 untuk menghitung nilai hash saat memuat. Namun, jika video tersebut adalah video m3u8 terenkripsi dan keyURL-nya diproses dengan menghapus parameter autentikasi sebelum menghitung nilai hash, cache video berbeda mungkin mengenai kunci yang sama, yang menyebabkan kegagalan pemutaran. Solusi: Dalam callback setCacheUrlHashCallback, Anda dapat melakukan pemeriksaan nama domain dan hanya menghapus parameter autentikasi untuk domain pemutaran (http(s)://xxxxx.m3u8?aaaa), dan tidak menghapusnya untuk domain yang sesuai dengan keyURL (http(s)://yyyyy?bbbb).进阶功能-本地缓存.png

  • Jika server mendukung protokol HTTP dan HTTPS, tetapi protokol berbeda mengarah ke file media yang sama, Anda dapat menghapus atau menyatukan header permintaan sebelum menghitung nilai hash. Misalnya:

    • Jika URL pemutaran video adalah https://****.mp4 dan http://****.mp4, gunakan ****.mp4 untuk menghitung nilai hash saat memuat.

    • Jika URL pemutaran video adalah https://****.mp4, satukan menjadi http://****.mp4 sebelum menghitung nilai hash.

  • Untuk versi SDK player 5.5.4.0 dan versi lebih baru, jika URL pemutaran video memiliki parameter autentikasi dan protokol pemutaran adalah HLS, Anda dapat mengatur bidang PlayerConfig.mEnableStrictAuthMode untuk memilih mode autentikasi berbeda (nilai default adalah false untuk versi 5.5.4.0 hingga 6.21.0. Nilai default adalah true untuk versi 7.0.0 dan versi lebih baru):

    • Autentikasi non-ketat (false): Autentikasi juga di-cache. Jika hanya sebagian media yang di-cache terakhir kali, player menggunakan autentikasi yang di-cache untuk membuat permintaan saat memutar bagian yang tidak di-cache berikutnya. Jika periode validitas autentikasi URL sangat singkat, hal ini menyebabkan pengecualian pemutaran.

    • Autentikasi ketat (true): Autentikasi tidak di-cache. Autentikasi dilakukan setiap kali pemutaran dimulai. Hal ini menyebabkan pemutaran gagal tanpa koneksi jaringan.

Enable or disable local cache for a single URL

Jika Anda ingin mengaktifkan atau menonaktifkan fitur cache lokal untuk URL tunggal, Anda dapat mengaturnya di konfigurasi player.

// Pertama, dapatkan konfigurasi.
PlayerConfig config = aliPlayer.getConfig();
// Apakah akan mengaktifkan cache lokal untuk URL pemutaran. Nilai default adalah true. Saat cache lokal di AliPlayerGlobalSettings diaktifkan, dan cache lokal di sini juga diaktifkan (diatur ke true), cache lokal untuk URL ini akan berlaku. Jika diatur ke false di sini, cache lokal untuk URL ini dinonaktifkan.
config.mEnableLocalCache = false;
....// Pengaturan lainnya

// Atur konfigurasi untuk player.
aliPlayer.setConfig(config);

Preload

ApsaraVideo Player SDK untuk Android menyediakan fitur preload, yang merupakan peningkatan dari fitur cache lokal. Dengan mengatur ukuran memori untuk caching video, Anda dapat lebih lanjut meningkatkan kecepatan startup video.

Batasan fitur preload adalah sebagai berikut:

  • Saat ini mendukung pemuatan file media tunggal seperti MP4, MP3, FLV, dan HLS.

Catatan

ApsaraVideo Player SDK untuk Android menyediakan kemampuan penjadwalan sumber daya jaringan otomatis untuk preload secara default. Hal ini mengurangi dampak permintaan jaringan preload terhadap permintaan jaringan video yang sedang diputar. Kebijakan penjadwalan otomatis bekerja sebagai berikut: preload hanya diizinkan membuat permintaan setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk mengontrol permintaan real-time untuk preload sendiri, Anda dapat menonaktifkan kebijakan ini menggunakan metode berikut:

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. Aktifkan fitur cache lokal. Untuk informasi selengkapnya, lihat Cache lokal.

  2. Atur sumber data.

    VidAuth (disarankan)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Informasi Vid"); // Wajib. ID video (VideoId).
    vidAuth.setPlayAuth("<yourPlayAuth>"); // Wajib. Kredensial pemutaran, yang perlu dihasilkan dengan memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD.
    vidAuth.setRegion("Wilayah akses"); // Untuk SDK player V5.5.5.0 dan versi lebih baru, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah, karena player akan menguraikannya secara otomatis. Untuk versi SDK player sebelum 5.5.5.0, parameter ini wajib. Ini adalah wilayah akses ApsaraVideo VOD, yang default-nya cn-shanghai.
    vidAuth.setQuality("Definisi yang dipilih") // "AUTO" merepresentasikan bitrate adaptif.

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Informasi Vid"); // Wajib. ID video (VideoId).
    vidSts.setAccessKeyId("<yourAccessKeyId>"); // Wajib. ID AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
    vidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Wajib. Rahasia AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
    vidSts.setSecurityToken("<yourSecurityToken>"); // Wajib. Token keamanan STS, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
    vidSts.setRegion("Wilayah akses"); // Wajib. Wilayah akses ApsaraVideo VOD, yang default-nya cn-shanghai.
    vidSts.setQuality("Definisi yang dipilih") // "AUTO" merepresentasikan bitrate adaptif.

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("URL Pemutaran"); // Wajib. URL pemutaran, yang dapat berupa URL VOD pihak ketiga atau URL pemutaran di ApsaraVideo VOD.
  3. Atur parameter tugas.

    Catatan

    Ini hanya berlaku untuk video multi-bitrate. Anda dapat memilih salah satu dari setDefaultBandWidth, setDefaultResolution, atau setDefaultQuality.

    PreloadConfig preloadConfig = new PreloadConfig();
    // Atur bitrate preload untuk aliran multi-bitrate.
    preloadConfig.setDefaultBandWidth(400000);
    // Atur resolusi preload untuk aliran multi-bitrate.
    preloadConfig.setDefaultResolution(640 * 480);
    // Atur kualitas preload untuk aliran multi-bitrate.
    preloadConfig.setDefaultQuality(“FD”);
    // Atur durasi preload.
    preloadConfig.setDuration(1000);
  4. Tambahkan listener tugas.

    Klik untuk melihat kode

    /**
     * Implementasi listener preload
     */
    private static class PreloadListenerImpl extends OnPreloadListener {
    
        @Override
        public void onError(@NonNull String taskId, @NonNull String urlOrVid, @NonNull ErrorInfo errorInfo) {
            // Kesalahan pemuatan.
        }
    
        @Override
        public void onCompleted(@NonNull String taskId, @NonNull String urlOrVid) {
            // Pemuatan selesai.
        }
    
        @Override
        public void onCanceled(@NonNull String taskId, @NonNull String urlOrVid) {
           // Pemuatan dibatalkan.
        }
    }
  5. Buat tugas dan tambahkan ke instance MediaLoaderV2 untuk memulai preloading.

    VidAuth (disarankan)

    // Buat tugas preload.
    PreloadTask mPreloadTask = new PreloadTask(vidAuth, preloadConfig);
    // Dapatkan instance MediaLoaderV2.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai preloading.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)

    VidSts

    // Buat tugas preload.
    PreloadTask mPreloadTask = new PreloadTask(vidSts, preloadConfig);
    // Dapatkan instance MediaLoaderV2.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai preloading.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl);

    UrlSource

    // Buat tugas preload.
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // Dapatkan instance MediaLoaderV2.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai preloading.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)
  6. Opsional: Kelola tugas.

    mediaLoaderV2.cancelTask(taskId); // Batalkan tugas preload dengan ID tugas tertentu.
    mediaLoaderV2.pauseTask(taskId); // Jeda tugas preload dengan ID tugas tertentu.
    mediaLoaderV2.resumeTask(taskId); // Lanjutkan tugas preload dengan ID tugas tertentu.
  7. Opsional: Hapus file yang dimuat.

    Anda dapat menghapus file yang dimuat sesuai kebutuhan untuk menghemat ruang. ApsaraVideo Player SDK untuk Android tidak menyediakan antarmuka penghapusan. Anda perlu menghapus file di direktori pemuatan aplikasi.

Preload dinamis

Strategi preload dinamis memungkinkan integrator mengontrol cache video yang sedang diputar dan jumlah serta cache item yang dipre-load. Hal ini membantu bisnis menyeimbangkan pengalaman pemutaran dengan biaya.

Klik untuk melihat kode

// Aktifkan konfigurasi yang direkomendasikan dan preload dinamis.
aliListPlayer.setPreloadScene(IListPlayer.SceneType.SCENE_SHORT);

// Konfigurasikan durasi preload dasar.
// Atur durasi preload menjadi 1000ms.
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// Konfigurasikan jumlah item yang akan dipre-load, mendukung kedua arah.
// 1 adalah jumlah item yang akan dipre-load mundur, 3 adalah jumlah yang akan dipre-load maju.
aliListPlayer.setPreloadCount(1, 3);

// Konfigurasikan offset penurunan untuk preload dinamis.
aliListPlayer.enablePreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, true);
aliListPlayer.setPreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, "{\"algorithm\": \"sub\",\"offset\": \"200\"}");

Preload video HLS multi-bitrate

Dalam skenario pemutaran video HLS multi-bitrate listPlayer, integrator dapat mempre-load aliran dengan definisi yang sama dengan video yang sedang diputar. Mereka juga dapat memilih mode preload berdasarkan kebutuhan bisnis mereka.

Klik untuk melihat mode preload yang didukung

  /**
   * Mode default, memutar dan mempre-load bitrate default aliran.
   */
  MultiBitratesMode_Default(0),

  /**
   * Prioritas biaya frame pertama (FC), mengurangi biaya frame pertama. Hanya memutar bitrate aliran HLS yang telah dipre-load.
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * Menyeimbangkan frame pertama dan kelancaran pemutaran. Bitrate video konsisten sebelum dan sesudah beralih (moveToNext), dan performa frame pertama juga dipertimbangkan.
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * Prioritas kelancaran pemutaran. Video mulai diputar pada bitrate video sebelumnya secara default.
   */
  MultiBitratesMode_SmoothPrio(3);

Klik untuk melihat kode integrasi

// Pilih mode pemuatan multi-bitrate.
aliListPlayer.SetMultiBitratesMode(preLoadMode);


// (Opsional) Pilih bitrate startup.
aliListPlayer.setDefaultBandWidth(defaultBandWidth)


// (Opsional) Dalam callback onPrepared, pilih mode ABR.
aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
    @Override
    public void onPrepared() {
        // ABR hanya memengaruhi m3u8 multi-bitrate.
        aliListPlayer.selectTrack(-1);
    }
});

Dapatkan kecepatan unduhan

Anda dapat memperoleh kecepatan unduhan video yang sedang diputar dalam callback onInfo. Hal ini dilakukan menggunakan operasi API getExtraValue. Kode berikut merupakan contohnya:

aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
            // Kecepatan unduhan saat ini.
            long extraValue = infoBean.getExtraValue();
        }
    }
});

Fitur jaringan

HTTPDNS

HTTPDNS mengirim permintaan resolusi nama domain ke server HTTPDNS tertentu untuk mendapatkan hasil resolusi nama domain yang lebih cepat dan stabil, yang mengurangi risiko pembajakan DNS.

ApsaraVideo Player SDK menyediakan fitur HTTPDNS yang ditingkatkan yang menawarkan layanan HTTPDNS khusus untuk nama domain CDN Alibaba Cloud. Fitur ini mendukung penjadwalan presisi dan resolusi real-time untuk jaringan CDN Alibaba Cloud, yang secara efektif meningkatkan performa jaringan.

Contoh HTTPDNS yang ditingkatkan

HTTPDNS yang ditingkatkan hanya menyediakan layanan HTTPDNS untuk nama domain CDN Alibaba Cloud. Pastikan nama domain yang Anda konfigurasikan adalah nama domain CDN Alibaba Cloud dan konfigurasi nama domain lengkap serta siap digunakan. Untuk informasi selengkapnya tentang cara menambahkan dan mengonfigurasi nama domain CDN di ApsaraVideo VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi selengkapnya tentang nama domain CDN, lihat CDN Alibaba Cloud.

// Aktifkan HTTPDNS yang ditingkatkan.
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// Opsional: Tambahkan nama domain untuk pra-resolusi HTTPDNS.
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");

HTTP/2

Catatan

ApsaraVideo Player SDK untuk Android telah mengaktifkan HTTP/2 secara default sejak versi 5.5.0.0.

ApsaraVideo Player SDK untuk Android mendukung penggunaan protokol HTTP/2. Protokol ini meningkatkan performa pemutaran melalui multiplexing, yang menghindari head-of-line blocking. Kode berikut merupakan contohnya:

AliPlayerGlobalSettings.setUseHttp2(true);

Pra-buat koneksi TCP untuk HTTP

Untuk permintaan pemutaran video HTTP (bukan HTTPS), pra-membuat koneksi TCP secara signifikan dapat meningkatkan pengalaman pengguna, mengurangi waktu koneksi jaringan, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Penggunaannya adalah sebagai berikut:

// Format domain adalah host[:port], di mana port bersifat opsional. Gunakan titik koma (;) untuk memisahkan beberapa nama domain.
// Pengaturan global
// Antarmuka lengkap menggunakan string saat ini sebagai standar untuk setiap pengaturan (lebih - tambah, kurang - hapus). String kosong menghentikan pra-koneksi.
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

Unduhan video

Catatan

Untuk contoh kode lengkap, lihat modul Download di API-Example. Proyek ini adalah proyek contoh berbasis Java untuk ApsaraVideo Player SDK untuk Android guna membantu Anda mengintegrasikan fitur inti SDK dengan cepat.

ApsaraVideo Player SDK untuk Android menyediakan fitur unduhan video untuk ApsaraVideo VOD. Fitur ini memungkinkan pengguna menyimpan video secara lokal untuk ditonton offline menggunakan ApsaraVideo Player. Fitur ini juga menawarkan dua metode unduhan: unduhan normal dan unduhan aman.

  • Unduhan normal

    Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud. Pengguna dapat memutarnya dengan player pihak ketiga.

  • Unduhan aman

    Data video yang diunduh dienkripsi oleh Alibaba Cloud. Player pihak ketiga tidak dapat memutarnya. Video hanya dapat diputar menggunakan ApsaraVideo Player.

Petunjuk

  • Fitur unduhan video hanya didukung untuk metode VidSts dan VidAuth.

  • Untuk menggunakan fitur unduhan video player, Anda perlu mengaktifkan dan mengonfigurasi mode unduhan di konsol ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Unduhan offline.

  • Unduhan video mendukung unduhan yang dapat dilanjutkan.

Prosedur

  1. Opsional: Konfigurasikan file enkripsi untuk unduhan aman. Ini hanya diperlukan untuk unduhan aman, bukan untuk unduhan normal.

    Catatan

    Pastikan file enkripsi yang dikonfigurasi konsisten dengan informasi aplikasi. Jika tidak, unduhan video gagal.

    Jika Anda mengatur metode unduhan ke unduhan aman, Anda perlu mengonfigurasi SDK player dengan file kunci yang dihasilkan di konsol ApsaraVideo VOD. File ini digunakan untuk dekripsi dan verifikasi selama unduhan dan pemutaran video. Untuk informasi selengkapnya tentang cara menghasilkan file kunci, lihat Aktifkan unduhan aman.

    Kami menyarankan Anda mengonfigurasi ini sekali di kelas Application. Kode berikut merupakan contohnya:

    // Kami menyarankan menyimpan file encryptedApp.dat di ponsel dan kemudian mengatur jalur file lokal file enkripsi di sini.
    PrivateService.initService(getApplicationContext(),  "Jalur file tempat encryptedApp.dat berada");
  2. Buat dan siapkan downloader.

    Anda dapat membuat downloader menggunakan AliDownloaderFactory. Kode berikut merupakan contohnya:

    AliMediaDownloader mAliDownloader = null;
    ......
    // Buat downloader.
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // Konfigurasikan jalur penyimpanan untuk unduhan.
    mAliDownloader.setSaveDir("Alamat folder penyimpanan");
  3. Atur listener.

    Downloader menyediakan beberapa listener event. Kode berikut merupakan contohnya:

    Klik untuk melihat kode

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // Berhasil menyiapkan item unduhan.
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           // Persentase progres unduhan.
       }
       @Override
       public void onProcessingProgress(int percent) {
           // Persentase progres pemrosesan.
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           // Kesalahan unduhan.
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           // Unduhan berhasil.
       }
    });
  4. Siapkan sumber unduhan.

    Anda dapat menggunakan metode prepare untuk menyiapkan sumber unduhan. Sumber unduhan mendukung metode VidSts dan VidAuth. Kode berikut merupakan contohnya:

    • VidSts

      // Buat VidSts.
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Informasi Vid"); // ID video (VideoId).
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // ID AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Rahasia AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Token keamanan STS, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.
      aliyunVidSts.setRegion("Wilayah akses"); // Wilayah akses ApsaraVideo VOD, yang default-nya cn-shanghai.
       // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah.
       // Jika Anda belum mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, Anda tidak perlu mengintegrasikan kode berikut.
       VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
       vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
       aliyunVidSts.setPlayerConfig(config);
              
      
      // Siapkan sumber unduhan.
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      // Buat VidAuth.
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("Informasi Vid"); // ID video (VideoId).
      vidAuth.setPlayAuth("<yourPlayAuth>"); // Kredensial pemutaran, yang perlu dihasilkan dengan memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD.
      vidAuth.setRegion("Wilayah akses"); // Untuk SDK player V5.5.5.0 dan versi lebih baru, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah, karena player akan menguraikannya secara otomatis. Untuk versi SDK player sebelum 5.5.5.0, parameter ini wajib. Ini adalah wilayah akses ApsaraVideo VOD, yang default-nya cn-shanghai.
      // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // Siapkan sumber unduhan.
      mAliDownloader.prepare(vidAuth);
    Catatan
    • Format file sumber dan format file unduhan output sama dan tidak dapat diubah.

    • Jika Anda mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, nama parameter default adalah MtsHIsUriToken. Untuk informasi selengkapnya, lihat Pass-through parameter enkripsi standar HLS. Dalam kasus ini, Anda harus mengatur nilai MtsHIsUriToken dalam sumber VOD seperti yang ditunjukkan dalam kode di atas.

  5. Setelah persiapan berhasil, pilih item unduhan dan mulai unduhan.

    Setelah persiapan berhasil, metode OnPreparedListener dipanggil kembali. Objek TrackInfo yang dikembalikan berisi informasi seperti definisi setiap aliran video. Anda dapat memilih Track untuk diunduh. Kode berikut merupakan contohnya:

    public void onPrepared(MediaInfo mediaInfo) {
        // Berhasil menyiapkan item unduhan.
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // Misalnya, unduh TrackInfo pertama.
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // Mulai unduhan.
        mAliDownloader.start();
    }
  6. (Opsional) Perbarui sumber unduhan.

    Untuk mencegah VidSts dan VidAuth kedaluwarsa, Anda juga dapat memperbarui informasi sumber unduhan sebelum memulai unduhan. Kode berikut merupakan contohnya:

    // Perbarui sumber unduhan.
    mAliDownloader.updateSource(VidSts);
    // Mulai unduhan.
    mAliDownloader.start();
  7. Setelah unduhan berhasil atau gagal, lepaskan downloader.

    Setelah unduhan selesai, Anda dapat memanggil release dalam callback onCompletion atau onError untuk melepaskan downloader. Kode berikut merupakan contohnya:

    mAliDownloader.stop();
    mAliDownloader.release();
  8. Opsional: Hapus file yang diunduh.

    Selama atau setelah unduhan, Anda dapat menghapus file yang diunduh. Kode berikut merupakan contohnya:

    // Hapus file melalui objek.
    mAliDownloader.deleteFile();
    // Hapus melalui metode statis. Jika berhasil, mengembalikan 0.
    AliDownloaderFactory.deleteFile("Jalur folder unduhan yang akan dihapus", "ID Video", "Format Video", "Indeks video yang diunduh");

Langkah selanjutnya

Video yang diunduh dapat diputar menggunakan ApsaraVideo Player. Metodenya adalah sebagai berikut:

  1. Setelah unduhan selesai, dapatkan jalur mutlak file video.

    String path = mAliDownloader.getFilePath();
  2. Atur jalur absolut untuk pemutaran menggunakan metode UrlSource.

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("URL Pemutaran"); // Atur jalur absolut video yang diunduh.
            aliPlayer.setDataSource(urlSource);

Pemutaran video terenkripsi

ApsaraVideo VOD mendukung enkripsi HLS, kriptografi privat Alibaba Cloud, dan enkripsi DRM. Streaming langsung hanya mendukung enkripsi DRM. Untuk informasi selengkapnya tentang pemutaran terenkripsi, lihat Pemutaran video terenkripsi.

Pemutaran RTS native

ApsaraVideo Player SDK untuk Android mengintegrasikan Native RTS SDK untuk mengimplementasikan fitur streaming langsung latensi rendah native. Untuk informasi selengkapnya, lihat Implementasikan penarikan aliran RTS di Android.

Referensi