All Products
Search
Document Center

ApsaraVideo VOD:Fitur lanjutan

Last Updated:Jun 05, 2026

Gunakan fitur lanjutan Android Player SDK, termasuk pemutaran daftar putar, subtitle, unduhan video, dan pemutaran terenkripsi. Referensi API.

Penting

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

Verifikasi lisensi Edisi Profesional

Catatan

Beberapa fitur pemutar memerlukan lisensi Edisi Profesional. Periksa fitur yang didukung di Detail fitur Player SDK. Untuk menggunakan fitur-fitur ini, selesaikan otorisasi seperti yang dijelaskan di Dapatkan lisensi player SDK.

Tetapkan listener sebelum aplikasi dimulai atau sebelum memanggil 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 mencacahkan fitur profesional. Saat Anda menggunakan fitur terkait, pemutar memverifikasi lisensi dan mengembalikan hasil melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasannya.

Pemutaran

Pemutaran daftar putar

Android Player SDK menyediakan pemutaran daftar putar dengan preload untuk secara signifikan meningkatkan kecepatan startup video pendek.

Prosedur

  1. Buat pemutar.

    Buat instans AliListPlayer menggunakan kelas AliPlayerFactory. Contoh:

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

  2. Opsi: Tetapkan listener.

    Listener bersifat opsional tetapi direkomendasikan. Tanpa listener, Anda tidak dapat menerima notifikasi event. Listener utama: OnPreparedListener, OnErrorListener, OnCompletionListener, OnLoadingStatusListener, dan OnInfoListener.

    Perluas untuk melihat kode

    aliListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            // Pemutaran selesai.
        }
    });
    aliListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // Terjadi kesalahan.
        }
    });
    aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Persiapan berhasil.
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // Resolusi video berubah.
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // Frame pertama dirender.
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // Event informasi lainnya. Jenis mencakup: pemutaran ulang dimulai, posisi buffer, posisi pemutaran saat ini, pemutaran otomatis dimulai, 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 selesai.
        }
    });
    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/video atau definisi berhasil dialihkan.
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // Pengalihan aliran audio/video atau definisi gagal.
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // Status pemutar berubah.
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // Tangkapan layar diambil.
        }
    });
  3. Tetapkan jumlah item yang dipreloads.

    Tetapkan jumlah item yang dipreloads untuk meningkatkan kecepatan startup. Contoh:

    // Tetapkan jumlah item yang dipreloads. Total jumlah item yang dimuat adalah 1 + count × 2.
    aliListPlayer.setPreloadCount(int count);
  4. Tambah atau hapus beberapa sumber pemutaran.

    Pemutaran daftar putar mendukung sumber Vid (VidSts dan VidPlayAuth) dan UrlSource. Contoh:

    • URL: Alamat pemutaran pihak ketiga atau Alibaba Cloud VOD. Untuk mendapatkan alamat pemutaran Alibaba Cloud, panggil GetPlayInfo. Integrasikan VOD server SDK untuk mendapatkan alamat dan hindari penandatanganan sendiri. Portal Developer.

    • Vid: ID audio dan video. Anda dapat memperoleh ID ini dari konsol (jalur: Media Library > Audio/Video) atau menggunakan API server (Cari informasi media) setelah mengunggah audio atau video.

    // 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 secara unik mengidentifikasi video. Video dengan uid yang sama dianggap identik. Jika terjadi pencampuran aliran selama pemutaran, periksa apakah uid yang sama ditetapkan di tampilan berbeda. uid dapat berupa string apa pun.

  5. Tetapkan tampilan.

    Pemutar mendukung SurfaceView dan TextureView. Pilih salah satu:

    • Tetapkan SurfaceView. Contoh:

      Perluas 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);
          }
      });
    • Tetapkan TextureView. Contoh:

      Perluas 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. Contoh:

    Perluas untuk melihat kode

    // Aktifkan autoplay.
    aliListPlayer.setAutoPlay(true);
    
    // Gunakan metode ini untuk sumber URL.
    aliPlayer.moveTo(String uid);
    // Gunakan metode ini untuk sumber Vid. Anda harus meneruskan stsInfo, yang mencakup kredensial sementara STS dan pasangan AccessKey sementara. Dapatkan kredensial ini terlebih dahulu. Untuk informasi lebih lanjut, lihat Buat peran RAM dan lakukan otorisasi sementara STS.
    aliPlayer.moveTo(String uid, StsInfo info);
  7. Putar video sebelumnya atau berikutnya.

    • Setelah memanggil moveTo untuk memutar sumber video, panggil moveToPrev dan moveToNext untuk memutar video sebelumnya atau berikutnya, menggunakan sumber video yang ditentukan oleh moveTo sebagai jangkar. Contoh:

      Catatan

      Saat mengalihkan sumber video dengan memanggil moveTo, moveToNext, atau metode serupa berdasarkan view yang sama, mungkin terjadi kedipan atau layar hitam. Dalam kasus ini, saat menginisialisasi listPlayer, konfigurasikan bidang PlayerConfig mClearFrameWhenStop menjadi false dan panggil setConfig untuk menerapkan pengaturan.

      Perluas untuk melihat kode

      // Aktifkan autoplay.
      aliListPlayer.setAutoPlay(true);
      
      // Pindah ke video berikutnya. Catatan: Metode ini hanya berlaku untuk sumber URL dan tidak untuk pemutaran Vid.
      aliListPlayer.moveToNext();
      // Pindah ke video sebelumnya. Catatan: Metode ini hanya berlaku untuk sumber URL dan tidak 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 pemutaran daftar putar yang lebih baik, gunakan solusi drama pendek. Pengembangan klien drama pendek.

Pemutaran video dengan transparansi

Ikhtisar fitur

ApsaraVideo Player SDK mendukung rendering saluran alfa untuk animasi hadiah transparan. Dalam skenario streaming langsung, animasi ini diputar tanpa menghalangi konten langsung.

Batasan

SDK terintegrasi versi 6.8.0 atau lebih baru, atau Player SDK versi 6.9.0 atau lebih baru, mendukung rendering transparan.

Manfaat

Video MP4 dengan transparansi menawarkan kualitas animasi lebih baik, ukuran file lebih kecil, kompatibilitas lebih tinggi, dan efisiensi pengembangan lebih baik dibandingkan APNG atau IXD.

  1. Kualitas animasi lebih baik: MP4 mempertahankan detail dan warna asli lebih akurat daripada APNG atau IXD.

  2. Ukuran file lebih kecil: MP4 melakukan kompresi lebih efisien, meningkatkan kecepatan pemuatan dan mengurangi konsumsi bandwidth.

  3. Kompatibilitas lebih tinggi: MP4 didukung secara universal di berbagai perangkat dan browser.

  4. Efisiensi pengembangan lebih tinggi: Developer tidak perlu mengimplementasikan logika parsing dan rendering yang kompleks.

Kode contoh

Tambahkan antarmuka berikut: Tetapkan mode alfa (posisi saluran alfa dalam aset video: atas, bawah, kiri, kanan). Nilai default adalah None.

Catatan
  • Posisi saluran alfa dalam aset harus sesuai dengan pengaturan parameter setAlphaRenderMode.

  • Ukuran playerview harus proporsional dengan resolusi aset.

