全部产品
Search
文档中心

ApsaraVideo VOD:Fitur lanjutan

更新时间:Jan 28, 2026

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.

Tetapkan listener saat aplikasi dimulai atau sebelum memanggil operasi API pemutar 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

Pemutaran 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());
    aliListPlayer.setTraceId("traceId");  // traceId adalah pengidentifikasi unik untuk perangkat atau pengguna, biasanya IMEI atau IDFA

  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 sukses persiapan
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // Callback perubahan resolusi video
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // Event tampilan rendering frame pertama
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // Event informasi lainnya, termasuk mulai putar ulang berulang, posisi buffer, posisi pemutaran saat ini, mulai putar otomatis, dll.
        }
    });
    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 berakhir
        }
    });
    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) {
            // Berhasil beralih aliran audio/video atau definisi
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // Gagal beralih aliran audio/video atau definisi
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // Event perubahan status pemutar
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // Event tangkapan layar
        }
    });
  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:

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

    List playback mendukung dua jenis sumber pemutaran: pemutaran Vid (termasuk VidSts dan VidPlayAuth) dan pemutaran 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 Cari informasi media 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 pengidentifikasi unik untuk video. Uid digunakan untuk menentukan apakah video tersebut sama. Jika uid identik, video tersebut dianggap sama. Jika terjadi crosstalk aliran selama pemutaran, periksa apakah uid yang sama digunakan di antara antarmuka yang berbeda. Uid tidak memiliki batasan format dan 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, panggil moveTo untuk secara otomatis memutar sumber video tertentu. Kode berikut merupakan contohnya:

    Klik untuk melihat kode

    // Aktifkan autoplay
    aliListPlayer.setAutoPlay(true);
    
    // Gunakan antarmuka ini untuk URL
    aliPlayer.moveTo(String uid);
    // Gunakan antarmuka ini untuk VID, yang memerlukan melewatkan stsInfo (kredensial STS sementara dan pasangan AccessKey sementara). Dapatkan terlebih dahulu. Untuk detailnya, lihat Buat role RAM dan berikan izin STS sementara.
    aliPlayer.moveTo(String uid, StsInfo info);
  7. Putar video sebelumnya atau berikutnya.

    • Setelah memanggil moveTo untuk memutar sumber video, Anda dapat memanggil moveToPrev dan moveToNext untuk memutar video sebelumnya dan berikutnya, menggunakan sumber video dari panggilan moveTo sebagai titik jangkar. Kode berikut merupakan contohnya:

      Catatan

      Saat menggunakan view yang sama, memanggil moveTo atau moveToNext untuk beralih sumber video dapat menyebabkan flickering layar atau layar hitam. Dalam kasus ini, kami menyarankan Anda menetapkan bidang PlayerConfig mClearFrameWhenStop ke false selama inisialisasi 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 berlaku untuk sumber URL dan tidak berlaku untuk pemutaran VID.
      aliListPlayer.moveToNext();
      // Pindah ke video sebelumnya. Catatan: Metode ini hanya berlaku untuk sumber URL dan tidak berlaku untuk pemutaran VID.
      aliListPlayer.moveToPrev();
      // Pindah ke video berikutnya. Catatan: Metode ini hanya berlaku untuk pemutaran VID.
      aliListPlayer.moveToNext(StsInfo info);
      // Pindah ke video sebelumnya. Catatan: Metode ini hanya berlaku 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, meningkatkan pengalaman pengguna.

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

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

  3. Kompatibilitas yang lebih tinggi: MP4 adalah format video universal yang didukung luas di berbagai perangkat dan browser, yang memastikan efek hadiah diputar dengan benar di perangkat utama.

  4. Efisiensi pengembangan yang lebih tinggi: Menggunakan video MP4 sebagai efek hadiah melibatkan solusi teknis yang relatif sederhana. Developer tidak perlu meneliti dan mengimplementasikan logika parsing dan rendering yang kompleks, sehingga dapat fokus pada fitur lain dan meningkatkan efisiensi pengembangan.