/**
 * Tetapkan mode render alfa.
 *
 * @param alphaRenderMode Mode render alfa yang ditentukan. Lihat {@link AlphaRenderMode}.
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------Penggunaan View-------------
// Untuk View, transparansi harus ditetapkan.
//TextureView
TextureView aliplayerView; // View yang digunakan untuk pemutaran.
aliplayerView.setOpaque(false);

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

//-----------Penggunaan AliPlayer-----------
// Tetapkan mode alfa.
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// Tetapkan aset yang sesuai dengan mode alfa.
UrlSource urlSource = new UrlSource();
urlSource.setUri("https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%E6%A0%B7%E6%9C%AC/alpha%E9%80%9A%E9%81%93/alpha_right.mp4");
aliPlayer.setDataSource(urlSource);
aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
    @Override
    public void onCompletion() {
        // Opsional: Jika terjadi masalah transisi setelah pemutaran instans tunggal selesai, bersihkan layar.
        aliPlayer.clearScreen();
    }
}
aliPlayer.setAutoPlay(true);
aliPlayer.prepare();

Subtitle eksternal

Catatan

Untuk contoh kode terperinci, lihat modul API-Example Demonstrasi dan pengalihan subtitle eksternal (ExternalSubtitle). Proyek contoh berbasis Java ini untuk ApsaraVideo Player SDK untuk Android membantu developer menguasai fitur integrasi inti SDK dengan cepat.

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

  1. Buat tampilan untuk menampilkan subtitle.

    Buat tampilan berbeda berdasarkan format subtitle.

    Perluas untuk melihat kode

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

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

    // Diperlukan untuk player 7.6.0 dan 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

    Tetapkan file subtitle dalam callback onPrepared.

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

    Perluas untuk melihat kode

    mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
                @Override
                public void onSubtitleExtAdded(int trackIndex, String url) {
                    // trackIndex: indeks subtitle; true: tampilkan subtitle; false: sembunyikan subtitle.
                    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) {
                }
            }
        );

Subtitle eksternal (rendering kustom berdasarkan komponen rendering)

Dukungan penuh untuk subtitle eksternal WebVTT diimplementasikan menggunakan VttSubtitleView dan WebVttResolver, memungkinkan kustomisasi fleksibel ukuran font, warna, dan font tertentu untuk subtitle.

Catatan

Skenario penerapan:

  • Menyesuaikan gaya subtitle WebVTT.

  • Mengintegrasikan ApsaraVideo Player SDK versi 7.11.0 atau lebih baru.

Penting

Prasyarat:

  • File font (.ttf) ditempatkan di direktori assets/fonts/ proyek Anda.

  • minSdk proyek ≥ 21 (direkomendasikan).

  • Listener subtitle ditambahkan dan konten WebVTT dapat diperoleh.

  1. Buat CustomStyleWebVttResolver dan implementasikan WebVttResolver.

    public class CustomStyleWebVttResolver extends WebVttResolver {
    
        // Implementasikan metode pembuatan.
        public CustomStyleWebVttResolver(Context context) {
            super(context);
            // Inisialisasi font dan sumber daya lainnya di sini nanti.
        }
    }
  2. Override applyTextSpans untuk menyesuaikan gaya.

    Metode ini dipanggil setelah kelas induk mengurai gaya dasar, memungkinkan pemrosesan sekunder subtitle.

    • Metode 1: Modifikasi VttContentAttribute dan panggil metode kelas induk.

      /**
       * Override logika penerapan gaya teks untuk mengimplementasikan efek gaya kustom.
       * Metode ini dipanggil setelah kelas induk mengurai gaya dasar, memungkinkan pemrosesan sekunder ukuran font, warna, dan atribut lainnya.
       *
       * @param spannableStringBuilder Digunakan untuk membangun teks bergaya.
       * @param vttContentAttribute Objek atribut gaya untuk segmen teks saat ini (termasuk font, warna, ukuran, dll.).
       * @param start Posisi awal untuk penerapan gaya (inklusif).
       * @param end Posisi akhir untuk penerapan gaya (eksklusif).
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // Tetapkan.
          // Simpan ukuran font asli (dalam px) untuk penyesuaian nanti.
          // Ukuran font default adalah 0,0533f kali tinggi video.
          double originalFontSizePx = vttContentAttribute.fontSizePx;
      
          // Gandakan ukuran font.
          vttContentAttribute.fontSizePx = originalFontSizePx * 2;
          
          // Ubah warna font menjadi merah.
          vttContentAttribute.mPrimaryColour = Color.argb(255, 255, 0, 0);
      
          // Panggil metode kelas induk untuk menerapkan teks.
          super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end);
      }
    • Langsung operasikan SpannableStringBuilder untuk memodifikasi gaya WebVTT secara langsung.

      Penting

      Metode ini dapat menyebabkan hilangnya gaya WebVTT asli.

      /**
       * Override logika penerapan gaya teks untuk mengimplementasikan efek gaya kustom.
       * Metode ini dipanggil setelah kelas induk mengurai gaya dasar, memungkinkan pemrosesan sekunder ukuran font, warna, dan atribut lainnya.
       *
       * @param spannableStringBuilder Digunakan untuk membangun teks bergaya.
       * @param vttContentAttribute Objek atribut gaya untuk segmen teks saat ini (termasuk font, warna, ukuran, dll.).
       * @param start Posisi awal untuk penerapan gaya (inklusif).
       * @param end Posisi akhir untuk penerapan gaya (eksklusif).
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // Tetapkan warna font.
          spannableStringBuilder.setSpan(
              new ForegroundColorSpan(Color.RED),
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // Tetapkan ukuran absolut.
          spannableStringBuilder.setSpan(
              new AbsoluteSizeSpan(20), // Satuan: px.
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // Tetapkan ukuran relatif.
          // spannableStringBuilder.setSpan(
          //     new RelativeSizeSpan(2.0f), // Kelipatan ukuran font default TextView.
          //     start, end,
          //     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          // );
      }
  3. Tetapkan font kustom (Typeface).

    1. Muat font kustom dari direktori asset/fonts/.

      private Typeface mTypeface;
      
      public CustomStyleWebVttResolver(Context context) {
          super(context);
          initializeFonts(context);
      }
      
      private void initializeFonts(Context context) {
          try {
              // Muat font dari assets/fonts/.
              mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/LongCang.ttf");
          } catch (Exception e) {
              Log.e("Font", "Gagal memuat font", e);
              mTypeface = Typeface.DEFAULT; // Cadangan aman.
          }
      }
    2. Terapkan font kustom ke subtitle.

      @Override
      protected void applyTextSpans(SpannableStringBuilder builder, VttContentAttribute attr, int start, int end) {
          // Terapkan font kustom.
          // Harus ditempatkan setelah super.applyTextSpans() untuk mengganti font yang mungkin ditetapkan oleh kelas induk.
          // Memanggil super.applyTextSpans() bersifat opsional.
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
              builder.setSpan(new TypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
          } else {
              builder.setSpan(new CustomTypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
          }
      }

      Kompatibilitas dengan versi Android lama: Karena TypefaceSpan di Android P (API 28) dan sebelumnya tidak mendukung langsung melewatkan objek Typeface, Anda perlu membuat MetricAffectingSpan kustom.

      /**
        * Kelas Typeface Span kustom.
        * Mewarisi dari MetricAffectingSpan untuk menerapkan Typeface dengan benar selama penggambaran dan pengukuran teks.
        * Menyelesaikan masalah di mana TypefaceSpan standar tidak dapat langsung menggunakan objek Typeface.
      */
      private static class CustomTypefaceSpan extends MetricAffectingSpan {
      
          // Font kustom yang akan diterapkan.
          private final Typeface typeface;
      
          /**
            * Konstruktor.
            *
            * @param typeface Objek Typeface yang akan diterapkan (tidak boleh null).
            */
          public CustomTypefaceSpan(Typeface typeface) {
              this.typeface = typeface;
          }
      
          /**
            * Perbarui status penggambaran teks.
            * Dipanggil selama penggambaran teks aktual untuk menetapkan font cat.
            *
            * @param tp Objek TextPaint yang digunakan untuk menggambar teks.
            */
          @Override
          public void updateDrawState(TextPaint tp) {
              tp.setTypeface(typeface);
          }
      
          /**
            * Perbarui status pengukuran teks.
            * Dipanggil selama perhitungan tata letak teks (misalnya, lebar, jeda baris) untuk memastikan pengukuran sesuai dengan penggambaran aktual.
            *
            * @param p Objek TextPaint yang digunakan untuk mengukur teks.
            */
          @Override
          public void updateMeasureState(TextPaint p) {
              p.setTypeface(typeface);
          }
      }
  4. Integrasikan dengan pemutar.

    1. Inisialisasi tampilan subtitle.

      // Inisialisasi subtitleView.
      private void initSubtitleView() {
          // Dapatkan konteks.
          Context context = getContext();
      
          // Buat CustomStyleWebVttResolver.
          CustomStyleWebVttResolver mResolver = new CustomStyleWebVttResolver(context);
      
          // Buat VttSubtitleView dan teruskan CustomStyleWebVttResolver.
          VttSubtitleView mVttSubtitleView = new VttSubtitleView(context, mResolver);
      
          // Tambahkan ke wadah video.
          rootView.addView(mVttSubtitleView);
      }
    2. Ikat callback subtitle eksternal.

      // Tetapkan listener subtitle.
      mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
          @Override
          public void onSubtitleExtAdded(int trackIndex, String url) {
              mAliPlayer.selectExtSubtitle(trackIndex, true);
          }
      
          @Override
          public void onSubtitleShow(int trackIndex, long id, String data) {
              if (mVttSubtitleView != null) {
                  // Tampilkan subtitle.
                  mVttSubtitleView.show(id, data); 
              }
          }
      
          @Override
          public void onSubtitleHide(int trackIndex, long id) {
              // Sembunyikan subtitle.
              mVttSubtitleView.dismiss(id);
          }
      
          @Override
          public void onSubtitleHeader(int i, String header) {
              if (!TextUtils.isEmpty(header)) {
                  // Terapkan gaya header WebVTT.
                  mVttSubtitleView.setVttHeader(header);
              }
          }
      });