Contoh kode

Gunakan operasi API berikut untuk menetapkan mode alpha, yang menentukan posisi saluran alpha dalam materi video (atas, bawah, kiri, atau kanan). Nilai default adalah None.

Catatan
  • Posisi saluran alpha dalam materi video harus sesuai dengan parameter yang ditetapkan untuk setAlphaRenderMode.

  • Ukuran tampilan pemutar harus proporsional dengan resolusi materi video.

/**
 * Mengatur mode rendering alpha.
 *
 * @param alphaRenderMode Mode rendering alpha yang ditentukan. Lihat {@link AlphaRenderMode}.
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------Penggunaan View-------------
// Tetapkan View 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-----------
// Tetapkan mode alpha
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// Tetapkan 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: Bersihkan layar jika terjadi masalah koneksi setelah pemutaran instans tunggal selesai.
        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.

Contoh:

  1. Buat view untuk menampilkan subtitle.

    Buat tampilan berbeda berdasarkan format subtitle.

    Klik untuk melihat kode

    // Digunakan untuk menampilkan subtitle SRT dan VTT
    SubtitleView subtitleView = new SubtitleView(getContext());
    // Untuk player V7.6.0 ke atas, 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 tampilan subtitle ke tampilan layout
    viewGroup.addView(assSubtitleView);

    Jika Anda menggunakan Player SDK V7.6.0 ke atas dan VttSubtitleView untuk menampilkan subtitle SRT dan VTT, Anda harus menetapkan listener berikut:

    // Diperlukan untuk player V7.6.0 ke atas
    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

    Tetapkan file subtitle di onPrepared.

    mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Pengaturan subtitle (harus ditetapkan 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

Untuk mencapai pemutaran hanya audio, nonaktifkan pemutaran video dengan mengonfigurasi PlayerConfig sebelum memanggil prepare.

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

Beralih antara decoding software dan hardware

Catatan

Ubah metode decoding sebelum pemutaran dimulai. Beralih selama pemutaran tidak berpengaruh.

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. 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 ditetapkan, aliran cadangan tersebut diputar secara otomatis. Jika tidak ada aliran cadangan H.264 yang ditetapkan, pemutar secara otomatis fallback ke decoding software H.265.

Catatan
  • Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah untuk decoding adaptif dengan kemampuan gabungan cloud dan klien. Untuk mengaktifkan layanan ini, Anda harus mengisi formulir Yida untuk mengajukan lisensi.

  • Layanan bernilai tambah untuk decoding adaptif dengan kemampuan gabungan 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.

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

Kode berikut menunjukkan cara mengatur aliran cadangan:

// Lapisan aplikasi memelihara Map yang menyimpan semua pasangan kunci-nilai URL asli-URL cadangan. Saat beralih, kueri URL cadangan 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 adaptasi
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

Hasil switch dikembalikan melalui callback setelah Anda menetapkan 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 pemutar untuk beralih aliran pemutaran ke adaptive bitrate streaming, Anda dapat menetapkan definisi maksimum untuk switching ABR (adaptive bitrate) dalam konfigurasi. Hal ini mencegah switching otomatis ke bitrate yang tidak diharapkan. Agar pengaturan berlaku, kami menyarankan Anda memanggil kode ini sebelum pemutar memanggil metode prepare atau list player memanggil metode moveTo. Kode berikut merupakan contohnya:

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // Tetapkan batas atas jumlah piksel untuk definisi ABR menjadi 921600 (lebar × tinggi = 1280 × 720), sehingga jumlah piksel definisi yang dapat dialihkan ABR ≤ nilai ini
aliPlayer.setConfig(config);

Ambil snapshot

ApsaraVideo Player SDK untuk Android menyediakan fitur snapshot untuk menangkap frame video saat ini. Anda dapat menggunakan operasi API snapshot, yang menangkap data mentah dan mengembalikannya sebagai bitmap melalui antarmuka callback OnSnapShotListener. Kode berikut merupakan contohnya:

// Tetapkan callback snapshot
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // Bitmap dan dimensi gambar yang diperoleh
    }
});
// Tangkap 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, gunakan metode VidPlayerConfigGen.setPreviewTime() untuk menetapkan durasi pratinjau untuk pemutar. Kode berikut menunjukkan contoh untuk pemutaran VidSts:

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

Saat durasi pratinjau ditetapkan, server tidak mengembalikan konten video lengkap saat video diputar 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();
// Tetapkan Referer. Contoh: http://example.aliyundoc.com. (Catatan: Sertakan bagian protokol saat menetapkan Referer.)
config.mReferrer = referrer;
....// Pengaturan lainnya
  // Tetapkan konfigurasi untuk pemutar
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();
// Tetapkan UA
config.mUserAgent = "User-Agent yang akan ditetapkan";
....// Pengaturan lainnya
  // Tetapkan konfigurasi untuk pemutar
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();
// Tetapkan timeout jaringan dalam milidetik
config.mNetworkTimeout = 5000;
// Tetapkan jumlah upaya percobaan ulang saat timeout. Interval percobaan ulang adalah networkTimeout. networkRetryCount=0 berarti tidak ada percobaan ulang; kebijakan percobaan ulang ditentukan oleh aplikasi. Nilai default adalah 2
config.mNetworkRetryCount=2;
....// Pengaturan lainnya
  // Tetapkan konfigurasi untuk pemutar
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: Efektif untuk streaming langsung. Saat delay besar, SDK pemutar melakukan sinkronisasi frame internal untuk menjaga delay dalam rentang ini.
config.mMaxDelayTime = 5000;
// Durasi buffer maksimum dalam ms. Pemutar 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. Waktu yang lebih singkat berarti startup lebih cepat tetapi dapat menyebabkan cepat masuk ke status loading setelah pemutaran dimulai.
config.mStartBufferDuration = 500;
....// Pengaturan lainnya
// Durasi buffer mundur maksimum dalam ms. Default adalah 0.
config.mMaxBackwardBufferDurationMs = 0;

// Tetapkan konfigurasi untuk pemutar
aliPlayer.setConfig(config);

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

  • Saat durasi buffer maksimum (mMaxBufferDuration) melebihi 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 menetapkan Host di header
// Tetapkan header
config.setCustomHeaders(headers);
....// Pengaturan lainnya
  // Tetapkan konfigurasi untuk pemutar
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 PiP, dapat disesuaikan berdasarkan kebutuhan bisnis Anda
    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 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 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

Tetapkan listener untuk mendapatkan data aliran audio dan video. Fitur ini tidak mendukung aliran terenkripsi karena 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);
// Tetapkan 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

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

Petunjuk penggunaan

// Parameter adalah data heksadesimal 8 digit. 8 digit 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

/**
 * Menetapkan 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 dekode H.266

H.266 (VVC/Versatile Video Coding) adalah standar encoding video generasi berikutnya yang secara signifikan dapat 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 versi 7.6.0 ke atas.

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

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

Integrasikan plugin

SDK Pemutar

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 sesuai dengan nomor versi ApsaraVideo Player SDK
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

Integrasi lokal

Unduh versi terbaru ApsaraVideo Player SDK untuk Android, dan salin paket AlivcVVCCodec ke direktori libs proyek Anda (buat folder libs secara manual jika belum ada). 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 sesuai 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 refresh 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, memastikan pemutaran video yang berkelanjutan dan lancar.

Prasyarat

  1. ApsaraVideo Player SDK atau All-in-One SDK versi 7.9.0 ke atas.

  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 pemutar mendeteksi bahwa sumber VidAuth telah kedaluwarsa.
     * Kedaluwarsa sumber VidAuth mencakup kedaluwarsa PlayAuth dan kedaluwarsa alamat pemutaran.
     *
     * Anda dapat merefresh 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 pemutar. Lihat {@link SourceRefreshCallback}.
     */
    void onVidAuthExpired(VidAuth expiredSource, SourceRefreshCallback<VidAuth> callback);
}

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

    /**
     * Dipanggil oleh pemutar saat operasi refresh gagal.
     *
     * @param errorMsg String yang menjelaskan alasan kegagalan.
     *
     * Metode ini menunjukkan bahwa operasi refresh 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.

// Tetapkan 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();

        // ------------------- Mulai 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 pemutar 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 pemutar melalui callback SDK
                sourceRefreshCallback.onError(errorMessage);
            }
        });
        // ------------------- Akhir implementasi pengguna -------------------
    }
});

UrlSource sumber

Contoh operasi API

/**
 * Menetapkan listener untuk event kedaluwarsa sumber URL.
 *
 * Fitur ini memungkinkan refresh URL untuk menghindari gangguan pemutaran yang disebabkan oleh
 * kedaluwarsa URL karena autentikasi. Saat listener dipicu,
 * Anda dapat merefresh 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 konfigurasi autentikasi URL, lihat
 * <a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">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

// Tetapkan listener kedaluwarsa URL pemutar
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, "Refresh 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, "Refresh berhasil, URL baru: " + newAuthUrl);
            // Seperti yang dipersyaratkan oleh SDK, buat objek UrlSource dan tetapkan URL baru
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "Refresh 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

/**
 * Menetapkan skenario pemutar.
 *
 * @param scene 
 */
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 RTS langsung
     */
    RTS_LIVE
}