Pemutaran hanya audio

Nonaktifkan pemutaran video untuk mencapai pemutaran hanya audio. Konfigurasikan PlayerConfig sebelum memanggil prepare.

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

Pengalihan decoder perangkat lunak/perangkat keras

Catatan

Alihkan metode decoding sebelum pemutaran dimulai. Pengalihan selama pemutaran tidak berpengaruh.

Android Player SDK menyediakan decoding perangkat keras H.264 dan H.265 dengan sakelar enableHardwareDecoder. Decoding perangkat keras diaktifkan secara default dan secara otomatis kembali ke decoding perangkat lunak jika inisialisasi gagal. Contoh:

// Aktifkan decoding perangkat keras. Diaktifkan secara default.
aliPlayer.enableHardwareDecoder(true);

Jika pemutar secara otomatis beralih dari decoding perangkat keras ke perangkat lunak, hal ini memicu callback onInfo. Contoh:

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

Pemutaran adaptif H.265

Jika perangkat berada dalam daftar hitam decoding perangkat keras H.265 berbasis cloud atau decoding perangkat keras H.265 gagal, degradasi adaptif dipicu: jika ada aliran cadangan H.264, pemutar menggunakannya; jika tidak, pemutar menurunkan ke decoding perangkat lunak H.265.

Catatan
  • Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah decoding adaptif terintegrasi klien-cloud. Anda perlu mengirimkan formulir Yida untuk mengajukan otorisasi lisensi.

  • Layanan bernilai tambah decoding adaptif terintegrasi klien-cloud mencakup: 1. Pengiriman dinamis data kompatibilitas decoding perangkat keras berbasis cloud; 2. Degradasi adaptif aliran H.265 ke aliran H.264.

  • SDK tetap memiliki kemampuan untuk secara otomatis beralih ke decoding perangkat lunak saat decoding perangkat keras gagal, bahkan tanpa mengaktifkan layanan bernilai tambah.

    Contoh pengaturan aliran cadangan:

// Pertahankan Map di lapisan aplikasi untuk menyimpan pasangan kunci-nilai URL asli dan URL cadangan. Saat beralih, kueri URL cadangan dalam 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 "";
        }
    }
});

Pengalihan definisi video adaptif berbasis jaringan

Catatan
  • Aliran video bitrate adaptif HLS dapat dihasilkan melalui kelompok template pengemasan dan transkoding video di ApsaraVideo VOD. Untuk operasi terperinci, lihat Konfigurasi bitrate adaptif untuk VOD.

  • Untuk aliran adaptif yang dihasilkan oleh transkoding ApsaraVideo VOD, jika Anda menggunakan pemutaran Vid, Anda harus menentukan daftar definisi pemutaran default sebagai DEFINITION_AUTO untuk mendapatkan dan memutar aliran video adaptif. Jika tidak, pemutar memilih aliran video definisi rendah sesuai logika default. Untuk urutan pemutaran definisi default, lihat Definisi mana yang diputar oleh player SDK secara default saat beberapa definisi ditranskode?. Contoh penentuan daftar definisi untuk pemutaran VidAuth:

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

Android player SDK mendukung aliran video bitrate adaptif HLS dan DASH. Setelah prepare berhasil, Anda dapat memperoleh informasi tentang setiap aliran bitrate, yaitu TrackInfo, dengan memanggil getMediaInfo. Contoh:

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

Selama pemutaran, Anda dapat mengalihkan aliran bitrate yang sedang diputar dengan memanggil metode selectTrack pemutar. Saat nilainya AUTO_SELECT_INDEX, hal ini mengaktifkan pengalihan bitrate adaptif. Contoh:

int index = trackInfo.getIndex();
// Alihkan bitrate.
aliPlayer.selectTrack(index);
// Alihkan bitrate dan aktifkan pengalihan adaptif.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

Hasil pengalihan dikembalikan melalui callback OnTrackChangedListener (tetapkan sebelum memanggil selectTrack). Contoh:

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

Opsi: Sebelum memanggil metode selectTrack pemutar untuk beralih ke bitrate adaptif, Anda dapat menetapkan batas atas untuk pengalihan bitrate adaptif (ABR) dalam konfigurasi untuk menghindari pengalihan otomatis ke bitrate yang tidak diinginkan. Contoh: (Kami merekomendasikan memanggil kode berikut sebelum pemutar memanggil metode prepare atau sebelum pemutar daftar putar memanggil metode moveTo agar berlaku.)

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

Tangkapan layar

Android player SDK menyediakan fitur tangkapan layar untuk video saat ini, diimplementasikan oleh antarmuka snapshot. Fitur ini menangkap data asli dan mengembalikannya sebagai bitmap. Antarmuka callback adalah OnSnapShotListener. Contoh:

// Tetapkan callback tangkapan layar.
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // Dapatkan bitmap dan dimensi gambar.
    }
});
// Tangkap frame pemutaran saat ini.
aliPlayer.snapshot();

Pemutaran pratinjau

Dengan mengonfigurasi ApsaraVideo VOD, Android player SDK dapat mengimplementasikan pemutaran pratinjau, mendukung metode pemutaran VidSts dan VidAuth (VidAuth direkomendasikan untuk VOD). Untuk instruksi konfigurasi dan penggunaan, lihat Pratinjau video.

Setelah mengonfigurasi pemutaran pratinjau, tetapkan durasi pratinjau untuk pemutar menggunakan metode VidPlayerConfigGen.setPreviewTime(). 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 hanya mengembalikan konten dalam periode pratinjau alih-alih video lengkap saat diputar melalui Android player SDK.

Catatan
  • VidPlayerConfigGen mendukung parameter permintaan server. Deskripsi parameter permintaan.

  • Format video FLV dan MP3 tidak mendukung pemutaran pratinjau.

Tetapkan daftar hitam

Android player SDK menyediakan mekanisme daftar hitam decoding perangkat keras. Untuk perangkat yang secara eksplisit tidak dapat menggunakan decoding perangkat keras, decoding perangkat lunak digunakan secara langsung untuk menghindari operasi yang tidak efektif. Contoh:

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

Daftar hitam secara otomatis tidak berlaku setelah aplikasi keluar.

Tetapkan Referer

Tetapkan Referer permintaan menggunakan PlayerConfig. Dikombinasikan dengan daftar hitam/daftar putih Referer di konsol, hal ini mengontrol izin akses. Contoh:

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Tetapkan referer, misalnya: http://example.aliyundoc.com. (Catatan: Sertakan bagian protokol saat menetapkan referer.)
config.mReferrer = referrer;
....// Pengaturan lainnya.
  // Tetapkan konfigurasi untuk pemutar.
aliPlayer.setConfig(config);

Tetapkan UserAgent

Tetapkan UserAgent permintaan menggunakan PlayerConfig. Pemutar menyertakan UA dalam permintaan. Contoh:

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Tetapkan UA.
config.mUserAgent = "UserAgent yang akan ditetapkan";
....// Pengaturan lainnya.
  // Tetapkan konfigurasi untuk pemutar.
aliPlayer.setConfig(config);

Konfigurasi waktu dan jumlah percobaan ulang jaringan

Tetapkan waktu habis jaringan dan jumlah percobaan ulang menggunakan PlayerConfig. Contoh:

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Tetapkan durasi waktu habis jaringan, dalam milidetik.
config.mNetworkTimeout = 5000;
// Tetapkan jumlah percobaan ulang waktu habis. Interval antar 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 NetworkRetryCount ditetapkan dan masalah jaringan menyebabkan pemuatan, pemutar mencoba ulang sebanyak NetworkRetryCount kali, dengan setiap interval sebesar mNetworkTimeout.

  • Jika status pemuatan berlanjut setelah beberapa percobaan ulang, event onError dipicu, dengan ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT.

  • Jika NetworkRetryCount ditetapkan ke 0, saat waktu habis percobaan ulang jaringan, pemutar memicu event onInfo, dengan InfoBean.getCode()=InfoCode.NetworkRetry. Pada titik ini, Anda dapat memanggil metode reload pemutar untuk memuat ulang jaringan atau menanganinya dengan cara lain.

Konfigurasi kontrol cache dan latensi

Android player SDK menyediakan antarmuka untuk mengontrol cache dan latensi melalui PlayerConfig. Contoh:

Perluas untuk melihat kode

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Latensi maksimum. Catatan: Berlaku untuk streaming langsung. Saat latensi besar, SDK pemutar secara internal menyinkronkan frame untuk menjaga latensi dalam rentang ini.
config.mMaxDelayTime = 5000;
// Durasi buffer maksimum, dalam ms. Pemutar memuat hingga durasi data buffer ini setiap kali.
config.mMaxBufferDuration = 50000;
// Durasi buffer tinggi, dalam ms. Saat kondisi jaringan buruk menyebabkan pemuatan data, pemuatan berhenti saat durasi buffer mencapai nilai ini.
config.mHighBufferDuration = 3000;
// Durasi buffer startup, dalam ms. Durasi lebih pendek berarti startup lebih cepat tetapi dapat menyebabkan masuk cepat ke status pemuatan 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
  • Durasi buffer harus memenuhi: mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration.

  • Jika mMaxBufferDuration melebihi 5 menit, sistem default ke 5 menit untuk mencegah pengecualian memori yang disebabkan oleh ukuran buffer berlebihan.

Tetapkan header HTTP

Menggunakan metode PlayerConfig, Anda dapat menambahkan parameter header HTTP ke permintaan dalam pemutar. Contoh:

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Definisikan header.
String[] headers = new String[1];
headers[0]="Host:example.com";// Misalnya, tetapkan Host dalam header.
// Tetapkan header.
config.setCustomHeaders(headers);
....// Pengaturan lainnya.
  // Tetapkan konfigurasi untuk pemutar.
aliPlayer.setConfig(config);

Gambar-dalam-Gambar

Catatan

Untuk contoh kode terperinci, lihat modul API-Example Pemutaran Gambar-dalam-Gambar (PictureInPicture). Proyek contoh berbasis Java ini untuk ApsaraVideo Player SDK untuk Android membantu developer menguasai fitur integrasi inti SDK dengan cepat.

Prosedur:

  1. Dalam file AndroidManifest.xml, deklarasikan izin Gambar-dalam-Gambar.

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

    Rational aspectRatio = new Rational(16, 9); // Rasio aspek untuk Gambar-dalam-Gambar; sesuaikan berdasarkan kebutuhan bisnis Anda.
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    Anda dapat memicu mode Gambar-dalam-Gambar dari OnClick (event klik), saat meninggalkan aplikasi, atau saat kembali ke aplikasi. Metode implementasi:

    Pemicu OnClick (event klik)

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

    Pemicu saat meninggalkan aplikasi

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

    Pemicu saat kembali ke aplikasi

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // Picu dari tombol kembali.
        enterPictureInPictureMode();
    }
  3. Tangani UI untuk tampilan/penghilangan Gambar-dalam-Gambar.

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

Degradasi RTS langsung

Catatan

Untuk contoh kode terperinci, lihat modul API-Example Pemutaran langsung RTS ultra-latensi rendah (RtsLiveStream). Proyek contoh berbasis Java ini untuk ApsaraVideo Player SDK untuk Android membantu developer menguasai fitur integrasi inti SDK dengan cepat.

Pemutaran langsung RTS.

Alihkan saluran audio kiri/kanan

Android player SDK menyediakan metode setOutputAudioChannel untuk menetapkan saluran audio output. Jika sumber input adalah stereo, Anda dapat beralih ke saluran kiri atau kanan menggunakan metode ini. Jika sumber input adalah mono, pengaturan tidak berpengaruh.

Catatan

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

/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT beralih ke pemutaran saluran kiri,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT beralih ke pemutaran saluran kanan,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE tidak mengalihkan saluran, mempertahankan saluran sumber input.
*/
aliPlayer.setOutputAudioChannel();

Urai aliran audio

Tetapkan listener untuk memperoleh data aliran audio dan video. Aliran tidak boleh dienkripsi, karena aliran terenkripsi tidak dapat diuraikan.

Perluas untuk melihat kode

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

// Konfigurasi opsional 2: Untuk decoding perangkat keras, RenderFrame mengembalikan texture_oes_id; untuk decoding perangkat lunak, RenderFrame mengembalikan data sumber.
aliPlayer.enableHardwareDecoder(true);
// Tetapkan listener untuk memperoleh data audio dan video.
aliPlayer.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // Data video.
    } else {
        // Data audio.
    }
    return false;
});

Tetapkan warna latar belakang video

Android player SDK mendukung penyetelan warna latar belakang untuk rendering pemutar. Antarmuka dan instruksi penggunaan:

Contoh antarmuka

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

Instruksi penggunaan

// Parameter adalah nilai heksadesimal 8 digit. Setiap pasang digit mewakili A (transparansi alfa), R (merah), G (hijau), B (biru) secara berurutan.
// Misalnya, 0x0000ff00 merepresentasikan hijau.
aliPlayer.setVideoBackgroundColor(0x0000ff00);

vidAuthTetapkan domain pemutaran tertentu

Menggunakan vidAuth, Anda dapat menentukan bidang seperti domain untuk vid. Untuk bidang yang didukung, lihat Parameter permintaan GetPlayInfo. Antarmuka dan instruksi penggunaan:

Contoh antarmuka

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

Instruksi penggunaan

Gunakan metode addPlayerConfig dari VidPlayerConfigGen untuk menambahkan bidang playDomain.

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

Plugin dekoding H.266

H.266 (VVC/Versatile Video Coding) adalah standar pengkodean video generasi berikutnya yang secara signifikan mengurangi bitrate pada kualitas setara. Kemampuan decoding H.266 dikemas secara independen sebagai plugin untuk integrasi sesuai permintaan.

Prasyarat

  1. Versi Player/integrated SDK V7.6.0 atau lebih baru.

  2. Otorisasi lisensi Edisi Profesional telah diselesaikan. Dapatkan lisensi player SDK.

  3. ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung video H.266 yang ditranskode oleh transkoding audio dan video ApsaraVideo VOD.

Integrasikan plugin

Player SDK

Integrasi Maven (direkomendasikan)

Tambahkan dependensi untuk versi plugin tertentu di file build.gradle aplikasi Anda:

Catatan

Untuk versi terbaru Android player SDK, lihat Riwayat rilis Android SDK.

// x.x.x sesuai dengan nomor versi player SDK.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

Integrasi lokal

Unduh Android player SDK terbaru dan salin paket AlivcVVCCodec ke direktori libs proyek Anda (buat secara manual jika belum ada). Untuk detailnya, lihat Integrasi lokal.

Integrated SDK

Integrasi Maven

Tambahkan dependensi untuk versi plugin tertentu di file build.gradle aplikasi Anda:

// x.x.x sesuai dengan nomor versi integrated SDK.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

Aktifkan plugin

Catatan

Mulai dari Android player SDK 7.7.0, plugin diaktifkan secara default setelah integrasi dan tidak memerlukan aktivasi manual.

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

Kode kesalahan terkait

Untuk kode kesalahan plugin decoding H.266, lihat Masalah umum untuk pemutar di semua platform.

Pembaruan otomatis sumber pemutaran

Mengaktifkan pembaruan otomatis untuk sumber pemutaran mencegah gangguan pemutaran yang disebabkan oleh kedaluwarsa sumber di bawah mekanisme autentikasi.

Prasyarat

  1. Versi Player/integrated SDK V7.9.0 atau lebih baru.

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

Sumber VidAuth

Contoh antarmuka

/**
 * Tetapkan listener untuk event kedaluwarsa sumber VidAuth.
 *
 * Fitur ini mengaktifkan pembaruan otomatis sumber VidAuth untuk menghindari gangguan pemutaran
 * yang disebabkan oleh kedaluwarsa. Saat listener dipicu, Anda dapat memperbarui 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.
     *
     * Anda dapat memperbarui 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 pembaruan sumber pemutaran.
 *
 * Antarmuka ini berlaku untuk jenis sumber pemutaran yang memerlukan pembaruan dinamis,
 * seperti sumber URL atau sumber VidAuth. Saat pemutar memicu permintaan pembaruan,
 * hasil pembaruan dapat dikembalikan melalui antarmuka ini dengan memanggil metode `onSuccess` atau `onError`.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Dipanggil oleh pemutar saat operasi pembaruan berhasil.
     *
     * @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui. Lihat {@link SourceBase}.
     *
     * Metode ini menunjukkan bahwa operasi pembaruan berhasil diselesaikan. Developer harus memberikan
     * sumber pemutaran baru dalam metode ini agar pemutar dapat memuat sumber daya terbaru.
     */
    void onSuccess(T newSource);

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