Petunjuk penggunaan

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

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

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

// Tetapkan 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.

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.

Aktifkan cache lokal

Fitur cache lokal dinonaktifkan secara default. Untuk menggunakannya, Anda harus mengaktifkannya secara manual. Fitur ini dikontrol oleh AliPlayerGlobalSettings melalui enableLocalCache. 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 menyetel 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: Tidak berlaku lagi di V5.4.7.1 ke atas, tidak lagi berpengaruh.
 *  @param localCacheDir: Harus ditetapkan. Direktori untuk file cache lokal, harus berupa jalur mutlak.
 *  AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * Konfigurasi untuk membersihkan file cache lokal.
 * @param expireMin - Tidak berlaku lagi di V5.4.7.1 ke atas, tidak lagi berpengaruh.
 * @param maxCapacityMB - Kapasitas cache maksimum dalam MB. Default adalah 20 GB. Selama pembersihan, jika total ukuran 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)
 */

 /**
  * Tetapkan callback untuk nilai hash URL yang dimuat. Jika tidak ditetapkan, 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.

Aktifkan atau nonaktifkan cache lokal untuk URL tunggal

Jika Anda ingin mengaktifkan atau menonaktifkan fitur cache lokal untuk URL tunggal, Anda dapat menyetelnya di PlayerConfig.

// 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 (ditetapkan ke true), cache lokal untuk URL ini akan berlaku. Jika ditetapkan ke false di sini, cache lokal untuk URL ini dinonaktifkan.
config.mEnableLocalCache = false;
....// Pengaturan lainnya

// Tetapkan konfigurasi untuk pemutar
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("<kredensialPlayAuthAnda>");// Wajib. Kredensial pemutaran, yang perlu dihasilkan dengan memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD.
    vidAuth.setRegion("Wilayah akses");// Untuk SDK pemutar V5.5.5.0 ke atas, parameter ini tidak berlaku lagi. Anda tidak perlu menyetel wilayah, karena pemutar akan mengurai secara otomatis. Untuk versi SDK pemutar sebelum 5.5.5.0, parameter ini wajib. Ini adalah wilayah akses ApsaraVideo VOD, default ke 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("<AccessKeyIdAnda>");// Wajib. ID AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.  vidSts.setAccessKeySecret("<AccessKeySecretAnda>");// Wajib. Rahasia AccessKey token STS sementara, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.  vidSts.setSecurityToken("<tokenKeamananAnda>");// Wajib. Token keamanan STS, yang perlu dihasilkan dengan memanggil operasi API AssumeRole STS.  vidSts.setRegion("Wilayah akses");// Wajib. Wilayah akses ApsaraVideo VOD, default ke 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();
    // Tetapkan bitrate preload untuk aliran multi-bitrate
    preloadConfig.setDefaultBandWidth(400000);
    // Tetapkan resolusi preload untuk aliran multi-bitrate
    preloadConfig.setDefaultResolution(640 * 480);
    // Tetapkan kualitas preload untuk aliran multi-bitrate
    preloadConfig.setDefaultQuality(“FD”);
    // Tetapkan 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 instans MediaLoaderV2
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai preload
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)

    VidSts

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

    UrlSource

    // Buat tugas preload
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // Dapatkan instans MediaLoaderV2
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai preload
    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.
// Tetapkan durasi preload ke 1000 ms.
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// Konfigurasikan jumlah item untuk preload dua arah.
// Preload 1 item ke depan dan 3 item ke belakang.
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 biaya frame pertama dan kelancaran pemutaran. Bitrate video konsisten sebelum dan sesudah switching (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 dari callback onInfo 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 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:

    PrivateService.initService(getApplicationContext(),  "Jalur file tempat encryptedApp.dat berada"); // Kami menyarankan menyimpan file encryptedApp.dat di ponsel dan kemudian menyetel jalur file lokal file enkripsi di sini
  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 objek VidSts.
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("id_video_anda"); // ID video.
      aliyunVidSts.setAccessKeyId("<AccessKeyIdAnda>"); // ID AccessKey token STS sementara. Untuk mendapatkan token, Anda harus memanggil operasi AssumeRole STS.
      aliyunVidSts.setAccessKeySecret("<AccessKeySecretAnda>"); // Rahasia AccessKey token STS sementara. Untuk mendapatkan token, Anda harus memanggil operasi AssumeRole STS.
      aliyunVidSts.setSecurityToken("<tokenKeamananAnda>"); // Token keamanan. Untuk mendapatkan token, Anda harus memanggil operasi AssumeRole STS.
      aliyunVidSts.setRegion("id_wilayah_anda"); // ID wilayah tempat VOD diaktifkan. Nilai default: cn-shanghai.
       // Jika Anda mengaktifkan enkripsi HLS dengan parameter pass-through di konsol VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus menyetel parameter config dan meneruskannya ke objek VidSts. Untuk informasi selengkapnya, lihat kode berikut.
       // Jika Anda tidak mengaktifkan enkripsi HLS dengan parameter pass-through di konsol VOD, Anda tidak perlu mengintegrasikan kode berikut.
       VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
       vidConfig.setMtsHlsUriToken("<MtsHlsUriTokenAnda>");
       aliyunVidSts.setPlayerConfig(vidConfig);
              
      
      // Siapkan sumber unduhan.
      mAliDownloader.prepare(aliyunVidSts);
    • VidAuth

      // Buat objek VidAuth.
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("ID Video Anda");// ID video (VideoId).
      vidAuth.setPlayAuth("<kredensialPlayAuthAnda>");// Kredensial pemutaran. Anda harus memanggil operasi GetVideoPlayAuth layanan VOD untuk menghasilkan kredensial.
      vidAuth.setRegion("Wilayah");// Untuk SDK pemutar V5.5.5.0 ke atas, parameter ini tidak berlaku lagi. Anda tidak perlu menyetel wilayah karena pemutar secara otomatis mengurai wilayah. Untuk SDK pemutar sebelum V5.5.5.0, parameter ini wajib. Ini menentukan wilayah tempat layanan VOD diaktifkan. Nilai default adalah cn-shanghai.
      // Jika Anda mengaktifkan pass-through parameter enkripsi HLS di konsol VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus menyetel config dan meneruskannya ke objek VidAuth. Untuk informasi selengkapnya, lihat kode berikut.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<MtsHlsUriTokenAnda>");
      vidAuth.setPlayerConfig(vidConfig);
      // 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. 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");// Tetapkan 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