Instruksi penggunaan

Dapatkan kredensial pemutaran video menggunakan API GetVideoPlayAuth. Kami merekomendasikan mengintegrasikan VOD server SDK untuk mendapatkan kredensial dan menghindari penandatanganan sendiri. Untuk informasi lebih lanjut, lihat portal OpenAPI.

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

        // ------------------- Implementasi pengguna dimulai -------------------
        // Panggil fungsi Anda sendiri untuk mendapatkan PlayAuth baru dari server aplikasi Anda.
        // clinetGetPlayAuthFunction adalah nama fungsi contoh; ganti dengan implementasi Anda sendiri.
        clinetGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * Callback saat kredensial baru berhasil diperoleh.
             * @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. Kembalikan objek yang diperbarui ke pemutar melalui callback SDK.
                sourceRefreshCallback.onSuccess(vidAuth);
            }

            /**
             * Callback saat memperoleh kredensial baru gagal.
             * @param errorMessage Pesan kesalahan terperinci.
             */
            @Override
            public void onAuthError(String errorMessage) {                
                // Kembalikan pesan kesalahan ke pemutar melalui callback SDK.
                sourceRefreshCallback.onError(errorMessage);
            }
        });
        // ------------------- Implementasi pengguna berakhir -------------------
    }
});

UrlSource sumber

Contoh antarmuka

/**
 * Tetapkan listener untuk event kedaluwarsa sumber URL.
 *
 * Fitur ini mengaktifkan pembaruan URL untuk menghindari gangguan pemutaran yang disebabkan oleh
 * kedaluwarsa URL karena autentikasi. Saat listener dipicu,
 * Anda dapat memperbarui 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 lebih lanjut tentang mengonfigurasi 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 pembaruan sumber pemutaran.
 *
 * Antarmuka ini berlaku untuk jenis sumber pemutaran yang memerlukan pembaruan dinamis,
 * seperti sumber URL atau sumber VidAuth. Saat pemutar memicu permintaan pembaruan,
 * hasil pembaruan dapat dikembalikan melalui antarmuka ini dengan memanggil metode `onSuccess` atau `onError`.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Dipanggil oleh pemutar saat operasi pembaruan berhasil.
     *
     * @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui. Lihat {@link SourceBase}.
     *
     * Metode ini menunjukkan bahwa operasi pembaruan berhasil diselesaikan. Developer harus memberikan
     * sumber pemutaran baru dalam metode ini agar pemutar dapat memuat sumber daya terbaru.
     */
    void onSuccess(T newSource);

    /**
     * Dipanggil oleh pemutar saat operasi pembaruan gagal.
     *
     * @param errorMsg String yang menjelaskan alasan kegagalan.
     *
     * Metode ini menunjukkan bahwa operasi pembaruan 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 pemutar mendeteksi bahwa sumber URL (UrlSource) telah kedaluwarsa.
     *
     * Anda dapat memperbarui 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 pembaruan yang digunakan untuk mengembalikan UrlSource yang diperbarui ke pemutar. Lihat {@link SourceRefreshCallback}.
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

Instruksi 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, "Pembaruan gagal: Kunci autentikasi kosong.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Kunci autentikasi tidak ada.");
            return; // Keluar lebih awal jika kunci tidak valid.
        }

        // 2. Hitung durasi validitas (waktu kedaluwarsa) untuk URL 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 autentikasi tipe A sebagai contoh).
        // Kembalikan alamat sumber asli dengan menghapus parameter URL (misalnya, "?auth_key=").
        int authKeyIndex = expiredUrl.indexOf("?auth_key=");
        if (authKeyIndex == -1) {
            authKeyIndex = expiredUrl.indexOf("&auth_key=");
        }
        // Tangani dengan aman kasus di mana auth_key tidak ditemukan.
        String originalUrl = (authKeyIndex != -1) ? expiredUrl.substring(0, authKeyIndex) : expiredUrl;

        // 4. Hasilkan URL terautentikasi baru menggunakan kelas utilitas.
        String newAuthUrl = CdnAuthUtil.aAuth(originalUrl, authenticationKey, newExpireTime);

        // 5. Periksa URL terautentikasi yang dihasilkan dan kembalikan hasil melalui callback.
        if (newAuthUrl != null && !newAuthUrl.isEmpty()) {
            Log.i(TAG, "Pembaruan berhasil, URL baru: " + newAuthUrl);
            // Buat objek UrlSource seperti yang diperlukan oleh SDK dan tetapkan URL baru.
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "Pembaruan gagal: Gagal menghasilkan URL terotorisasi baru.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Gagal menghasilkan URL baru.");
        }
    }
});

Fungsi utilitas tambahan

Menggunakan autentikasi tipe A sebagai contoh.

Fungsi utilitas tambahan

// Fungsi pembuatan URL terautentikasi.
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 perhitungan 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);
    }
}

Alihkan NIC terikat

Android player SDK menyediakan metode AliPlayerGlobalSettings.enableSwitchNIC untuk secara otomatis mengalihkan NIC selama anomali jaringan, memastikan pemutaran sumber daya yang stabil. Contoh:

Catatan

Ini hanya berlaku saat sakelar diaktifkan dan beberapa NIC ada.

AliPlayerGlobalSettings.enableSwitchNIC(true);

Peningkatan audio

Android player SDK menyediakan plugin peningkatan audio untuk meningkatkan pengalaman pemutaran audio, dengan fitur normalisasi volume, peningkatan suara, dan suara surround.

Pengenalan fitur

  • Normalisasi volume: Secara otomatis menyesuaikan semua konten audio ke tingkat volume yang konsisten, secara signifikan meningkatkan pengalaman pemutaran untuk video dengan volume asli terlalu rendah atau terlalu tinggi.

    • Saluran yang didukung: Mono / Stereo / 5.1 / 7.1.

    • Laju sampel yang didukung: 16kHz / 44.1kHz / 48kHz.

  • Peningkatan suara: Secara cerdas meningkatkan dialog sambil mempertahankan timbre asli, membuat suara lebih jelas dan cerah dalam adegan bising.

    • Saluran yang didukung: Stereo.

    • Laju sampel yang didukung: 44.1kHz / 48kHz.

  • Suara surround: Menerapkan rendering surround virtual ke video multi-saluran dan stereo, memberikan pengalaman imersif pada headphone atau perangkat standar. Termasuk mode 3DSurround (surround stereo) dan MegaBass (bass super).

    • Saluran yang didukung: Mono / Stereo / 5.1 / 7.1.

    • Laju sampel yang didukung: 44.1kHz / 48kHz.

Prasyarat

  1. Versi Player/integrated SDK V7.13.0 atau lebih baru.

  2. Otorisasi Lisensi Edisi Profesional diperoleh. Dapatkan lisensi player SDK.

Penting

Dukungan sumber audio untuk peningkatan audio:

Integrasikan plugin

Integrasi Maven (direkomendasikan)

Tambahkan dependensi untuk versi plugin tertentu di file build.gradle aplikasi Anda:

Catatan

Untuk versi terbaru Android player SDK, lihat Riwayat rilis Android SDK.

// x.x.x sesuai dengan nomor versi player SDK.
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'

Integrasi lokal

Unduh Android player SDK terbaru dan salin paket AlivcAudioEnhanceFilter ke direktori libs proyek Anda (buat secara manual jika belum ada). Untuk detailnya, lihat Integrasi lokal.

Antarmuka fitur

setFilterValid

Mengontrol sakelar utama untuk peningkatan audio. Nama target untuk filter peningkatan audio adalah audioEnhance. Saat dinonaktifkan, ketiga sub-fitur tidak aktif (dinonaktifkan secara default).

player.setFilterValid("audioEnhance", true);   // Aktifkan.
player.setFilterValid("audioEnhance", false);  // Nonaktifkan.
setFilterConfig

Tetapkan FilterConfig sebelum prepare. Ini berlaku setelah pemutaran dimulai.

FilterConfig filterConfig = new FilterConfig();
FilterConfig.Filter filterItem = new FilterConfig.Filter("audioEnhance");
FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
// Suara surround.
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // Jenis harus ditetapkan bersama dengan enable_surround saat pertama kali digunakan.
// Peningkatan suara.
opts.setOption("enable_dialoguenhance", true);
opts.setOption("dialoguenhance_voice", 1.0f); // 1.0 ~ 10.0. Suara harus ditetapkan bersama dengan enable_dialoguenhance saat pertama kali digunakan.
// Normalisasi volume.
opts.setOption("enable_normalizer", true);

filterItem.setOptions(opts);
filterConfig.addFilter(filterItem);
player.setFilterConfig(filterConfig);

Parameter

Jenis

Deskripsi

enable_surround

Boolean

Sakelar fitur suara surround.

surround_effect_type

String

Jenis suara surround: "3DSurround" / "MegaBass".

enable_dialoguenhance

Boolean

Sakelar fitur peningkatan suara.

dialoguenhance_voice

Float

Kekuatan peningkatan suara, rentang 1.0 ~ 10.0.

enable_normalizer

Boolean

Sakelar fitur normalisasi volume.

updateFilterConfig

Selama atau setelah persiapan pemutar, untuk menyesuaikan parameter secara dinamis, panggil antarmuka ini untuk memperbaruinya.

Catatan

Memanggil updateFilterConfig sebelum prepare tidak berpengaruh. Gunakan setFilterConfig untuk konfigurasi awal.

AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // Jika bukan pertama kali mengaktifkan surround, pengaturan Jenis ini tidak valid karena inisialisasi sudah selesai.
[player updateFilterConfig:@"audioEnhance" options:opts];
Penting

Jenis suara surround ("3DSurround" / "MegaBass") dan kekuatan peningkatan suara (dialoguenhance_voice) harus ditetapkan bersama dengan atribut enable saat pertama kali digunakan. Jika tidak, nilai default digunakan untuk inisialisasi (suara surround default ke "3DSurround", kekuatan suara default ke 1.0), dan tidak dapat dimodifikasi selama pemutaran.

Performa

Tetapkan skenario pemutaran

Menetapkan skenario pemutaran secara otomatis mengonfigurasi parameter optimal (termasuk pengaturan buffer dan sakelar fitur). Ini kompatibel dengan pengaturan parameter kustom melalui antarmuka setConfig (pengaturan kustom memiliki prioritas lebih tinggi).

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

Contoh antarmuka

/**
 * Tetapkan skenario pemutar.
 *
 * @param scene 
 */
abstract public void setPlayerScene(PlayerScene scene);

Skenario pemutaran

public enum PlayerScene {
    /**
     * Skenario: tidak ada.
     */
    NONE,
    /**
     * Skenario video panjang: berlaku untuk video lebih dari 30 menit.
     */
    LONG,
    /**
     * Skenario video sedang: berlaku untuk video antara 5 hingga 30 menit.
     */
    MEDIUM,
    /**
     * Skenario video pendek: berlaku untuk video hingga 5 menit.
     */
    SHORT,
    /**
     * Skenario langsung.
     */
    LIVE,
    /**
     * Skenario langsung ultra-latensi rendah.
     */
    RTS_LIVE
}

Instruksi penggunaan

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

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

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

// Tetapkan skenario langsung.
aliPlayer.setPlayerScene(PlayerScene.LIVE)

Pre-rendering

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

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Anda harus menetapkan View sebelum memanggil Prepare untuk memastikan frame dirender ke View segera setelah siap.

  3. Mengaktifkan fitur ini memengaruhi urutan pemicuan keberhasilan persiapan dan event rendering frame pertama: tanpa fitur ini, keberhasilan persiapan dipicu sebelum rendering frame pertama; dengan fitur ini, karena perbedaan kecepatan decoding dan rendering, rendering frame pertama mungkin dipicu sebelum keberhasilan persiapan, tetapi hal ini tidak memengaruhi pemutaran.

    Contoh:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

Cache lokal

Catatan

Untuk contoh kode terperinci, lihat modul API-Example Pra-pemuatan video (Preload). Proyek contoh berbasis Java ini untuk ApsaraVideo Player SDK untuk Android membantu developer menguasai fitur integrasi inti SDK dengan cepat.

Cache lokal meningkatkan kecepatan startup, kecepatan pencarian, dan mengurangi tersendat untuk pemutaran berulang sekaligus menghemat bandwidth.

Aktifkan cache lokal

Cache lokal dinonaktifkan secara default. Untuk menggunakannya, aktifkan secara manual menggunakan AliPlayerGlobalSettings dan enableLocalCache. Contoh:

Perluas untuk melihat kode

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

/**
 * Anda juga dapat menggunakan kode berikut untuk pengaturan cache.
 * Aktifkan cache lokal. Setelah diaktifkan, konten di-cache ke file lokal.
 * @param enable: Sakelar fitur cache lokal. true: aktifkan, false: nonaktifkan. Dinonaktifkan secara default.
 * @param maxBufferMemoryKB: Ditinggalkan sejak versi 5.4.7.1, saat ini tidak berpengaruh.
 * @param localCacheDir: Harus ditetapkan. Direktori cache lokal sebagai jalur mutlak.
 * AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * Konfigurasi pembersihan file cache.
 * @param expireMin - Ditinggalkan sejak versi 5.4.7.1, saat ini tidak berpengaruh.
 * @param maxCapacityMB - Kapasitas cache maksimum dalam MB. Default adalah 20 GB. Selama pembersihan, jika ukuran total cache melebihi nilai ini, item cache dihapus satu per satu dari yang terlama hingga terbaru hingga ukuran ≤ maxCapacityMB.
 * @param freeStorageMB - Ruang disk bebas minimum dalam MB. Default adalah 0. Selama pembersihan, jika ruang disk saat ini kurang dari nilai ini, item cache dihapus satu per satu hingga ruang bebas ≥ nilai ini atau semua cache dihapus.
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * Tetapkan callback untuk memuat nilai hash URL. Jika tidak ditetapkan, SDK menggunakan algoritma MD5.
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
Catatan
  • Jika URL pemutaran video mencakup parameter autentikasi, parameter berubah antara caching dan pemutaran. Untuk meningkatkan tingkat hit cache untuk URL yang sama di bawah autentikasi berbeda, hapus parameter autentikasi sebelum menghitung nilai hash (misalnya, MD5) melalui setCacheUrlHashCallback. Misalnya, untuk URL seperti http://****.mp4?aaa, hitung hash menggunakan http://****.mp4. Namun, untuk video m3u8 terenkripsi, jika Anda menghapus parameter autentikasi dari keyURL sebelum hashing, video berbeda mungkin mengenai kunci yang sama, menyebabkan kegagalan pemutaran. Solusi: Dalam callback setCacheUrlHashCallback, periksa domain dan hanya hapus parameter autentikasi untuk domain pemutaran (http(s)://xxxxx.m3u8?aaaa), bukan untuk domain keyURL (http(s)://yyyyy?bbbb). Gunakan curl untuk mendapatkan daftar putar video M3U8 terenkripsi HLS, di mana playURL adalah alamat M3U8 dan keyURL adalah alamat kunci dekripsi AES-128. Contoh output terminal:

    # playURL: Permintaan daftar putar M3U8
    C:\Users\futan>curl "https://videxxxv.cc/a003xxx2a-hd-encrypt-stream.m3u8?MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a&auth_key=17xxxrmonwFHJ"
    
    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    # keyURL: Alamat kunci enkripsi AES-128
    #EXT-X-KEY:METHOD=AES-128,URI="https://apxxx.cc/decrypt?Ciphertext=NWNiNDQyN2MtNjV1ZS00ZWIwLTk0YTAtNTJhOWIyZWV1OTY2MzdoRTJ6TjVxcXkweFY2xxxNCt4OGNFRGNReHRG&MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a"
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00001.ts?auth_key=1706560316-65b7xxx39f1d6c77
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00002.ts?auth_key=1706560316-65b7xxxe8eca2faf
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00003.ts?auth_key=1706560316-65b7xxx50c6981b3
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00004.ts?auth_key=1706560316-65b7xxxf7228c594
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00005.ts?auth_key=1706560316-65b7xxx6dc68c35d
  • Jika server mendukung protokol HTTP dan HTTPS yang mengarah ke file media yang sama, hapus atau standarkan protokol sebelum menghitung hash. Misalnya:

    • Untuk URL https://****.mp4 dan http://****.mp4, hitung hash menggunakan ****.mp4.

    • Untuk URL https://****.mp4, standarkan ke http://****.mp4 sebelum menghitung hash.

  • Untuk versi player SDK 5.5.4.0 dan lebih baru, jika URL pemutaran video mencakup parameter autentikasi dan menggunakan protokol HLS, Anda dapat menetapkan PlayerConfig.mEnableStrictAuthMode untuk memilih antara mode autentikasi (default adalah false untuk versi lama; true untuk versi 7.13.0 dan lebih baru):

    • Autentikasi non-ketat (false): Autentikasi di-cache. Jika hanya sebagian media yang di-cache sebelumnya, pemutar menggunakan autentikasi yang di-cache untuk permintaan berikutnya. Jika autentikasi URL memiliki periode validitas singkat atau pemutaran dilanjutkan setelah jeda panjang, autentikasi mungkin kedaluwarsa. Integrasikan dengan pembaruan otomatis sumber pemutaran untuk menangani kedaluwarsa autentikasi.

    • Autentikasi ketat (true): Autentikasi tidak di-cache. Autentikasi terjadi setiap startup, menyebabkan kegagalan startup tanpa jaringan.

Aktifkan atau nonaktifkan cache lokal untuk URL tunggal

Untuk mengaktifkan atau menonaktifkan cache lokal untuk URL tertentu, tetapkan dalam konfigurasi pemutar.

// Dapatkan konfigurasi terlebih dahulu.
PlayerConfig config = aliPlayer.getConfig();
// Apakah akan mengaktifkan cache lokal untuk URL pemutaran. Default adalah true. Saat cache lokal global diaktifkan dan ini ditetapkan ke true, cache lokal berlaku untuk URL ini. Jika ditetapkan ke false, cache lokal dinonaktifkan untuk URL ini.
config.mEnableLocalCache = false;
....// Pengaturan lainnya.

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

Pra-pemuatan

Pra-pemuatan adalah peningkatan cache lokal yang meningkatkan kecepatan startup video dengan menetapkan penggunaan memori untuk caching video.

Batasan pra-pemuatan:

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

Catatan

Android player SDK menyediakan penjadwalan sumber daya jaringan otomatis selama pra-pemuatan secara default untuk mengurangi dampak permintaan jaringan pra-pemuatan pada pemutaran video yang sedang berlangsung. Strategi penjadwalan otomatis hanya mengizinkan permintaan pra-pemuatan setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk mengontrol permintaan pra-pemuatan real-time sendiri, nonaktifkan strategi ini menggunakan metode berikut:

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. Aktifkan cache lokal. Untuk langkah terperinci, lihat Cache lokal.

  2. Tetapkan sumber data.

    VidAuth (direkomendasikan)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Info Vid");// Parameter wajib: ID Video.
    vidAuth.setPlayAuth("<kredensialPlayAnda>");// Parameter wajib: Kredensial pemutaran, dihasilkan dengan memanggil API GetVideoPlayAuth VOD.
    vidAuth.setRegion("Wilayah akses");// Untuk versi player SDK 5.5.5.0 dan lebih baru, parameter ini ditinggalkan dan tidak diperlukan; pemutar secara otomatis mengurai wilayahnya. Untuk versi sebelum 5.5.5.0, parameter ini wajib; wilayah akses VOD default adalah cn-shanghai.
    vidAuth.setQuality("Definisi yang dipilih") //"AUTO" merepresentasikan bitrate adaptif.

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Info Vid");// Parameter wajib: ID Video. vidSts.setAccessKeyId("<yourAccessKeyId>");// Parameter wajib: ID kunci akses pasangan AK sementara STS, dihasilkan dengan memanggil API AssumeRole STS.  vidSts.setAccessKeySecret("<yourAccessKeySecret>");// Parameter wajib: Rahasia kunci akses pasangan AK sementara STS, dihasilkan dengan memanggil API AssumeRole STS.  vidSts.setSecurityToken("<yourSecurityToken>");// Parameter wajib: Token keamanan STS, dihasilkan dengan memanggil API AssumeRole STS.  vidSts.setRegion("Wilayah akses");// Parameter wajib: Wilayah akses VOD; default adalah cn-shanghai.
    vidSts.setQuality("Definisi yang dipilih") //"AUTO" merepresentasikan bitrate adaptif.

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("Alamat pemutaran");// Parameter wajib: Alamat pemutaran, yang dapat berupa alamat VOD pihak ketiga atau alamat pemutaran Alibaba Cloud VOD.
  3. Tetapkan parameter tugas.

    Catatan

    Hanya berlaku untuk video multi-bitrate. Pilih salah satu dari setDefaultBandWidth, setDefaultResolution, atau setDefaultQuality.

    PreloadConfig preloadConfig = new PreloadConfig();
    // Tetapkan bitrate pra-pemuatan untuk aliran multi-bitrate.
    preloadConfig.setDefaultBandWidth(400000);
    // Tetapkan resolusi pra-pemuatan untuk aliran multi-bitrate.
    preloadConfig.setDefaultResolution(640 * 480);
    // Tetapkan kualitas pra-pemuatan untuk aliran multi-bitrate.
    preloadConfig.setDefaultQuality("FD");
    // Tetapkan durasi pra-pemuatan.
    preloadConfig.setDuration(1000);
  4. Tambahkan listener tugas.

    Perluas untuk melihat kode

    /**
     * Implementasi listener pra-pemuatan.
     */
    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 instans MediaLoaderV2 untuk memulai pra-pemuatan.

    VidAuth (direkomendasikan)

    // Bangun pra-pemuatan.
    PreloadTask mPreloadTask = new PreloadTask(vidAuth, preloadConfig);
    // Dapatkan instans MediaLoaderV2.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai pra-pemuatan.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)

    VidSts

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

    UrlSource

    // Bangun pra-pemuatan.
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // Dapatkan instans MediaLoaderV2.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Tambahkan tugas dan mulai pra-pemuatan.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)
  6. Opsi: Kelola tugas.

    mediaLoaderV2.cancelTask(taskId);// Batalkan tugas pra-pemuatan dengan ID tugas tertentu.
    mediaLoaderV2.pauseTask(taskId);// Jeda tugas pra-pemuatan dengan ID tugas tertentu.
    mediaLoaderV2.resumeTask(taskId);// Lanjutkan tugas pra-pemuatan dengan ID tugas tertentu.
  7. Opsi: Hapus file yang dimuat.

    Hapus file yang dimuat sesuai kebutuhan untuk menghemat ruang. Android player SDK tidak menyediakan antarmuka penghapusan; hapus file dari direktori pemuatan di aplikasi Anda.

Pra-pemuatan dinamis

Strategi pra-pemuatan dinamis memungkinkan integrator mengontrol cache video yang sedang diputar dan jumlah serta cache item yang dipra-muat, menyeimbangkan pengalaman pemutaran dan biaya overhead.

Perluas untuk melihat kode

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

// Konfigurasikan durasi pra-pemuatan dasar.
// Tetapkan durasi pra-pemuatan menjadi 1000ms.
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// Konfigurasikan jumlah pra-pemuatan, mendukung dua arah.
// 1 untuk pra-pemuatan maju, 3 untuk pra-pemuatan mundur.
aliListPlayer.setPreloadCount(1, 3);

// Konfigurasikan offset pengurangan strategi pra-pemuatan dinamis.
aliListPlayer.enablePreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, true);
aliListPlayer.setPreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, "{\"algorithm\": \"sub\",\"offset\": \"200\"}");

Pra-pemuatan video HLS multi-bitrate

Dalam skenario pemutaran video HLS multi-bitrate listPlayer, integrator dapat mempra-muat aliran yang sesuai dengan definisi pemutaran saat ini dan memilih mode pra-pemuatan berdasarkan kebutuhan bisnis.

Perluas untuk melihat mode pra-pemuatan yang didukung

  /**
   * Konfigurasi default, putar dan pra-muat bitrate default.
   */
  MultiBitratesMode_Default(0),

  /**
   * Konfigurasi prioritas frame pertama, kurangi biaya frame pertama. Hanya putar bitrate aliran HLS yang telah dipra-muat.
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * Seimbangkan frame pertama dan kelancaran pemutaran, putar bitrate yang sama sebelum dan sesudah moveToNext, dan prioritaskan performa frame pertama.
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * Konfigurasi prioritas kelancaran pemutaran, putar bitrate yang sama sebelum dan sesudah moveToNext.
   */
  MultiBitratesMode_SmoothPrio(3);

Perluas 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

Dapatkan kecepatan unduhan video saat ini melalui callback onInfo, diimplementasikan oleh antarmuka getExtraValue. Contoh:

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 mengurai nama domain melalui HTTP ke server tertentu, mengurangi risiko pembajakan DNS dan memberikan resolusi yang lebih cepat dan stabil.

ApsaraVideo Player SDK menyediakan HTTPDNS yang ditingkatkan untuk domain CDN Alibaba Cloud, mendukung penjadwalan CDN yang tepat dan resolusi real-time.

Contoh penggunaan HTTPDNS yang ditingkatkan

HTTPDNS yang ditingkatkan hanya menyediakan layanan untuk domain CDN Alibaba Cloud. Pastikan domain Anda adalah domain CDN Alibaba Cloud dan dikonfigurasi dengan benar. Untuk menambahkan domain CDN di VOD, lihat Tambahkan domain yang dipercepat. Alibaba Cloud CDN.

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

HTTP/2

Catatan

Android player SDK mengaktifkan HTTP/2 secara default mulai dari versi 5.5.0.0.

Android player SDK mendukung protokol HTTP/2, yang menggunakan multiplexing untuk menghindari blokir kepala antrian dan meningkatkan performa pemutaran. Contoh:

AliPlayerGlobalSettings.setUseHttp2(true);

TCP pra-koneksi HTTP

Untuk permintaan pemutaran video HTTP (non-HTTPS), membangun koneksi TCP terlebih dahulu secara signifikan meningkatkan pengalaman pengguna, mengurangi waktu koneksi jaringan, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Penggunaan:

// Format domain adalah host[:port]; port opsional. Pisahkan beberapa domain dengan titik koma (;).
// Pengaturan global.
// Antarmuka lengkap menggunakan string saat ini setiap kali ditetapkan (lebih banyak - tambah, lebih sedikit - hapus). String kosong menghentikan pra-koneksi.
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

Unduhan video

Catatan

Untuk contoh kode terperinci, lihat modul API-Example Unduhan video dan pemutaran offline (Download). Proyek contoh berbasis Java ini untuk ApsaraVideo Player SDK untuk Android membantu developer menguasai fitur integrasi inti SDK dengan cepat.

Android player SDK menyediakan fitur unduhan video untuk layanan VOD, memungkinkan pengguna menyimpan cache video secara lokal menggunakan ApsaraVideo Player. Fitur ini menawarkan dua metode unduhan: unduhan standar dan unduhan aman.

  • Unduhan standar

    Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud dan dapat diputar oleh pemutar pihak ketiga.

  • Unduhan aman

    Data video yang diunduh dienkripsi oleh Alibaba Cloud. Pemutar pihak ketiga tidak dapat memutarnya. Hanya ApsaraVideo Player yang dapat memutarnya.

Instruksi penggunaan

  • Hanya metode VidSts dan VidAuth yang mendukung unduhan video.

  • Untuk menggunakan fitur unduhan video pemutar, aktifkan dan konfigurasikan mode unduhan di konsol VOD. Untuk langkah terperinci, lihat Unduhan offline.

  • Unduhan video mendukung unduhan yang dapat dilanjutkan.

Prosedur

  1. Opsi: Konfigurasikan file verifikasi enkripsi untuk unduhan aman. Diperlukan hanya untuk unduhan aman; tidak diperlukan untuk unduhan standar.

    Catatan

    Pastikan file verifikasi enkripsi yang dikonfigurasi sesuai dengan informasi aplikasi Anda; jika tidak, unduhan video gagal.

    Untuk unduhan aman, konfigurasikan file kunci yang dihasilkan di konsol VOD di player SDK untuk verifikasi dekripsi selama unduhan dan pemutaran video. Untuk pembuatan file kunci, lihat Aktifkan unduhan aman.

    Kami merekomendasikan mengonfigurasi ini sekali di Application. Contoh:

    PrivateService.initService(getApplicationContext(),  "Jalur ke file encryptedApp.dat"); // Kami merekomendasikan menyimpan file verifikasi encryptedApp.dat di ponsel dan menetapkan jalur file lokalnya di sini.
  2. Buat dan tetapkan pengunduh.

    Buat pengunduh menggunakan AliDownloaderFactory. Contoh:

    AliMediaDownloader mAliDownloader = null;
    ......
    // Buat pengunduh.
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // Konfigurasikan jalur penyimpanan unduhan.
    mAliDownloader.setSaveDir("Jalur folder simpan");
  3. Tetapkan listener event.

    Pengunduh menyediakan beberapa listener event. Contoh:

    Perluas untuk melihat kode

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // Item unduhan berhasil dipersiapkan.
       }
    });
    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. Persiapkan sumber unduhan.

    Persiapkan sumber unduhan menggunakan metode prepare. Sumber unduhan mendukung metode VidSts dan VidAuth. Contoh:

    • VidSts

      // Buat VidSts
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Informasi Vid"); // ID Video (VideoId).
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // ID AccessKey pasangan AccessKey STS sementara, dihasilkan dengan memanggil operasi AssumeRole Layanan Token Keamanan (STS).
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Rahasia AccessKey pasangan AccessKey STS sementara, dihasilkan dengan memanggil operasi AssumeRole Layanan Token Keamanan (STS).
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Token Layanan Keamanan (STS), dihasilkan dengan memanggil operasi AssumeRole Layanan Token Keamanan (STS).
      aliyunVidSts.setRegion("wilayah"); // Wilayah layanan video sesuai permintaan (VOD). Nilai default: cn-shanghai.
      // Jika Anda telah mengaktifkan transmisi langsung parameter enkripsi HLS di konsol VOD dan nama parameter default adalah MtsHlsUriToken,
      // Anda harus menetapkan konfigurasi dan meneruskannya ke vid, seperti yang ditunjukkan di bawah ini.
      // Jika Anda belum mengaktifkan transmisi langsung parameter enkripsi HLS di konsol VOD, lewati kode berikut.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      aliyunVidSts.setPlayerConfig(vidConfig);
              
      
      // Persiapkan sumber unduhan
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      // Buat VidAuth.
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("Info Vid");// ID Video.
      vidAuth.setPlayAuth("<kredensialPlayAnda>");// Kredensial pemutaran, dihasilkan dengan memanggil API GetVideoPlayAuth VOD.
      vidAuth.setRegion("Wilayah akses");// Untuk versi player SDK 5.5.5.0 dan lebih baru, parameter ini ditinggalkan dan tidak diperlukan; pemutar secara otomatis mengurai wilayahnya. Untuk versi sebelum 5.5.5.0, parameter ini wajib; wilayah akses VOD default adalah cn-shanghai.
      // Jika Anda mengaktifkan transmisi langsung parameter enkripsi standar HLS di konsol VOD dengan nama parameter default MtsHlsUriToken, tetapkan konfigurasi dan teruskan ke vid seperti di bawah ini.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // Persiapkan sumber unduhan.
      mAliDownloader.prepare(vidAuth);
    Catatan
    • Format file sumber cocok dengan format file yang diunduh; perubahan tidak didukung.

    • Jika Anda mengaktifkan transmisi langsung parameter enkripsi standar HLS di konsol VOD dengan nama parameter default MtsHlsUriToken, lihat Transmisi langsung parameter enkripsi standar HLS, kemudian tetapkan nilai MtsHlsUriToken dalam sumber VOD seperti yang ditunjukkan di atas.

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

    Setelah persiapan berhasil, metode OnPreparedListener dipanggil. TrackInfo yang dikembalikan berisi informasi seperti definisi aliran video. Pilih satu Track untuk diunduh. Contoh:

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

    Untuk mencegah kedaluwarsa VidSts dan VidAuth, Anda dapat memperbarui informasi sumber unduhan dan mulai mengunduh. Contoh:

    // Perbarui sumber unduhan.
    mAliDownloader.updateSource(VidSts);
    // Mulai unduh.
    mAliDownloader.start();
  7. Setelah keberhasilan atau kegagalan unduhan, lepaskan pengunduh.

    Setelah unduhan berhasil, panggil release dalam callback onCompletion atau onError untuk melepaskan pengunduh. Contoh:

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

    Anda dapat menghapus file yang diunduh selama atau setelah unduhan. Contoh:

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

Langkah selanjutnya

Video yang diunduh dapat diputar menggunakan ApsaraVideo Player. Langkah-langkah:

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

    String path = mAliDownloader.getFilePath();
  2. Tetapkan jalur mutlak melalui UrlSource VOD untuk pemutaran.

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("Alamat pemutaran");// Tetapkan jalur mutlak video yang diunduh.
            aliPlayer.setDataSource(urlSource);

Pemutaran terenkripsi

Video VOD mendukung enkripsi standar HLS, kriptografi privat Alibaba Cloud, dan enkripsi DRM. Video langsung hanya mendukung enkripsi DRM. Untuk pemutaran terenkripsi, lihat Pemutaran terenkripsi.

Pemutaran RTS Native

Android Player SDK mengintegrasikan Native RTS SDK untuk streaming langsung ultra-latensi rendah. Implementasikan penarikan aliran RTS di Android.

Referensi