All Products
Search
Document Center

ApsaraVideo VOD:Fitur lanjutan

Last Updated:Mar 13, 2026

Topik ini menjelaskan fitur lanjutan SDK ApsaraVideo Player untuk Android dan menyediakan contoh kode. Untuk informasi lebih lanjut mengenai fitur lainnya, lihat Operasi API SDK ApsaraVideo Player untuk Android.

Penting

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

Konfirmasi kemampuan profesional

Catatan

Beberapa fitur pemutar memerlukan lisensi Edisi Profesional. Untuk detailnya, lihat Ikhtisar fitur SDK ApsaraVideo Player. Untuk menggunakan fitur-fitur tersebut, peroleh lisensi seperti yang dijelaskan di Dapatkan lisensi SDK Pemutar.

Tetapkan listener saat aplikasi Anda dimulai atau sebelum memanggil antarmuka 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);
    }
});

Pada kode ini, PremiumBizType adalah enumerasi yang merepresentasikan kemampuan profesional. Pemutar memverifikasi kemampuan ini dan mengembalikan hasil melalui callback ini saat Anda menggunakan fitur terkait. Jika isValid bernilai false, errorMsg berisi alasan spesifiknya.

Pemutaran

Pemutaran daftar

SDK ApsaraVideo Player untuk Android menyediakan fitur pemutaran daftar video lengkap. SDK memanfaatkan teknologi seperti preloading untuk meminimalkan waktu pemuatan video pendek.

Prosedur

  1. Buat pemutar.

    Buat instans AliListPlayer menggunakan kelas AliPlayerFactory. Contoh kode:

    AliListPlayer aliListPlayer;
    .....
    aliListPlayer = AliPlayerFactory.createAliListPlayer(getApplicationContext());
    aliListPlayer.setTraceId("traceId");  // ID jejak adalah pengidentifikasi unik perangkat atau pengguna. Dalam kebanyakan kasus, nilainya adalah International Mobile Equipment Identity (IMEI) atau Identifier for Advertisers (IDFA) perangkat.

  2. Opsional. Konfigurasikan listener.

    Listener bersifat opsional saat membuat pemutar daftar video pendek. Namun, jika tidak mengonfigurasi listener, Anda tidak akan menerima notifikasi event terkait pemutar, seperti kegagalan pemutaran atau progres. Kami menyarankan Anda mengonfigurasi listener berikut: OnPreparedListener, OnErrorListener, OnCompletionListener, OnLoadingStatusListener, dan OnInfoListener.

    Tampilkan kode

    aliListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            // Mendengarkan akhir pemutaran.
        }
    });
    aliListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // Mendengarkan terjadinya kesalahan.
        }
    });
    aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Mendengarkan persiapan berhasil.
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // Mendengarkan perubahan resolusi video.
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // Mendengarkan tampilan frame pertama.
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // Mendengarkan event lainnya. Parameter type berisi beberapa nilai yang menunjukkan berbagai event, seperti awal putar ulang berulang, posisi buffer, posisi pemutaran saat ini, dan awal putar otomatis.
        }
    });
    aliListPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            // Mendengarkan awal penyanggaan. 
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            // Mendengarkan kemajuan penyanggaan.
        }
        @Override
        public void onLoadingEnd() {
            // Mendengarkan akhir penyanggaan.
        }
    });
    aliListPlayer.setOnSeekCompleteListener(new IPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete() {
            // Mendengarkan akhir pencarian.
        }
    });
    aliListPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            // Mendengarkan tampilan subtitle.
        }
        @Override
        public void onSubtitleHide(long id) {
            // Mendengarkan penyembunyian subtitle.
        }
    });
    aliListPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            // Mendengarkan peralihan berhasil antara aliran audio dan video atau antar resolusi.
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // Mendengarkan kegagalan peralihan antara aliran audio dan video atau antar resolusi.
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // Mendengarkan perubahan status pemutar.
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // Mendengarkan pengambilan Snapshot.
        }
    });
  3. Tentukan jumlah video yang akan dipramuat.

    Anda dapat mengatur jumlah video yang akan dipreloads sesuai kebutuhan untuk mengurangi durasi pemuatan startup. Contoh kode:

    // Tentukan jumlah video yang akan dipreloads. Total jumlah video yang dimuat sama dengan satu ditambah dua kali jumlah yang ditentukan. 
    aliListPlayer.setPreloadCount(int count);
  4. Tambahkan atau hapus beberapa sumber pemutaran.

    Pemutaran daftar mendukung pemutaran video berdasarkan Vid dan UrlSource. Anda dapat menggunakan VidSts atau VidPlayAuth untuk memutar video berdasarkan Vid. Url adalah URL pemutaran video. Contoh kode:

    • Url: URL pemutaran bisa berupa URL file audio atau video di ApsaraVideo VOD atau platform video-on-demand (VOD) pihak ketiga. Anda dapat memanggil operasi GetPlayInfo untuk mendapatkan URL pemutaran file audio atau video di ApsaraVideo VOD. Kami menyarankan Anda menggunakan SDK ApsaraVideo VOD untuk memanggil operasi ini guna menghindari perhitungan signature yang kompleks. Untuk informasi lebih lanjut tentang operasi GetPlayInfo, kunjungi OpenAPI Explorer.

    • Vid: ID audio atau video. Untuk mendapatkan ID tersebut, login ke konsol ApsaraVideo VOD dan pilih File Media > Audio/Video di panel navigasi kiri. Atau, Anda dapat memanggil operasi SearchMedia.

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

    Parameter uid menunjukkan ID unik sebuah video. Anda dapat menggunakan ID unik ini untuk mengidentifikasi video. Video dengan ID unik yang sama dianggap identik. Jika pemutar memutar video yang tidak Anda tentukan, periksa apakah Anda telah memberikan ID yang sama untuk beberapa video. Anda dapat mengatur ID unik ke string apa pun yang Anda pilih.

  5. Konfigurasikan tampilan.

    SurfaceView dan TextureView didukung. Atur tampilan UI ke SurfaceView atau TextureView.

    • Contoh kode berikut menjelaskan cara menggunakan SurfaceView untuk mengonfigurasi tampilan:

      Tampilkan 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);
          }
      });
    • Contoh kode berikut menjelaskan cara menggunakan TextureView untuk mengonfigurasi tampilan:

      Tampilkan 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 memutar konten dari sumber pemutaran yang ditentukan. Contoh kode:

    Tampilkan kode

    // Aktifkan autoplay.
    aliListPlayer.setAutoPlay(true);
    
    // Panggil metode berikut untuk pemutaran berbasis URL.
    aliPlayer.moveTo(String uid);
    // Panggil metode berikut untuk pemutaran berbasis Vid. Anda harus mendapatkan token Security Token Service (STS) dan pasangan AccessKey sebelum memanggil metode ini. Untuk informasi lebih lanjut, lihat Buat peran RAM dan berikan izin akses sementara ke peran tersebut menggunakan STS. 
    aliPlayer.moveTo(String uid, StsInfo info);
  7. Putar video sebelumnya atau berikutnya dalam daftar.

    • Setelah memanggil moveTo untuk memutar video, Anda dapat memanggil moveToPrev untuk memutar video sebelumnya atau memanggil moveToNext untuk memutar video berikutnya. Sumber video moveTo berfungsi sebagai titik jangkar. Contoh kode:

      Catatan

      Saat memanggil moveto atau moveToNext untuk mengganti sumber video dalam view yang sama, layar hitam berkedip mungkin muncul. Dalam kasus ini, kami menyarankan Anda mengatur bidang mClearFrameWhenStop dari PlayerConfig ke false dan memanggil setConfig untuk menerapkan konfigurasi saat menginisialisasi listPlayer.

      Tampilkan kode

      // Aktifkan autoplay.
      aliListPlayer.setAutoPlay(true);
      
      // Putar video berikutnya. Anda hanya dapat memanggil metode ini untuk pemutaran berbasis URL. Metode ini tidak valid untuk pemutaran berbasis Vid. 
      aliListPlayer.moveToNext();
      // Putar video sebelumnya. Anda hanya dapat memanggil metode ini untuk pemutaran berbasis URL. Metode ini tidak valid untuk pemutaran berbasis Vid. 
      aliListPlayer.moveToPrev();
      // Putar video berikutnya. Anda hanya dapat memanggil metode ini untuk pemutaran berbasis Vid. 
      aliListPlayer.moveToNext(StsInfo info);
      // Putar video sebelumnya. Anda hanya dapat memanggil metode ini untuk pemutaran berbasis Vid. 
      aliListPlayer.moveToPrev(StsInfo info);
Catatan

Jika Anda menginginkan pengalaman pemutaran daftar yang lebih baik, kami menyarankan Anda menggunakan solusi mini drama. Untuk informasi lebih lanjut, lihat Pengembangan klien mini drama.

Putar video yang memiliki konfigurasi transparansi

Ikhtisar

SDK ApsaraVideo Player mendukung rendering video dengan saluran alpha untuk memutar video hadiah dinamis dengan latar belakang transparan. Hal ini memungkinkan penonton melihat efek hadiah dinamis tanpa menghalangi konten video langsung selama streaming, secara signifikan meningkatkan pengalaman menonton dan interaksi.

Batasan

Anda dapat menggunakan SDK ApsaraVideo MediaBox V6.8.0 atau yang lebih baru dan SDK ApsaraVideo Player V6.9.0 atau yang lebih baru untuk merender video dengan transparansi.

Manfaat

Anda dapat menggunakan video MP4 dengan transparansi untuk memutar video hadiah dinamis dengan latar belakang transparan. Hal ini meningkatkan performa, kompatibilitas video, mengurangi ukuran video, dan menyederhanakan pengembangan, sehingga mengoptimalkan pengalaman menonton efek hadiah dan meningkatkan pengalaman pengguna. Menggunakan video MP4 dengan transparansi untuk memutar video hadiah dinamis menawarkan manfaat berikut:

  1. Kualitas video lebih tinggi: Video MP4 menampilkan efek hadiah dinamis dalam kualitas asli, termasuk detail gambar dan warna. Dibandingkan dengan format lain seperti APNG atau IXD, MP4 mempertahankan kualitas asli yang dimaksudkan oleh desainer.

  2. Ukuran video lebih kecil: Dibandingkan dengan format lain seperti APNG atau IXD, MP4 mencapai pengurangan ukuran file yang lebih efisien, mempercepat pemuatan dan mengurangi konsumsi lebar pita jaringan.

  3. Kompatibilitas lebih baik: MP4 adalah format video umum yang didukung secara luas di berbagai perangkat dan browser, memungkinkan pemutaran efek hadiah berbasis MP4 di perangkat utama.

  4. Efisiensi pengembangan lebih tinggi: Menggunakan video MP4 sebagai hadiah dinamis memerlukan pengembangan yang sederhana. Developer dapat fokus pada implementasi fitur lain daripada mengembangkan logika parsing dan rendering yang kompleks, meningkatkan efisiensi pengembangan.

Contoh kode

Operasi setAlphaRenderMode ditambahkan. Anda dapat memanggil operasi ini untuk menentukan posisi saluran alpha material video—misalnya, di bagian atas, bawah, kiri, atau kanan material video. Secara default, nilainya diatur ke None.

Catatan
  • Posisi saluran alpha material harus sesuai dengan posisi yang ditentukan saat memanggil operasi setAlphaRenderMode.

  • Ukuran tampilan harus proporsional dengan resolusi material.

/**
 * Set the alpha render mode
 *
 * @param alphaRenderMode The alpha render mode. See {@link AlphaRenderMode}.
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------Configure the view-------------
// Configure a transparent view.
//TextureView
TextureView aliplayerView; // The view used for playback.
aliplayerView.setOpaque(false);

//SurfaceView
SurfaceView aliplayerView; // The view used for playback.
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); // Display SurfaceView at the top of the window.

//-----------Configure AliPlayer-----------
// Set the alpha mode.
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// Specify the material that corresponds to the alpha mode.
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() {
        // Optional. If a connection error occurs when the playback of videos in a player instance is complete, you can clear the view.
        aliPlayer.clearScreen();
    }
}
aliPlayer.setAutoPlay(true);
aliPlayer.prepare();

Konfigurasikan subtitle eksternal

Catatan

Untuk contoh kode detail, lihat modul API-Example Pemutaran dan pergantian subtitle eksternal (ExternalSubtitle). Proyek ini adalah proyek contoh Android untuk SDK ApsaraVideo Player yang ditulis dalam Java. Ini membantu developer dengan cepat menguasai integrasi inti SDK.

SDK ApsaraVideo Player untuk Android memungkinkan Anda menambahkan atau mengganti subtitle eksternal dalam format SRT, SSA, ASS, atau VTT untuk video.

Berikut adalah contohnya:

  1. Buat tampilan yang menampilkan subtitle.

    Anda harus membuat tampilan berbeda untuk subtitle dalam format berbeda.

    Tampilkan kode

    // Create a view that displays subtitles in the SRT or VTT format.
    SubtitleView subtitleView = new SubtitleView(getContext());
    // For Player SDK V7.6.0 or later, we recommend that you use VttSubtitleView to display subtitles in the SRT or VTT format.
    VttSubtitleView vttSubtitleView = new VttSubtitleView(getContext());
    // Create a view that displays subtitles in the ASS or SSA format.
    AssSubtitleView assSubtitleView = new AssSubtitleView(getContext());
    // Add the view that displays subtitles to the layout view.
    viewGroup.addView(assSubtitleView);

    Saat mengintegrasikan Player SDK V7.6.0 atau yang lebih baru dan menggunakan VttSubtitleView untuk menampilkan subtitle SRT dan VTT, konfigurasikan listener berikut:

    // Required for Player SDK 7.6.0 or later
    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

    Anda harus mengonfigurasi file subtitle dalam onPrepared.

    mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Configure subtitles (must be configured in onPrepared)
            mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL);
        }
    });
  3. Konfigurasikan listener untuk subtitle.

    Tampilkan kode

    mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
                @Override
                public void onSubtitleExtAdded(int trackIndex, String url) {
                    // trackIndex: the subtitle index; true: display the specified subtitle; false: hide the specified 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;
                    // display the subtitle
                    mSubtitleView.show(subtitle);
                }
    
                @Override
                public void onSubtitleHide(int trackIndex, long id) {
                    // remove the subtitle
                    mSubtitleView.dismiss(String.valueOf(id));
                }
    
                @Override
                public void onSubtitleHeader(int trackIndex, String header) {
                }
            }
        );

Subtitle eksternal (rendering kustom dengan komponen rendering)

Berdasarkan VttSubtitleView dan WebVttResolver, SDK ApsaraVideo Player sepenuhnya mendukung subtitle eksternal WebVTT dan memungkinkan kustomisasi fleksibel ukuran font, warna, dan font tertentu.

Catatan

Kasus penggunaan:

  • Anda perlu menyesuaikan gaya subtitle WebVTT.

  • Anda mengintegrasikan SDK ApsaraVideo Player V7.11.0 atau yang lebih baru.

Penting

Prasyarat:

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

  • minSdk proyek Anda adalah 21 atau yang lebih baru (disarankan).

  • Anda telah menambahkan listener subtitle dan dapat memperoleh konten WebVTT.

  1. Buat CustomStyleWebVttResolver dan implementasikan WebVttResolver.

    public class CustomStyleWebVttResolver extends WebVttResolver {
    
        // Implement the constructor
        public CustomStyleWebVttResolver(Context context) {
            super(context);
            // Initialize fonts and other resources here
        }
    }
  2. Override applyTextSpans untuk menyesuaikan gaya.

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

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

      /**
       * Override text style application logic to achieve custom styling effects.
       * This method is called after the parent class parses basic styles, allowing secondary processing of properties such as font size and color.
       *
       * @param spannableStringBuilder Used to build styled text
       * @param vttContentAttribute Style attributes of the current text segment (including font, color, size, etc.)
       * @param start Start position of style application (inclusive)
       * @param end End position of style application (exclusive)
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // Save original font size (unit: px) for subsequent adjustment
          // Default font size is 0.0533f times the video height
          double originalFontSizePx = vttContentAttribute.fontSizePx;
      
          // Double the font size
          vttContentAttribute.fontSizePx = originalFontSizePx * 2;
          
          // Change font color to red
          vttContentAttribute.mPrimaryColour = Color.argb(255, 255, 0, 0);
      
          // Call the parent class method to apply text styles
          super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end);
      }
    • Manipulasi langsung SpannableStringBuilder untuk memodifikasi gaya WebVTT secara langsung.

      Penting

      Metode ini dapat menyebabkan hilangnya gaya WebVTT asli.

      /**
       * Override text style application logic to achieve custom styling effects.
       * This method is called after the parent class parses basic styles, allowing secondary processing of properties such as font size and color.
       *
       * @param spannableStringBuilder Used to build styled text
       * @param vttContentAttribute Style attributes of the current text segment (including font, color, size, etc.)
       * @param start Start position of style application (inclusive)
       * @param end End position of style application (exclusive)
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // Set font color
          spannableStringBuilder.setSpan(
              new ForegroundColorSpan(Color.RED),
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // Set absolute font size
          spannableStringBuilder.setSpan(
              new AbsoluteSizeSpan(20), // Unit: px
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // Set relative font size
          // spannableStringBuilder.setSpan(
          //     new RelativeSizeSpan(2.0f), // Multiple of TextView default font size
          //     start, end,
          //     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          // );
      }
  3. Konfigurasikan font kustom (Typeface).

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

      private Typeface mTypeface;
      
      public CustomStyleWebVttResolver(Context context) {
          super(context);
          initializeFonts(context);
      }
      
      private void initializeFonts(Context context) {
          try {
              // Load font from assets/fonts/
              mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/LongCang.ttf");
          } catch (Exception e) {
              Log.e("Font", "Failed to load font", e);
              mTypeface = Typeface.DEFAULT; // Safe fallback
          }
      }
    2. Terapkan font kustom ke subtitle.

      @Override
      protected void applyTextSpans(SpannableStringBuilder builder, VttContentAttribute attr, int start, int end) {
          // Apply custom font
          // Must be placed after super.applyTextSpans() to override fonts possibly set by the parent class.
          // super.applyTextSpans() is optional.
          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);
          }
      }

      Dukungan untuk versi Android yang lebih lama: Karena TypefaceSpan di Android P (API 28) dan sebelumnya tidak mendukung objek Typeface secara langsung, Anda harus mengimplementasikan MetricAffectingSpan kustom.

      /**
        * Custom Typeface Span class
        * Inherits from MetricAffectingSpan to correctly apply Typeface during text drawing and measurement.
        * Solves the issue where standard TypefaceSpan cannot directly use Typeface objects.
      */
      private static class CustomTypefaceSpan extends MetricAffectingSpan {
      
          // Custom font to apply
          private final Typeface typeface;
      
          /**
            * Constructor
            *
            * @param typeface Typeface object to apply (must not be null)
            */
          public CustomTypefaceSpan(Typeface typeface) {
              this.typeface = typeface;
          }
      
          /**
            * Update text drawing state
            * Called during actual text drawing to set the paint font.
            *
            * @param tp TextPaint object used to draw text
            */
          @Override
          public void updateDrawState(TextPaint tp) {
              tp.setTypeface(typeface);
          }
      
          /**
            * Update text measurement state
            * Called during text layout calculation (such as width, line breaks) to ensure measurements match actual drawing.
            *
            * @param p TextPaint object used to measure text
            */
          @Override
          public void updateMeasureState(TextPaint p) {
              p.setTypeface(typeface);
          }
      }
  4. Integrasikan ke pemutar.

    1. Inisialisasi tampilan subtitle.

      // Initialize subtitleView
      private void initSubtitleView() {
          // Get context
          Context context = getContext();
      
          // Create CustomStyleWebVttResolver 
          CustomStyleWebVttResolver mResolver = new CustomStyleWebVttResolver(context);
      
          // Create VttSubtitleView and pass CustomStyleWebVttResolver
          VttSubtitleView mVttSubtitleView = new VttSubtitleView(context, mResolver);
      
          // Add to video container
          rootView.addView(mVttSubtitleView);
      }
    2. Ikat callback subtitle eksternal.

      // Configure subtitle listener
      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) {
                  // Show subtitle
                  mVttSubtitleView.show(id, data); 
              }
          }
      
          @Override
          public void onSubtitleHide(int trackIndex, long id) {
              // Hide subtitle
              mVttSubtitleView.dismiss(id);
          }
      
          @Override
          public void onSubtitleHeader(int i, String header) {
              if (!TextUtils.isEmpty(header)) {
                  // Apply WebVTT header styles
                  mVttSubtitleView.setVttHeader(header);
              }
          }
      });

Aktifkan pemutaran hanya audio

Anda dapat menonaktifkan kemampuan tampilan untuk gambar video guna mengaktifkan pemutaran hanya audio. Sebelum memanggil metode prepare, konfigurasikan kelas PlayerConfig.

PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // Enable audio-only playback.
aliPlayer.setConfig(config);

Ganti antara decoding software dan decoding hardware

Catatan

Anda harus mengubah metode decoding sebelum pemutaran dimulai. Perubahan yang dilakukan selama pemutaran tidak berlaku.

SDK ApsaraVideo Player untuk Android mendukung decoding hardware berdasarkan standar H.264 dan H.265. Anda dapat memanggil enableHardwareDecoder untuk mengaktifkan atau menonaktifkan decoding hardware. Secara default, decoding hardware diaktifkan. Jika inisialisasi decoding hardware gagal, sistem beralih ke decoding software untuk memastikan pemutaran normal. Contoh kode:

// Enable hardware decoding. Hardware decoding is enabled by default.
aliPlayer.enableHardwareDecoder(true);

Jika decoding hardware beralih ke decoding software, callback onInfo dipanggil. Contoh kode:

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

Pemutaran adaptif H.265

Jika model saat ini berada dalam daftar hitam model H.265 di cloud atau aliran H.265 gagal didekode, streaming adaptif dipicu. Jika Anda telah mengonfigurasi aliran sekunder H.264, sistem secara otomatis memutar aliran sekunder H.264 tersebut. Jika Anda tidak mengonfigurasi aliran sekunder, decoding software digunakan secara otomatis untuk pemutaran H.265.

Catatan
  • Fitur ini hanya tersedia setelah Anda mengaktifkan pemutaran adaptif. Pemutaran adaptif adalah layanan bernilai tambah. Untuk mengaktifkan layanan bernilai tambah, ajukan permintaan di Yida.

  • Layanan bernilai tambah Adaptive Decoding Terintegrasi Klien-Cloud menyediakan kemampuan berikut: pengiriman dinamis data kompatibilitas untuk decoding hardware sisi cloud dan downgrade adaptif aliran H.265 ke aliran H.264.

  • Jika Anda tidak mengaktifkan layanan pemutaran adaptif, SDK pemutar masih dapat secara otomatis menggunakan decoding software ketika decoding hardware gagal.

Contoh kode berikut menjelaskan cara mengonfigurasi aliran sekunder:

// Create a map on the application layer to store the primary stream URLs and secondary stream URLs as key-value pairs. The system queries the corresponding secondary URL based on the primary stream URL during switching.
 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 "";
        }
    }
});

Streaming bitrate adaptif

Catatan
  • Anda dapat mentranskode video ke aliran bitrate adaptif HTTP Live Streaming (HLS) menggunakan kelompok template transkoding ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat Konfigurasi streaming bitrate adaptif untuk video on demand.

  • Jika Anda menggunakan pemutaran berbasis Vid untuk aliran bitrate adaptif yang ditranskode oleh ApsaraVideo VOD, Anda harus menentukan DEFINITION_AUTO sebagai definisi pemutaran default. Hal ini memungkinkan pemutar memperoleh dan memutar aliran bitrate adaptif. Jika Anda tidak menentukan AUTO sebagai definisi pemutaran default, pemutar secara otomatis memutar aliran video dalam definisi rendah. Untuk informasi lebih lanjut tentang urutan pemutaran berdasarkan definisi video, lihat Definisi video mana yang diputar SDK Pemutar secara default ketika beberapa definisi tersedia?. Contoh kode berikut memberikan contoh cara menentukan definisi pemutaran default untuk pemutaran berbasis VidAuth:

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

SDK ApsaraVideo Player untuk Android mendukung streaming bitrate adaptif aliran video HLS atau DASH. Setelah metode prepare dipanggil, panggil getMediaInfo untuk memperoleh informasi bitrate yang ditunjukkan oleh TrackInfo. Contoh kode:

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

Selama pemutaran, Anda dapat memanggil metode selectTrack untuk mengganti bitrate. Jika Anda menentukan AUTO_SELECT_INDEX, streaming bitrate adaptif diaktifkan. Contoh kode:

int index = trackInfo.getIndex();
// Switch the bitrate.
aliPlayer.selectTrack(index);
// Enable adaptive bitrate streaming.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

Hasil pergantian dikembalikan dalam callback OnTrackChangedListener. Anda harus mengonfigurasi callback OnTrackChangedListener sebelum memanggil selectTrack. Contoh kode:

aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
    @Override
    public void onChangedSuccess(TrackInfo trackInfo) {
        // The bitrate switching is successful.
    }
    @Override
    public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
        // The bitrate switching fails. You can call the errorInfo.getMsg() method to find the cause of the failure.
    }
});

Opsional. Sebelum memanggil metode selectTrack untuk mengganti aliran kode pemutaran ke bitrate adaptif, Anda dapat menentukan parameter config untuk mengatur definisi maksimum bitrate adaptif guna menghindari pergantian otomatis ke bitrate yang tidak diharapkan. Kami menyarankan Anda mengeksekusi kode berikut sebelum pemutar memanggil metode prepare atau pemutar daftar memanggil metode moveTo agar berlaku:

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; //Set the number of pixels that corresponds to the upper limit of adaptive bitrate to 921,600 (length × width= 1280 × 720). This way, the number of pixels that corresponds to the definition is equal to or smaller than this value.
aliPlayer.setConfig(config);

Ambil snapshot

SDK ApsaraVideo Player untuk Android menyediakan metode snapshot untuk mengambil snapshot video. Saat mengambil snapshot, pemutar menyimpan data sumber gambar video dan mengonversinya ke bitmap. Anda kemudian dapat memanggil OnSnapShotListener untuk memperoleh bitmap tersebut. Contoh kode:

// Set the callback for snapshot capture.
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // Obtain the bitmap and the width and height of the video image. 
    }
});
// Capture a snapshot of the current video image.
aliPlayer.snapshot();

Pratinjau

SDK ApsaraVideo Player untuk Android mengintegrasikan konfigurasi khusus ApsaraVideo VOD untuk mendukung pratinjau video. Hanya sumber VidSts dan VidAuth yang dapat dipratinjau. Kami menyarankan Anda hanya mempratinjau sumber VidAuth di ApsaraVideo VOD. Untuk informasi lebih lanjut tentang cara mengonfigurasi dan menggunakan fitur pratinjau, lihat Pratinjau video.

Setelah mengaktifkan fitur pratinjau, Anda dapat memanggil metode VidPlayerConfigGen.setPreviewTime() untuk menentukan durasi pratinjau. Contoh kode berikut memberikan contoh cara menentukan durasi pratinjau untuk pemutaran berbasis VidSts:

VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// Set the preview duration to 20 seconds.
vidSts.setPlayConfig(configGen);// Specify the video source.
...

Saat Anda mengatur durasi pemutaran uji coba dan memutar video menggunakan SDK pemutar Android, server mengembalikan konten segmen uji coba alih-alih konten video lengkap.

Catatan
  • Anda dapat memanggil VidPlayerConfigGen untuk mengonfigurasi parameter permintaan yang didukung oleh server. Untuk informasi lebih lanjut, lihat Deskripsi parameter permintaan.

  • Fitur pratinjau tidak didukung untuk file Flash Video (FLV) dan MP3.

Konfigurasikan blacklist

SDK ApsaraVideo Player untuk Android memungkinkan Anda mengonfigurasi blacklist untuk decoding hardware. Jika decoding hardware tidak diizinkan untuk perangkat tertentu, Anda dapat menggunakan decoding software untuk mencegah kegagalan decoding. Contoh kode:

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

Blacklist menjadi tidak berlaku setelah aplikasi keluar.

Atur Referer

SDK ApsaraVideo Player untuk Android menyediakan kelas PlayerConfig untuk mengatur Referer permintaan. Anda dapat menggunakan Referer bersama dengan daftar putih atau blacklist Referer yang dikonfigurasi di konsol ApsaraVideo VOD untuk mengimplementasikan kontrol akses. Contoh kode berikut memberikan contoh:

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Set the Referer. Example: http://example.aliyundoc.com. You must add the protocol header when you set the Referer.
config.mReferrer = referrer;
....// Configure other settings.
  // Configure the settings for the player.
aliPlayer.setConfig(config);

Tentukan header User-Agent

SDK ApsaraVideo Player untuk Android menyediakan kelas PlayerConfig untuk menentukan user agent permintaan. Setelah menentukan header User-Agent, pemutar menyertakan informasi user agent dalam permintaannya. Contoh kode:

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Set the user agent.
config.mUserAgent = "Required user agent";
....// Configure other settings.
  // Configure the settings for the player.
aliPlayer.setConfig(config);

Atur periode timeout jaringan dan jumlah percobaan ulang

SDK ApsaraVideo Player untuk Android menyediakan kelas PlayerConfig untuk mengatur periode timeout jaringan dan jumlah percobaan ulang. Contoh kode:

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Specify the network timeout period. Unit: millisecond.
config.mNetworkTimeout = 5000;
// Specify the maximum number of retries upon a network timeout. The retry interval equals the timeout period specified by the NetworkTimeout parameter. The NetworkRetryCount parameter specifies the number of retries. A value of 0 indicates zero retry. The application determines the number of retries. Default value: 2.
config.mNetworkRetryCount=2;
....// Configure other settings.
  // Configure the settings for the player.
aliPlayer.setConfig(config);
Catatan
  • Jika Anda mengatur parameter NetworkRetryCount ke nilai selain 0, pemutar mencoba ulang pemutaran saat mulai memuat data karena kesalahan jaringan. Jumlah maksimum percobaan ulang sama dengan nilai parameter NetworkRetryCount. Interval percobaan ulang sama dengan nilai parameter NetworkTimeout.

  • Jika pemuatan berlanjut setelah jumlah maksimum percobaan ulang tercapai, metode onError memanggil callback. Dalam hal ini, metode ErrorInfo.getCode() mengembalikan ErrorCode.ERROR_LOADING_TIMEOUT.

  • Jika Anda mengatur parameter NetworkRetryCount ke 0, metode onInfo memanggil callback saat terjadi timeout jaringan. Dalam hal ini, InfoBean.getCode() mengembalikan InfoCode.NetworkRetry. Untuk menyelesaikan masalah tersebut, Anda dapat memanggil metode reload SDK ApsaraVideo Player untuk Android guna memuat ulang paket jaringan atau melakukan operasi lain yang diperlukan.

Kontrol buffer dan latensi

SDK ApsaraVideo Player untuk Android menyediakan kelas PlayerConfig untuk mengonfigurasi pengaturan buffer dan latensi. Contoh kode:

Tampilkan kode

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Set the maximum latency. This parameter is valid only for live streaming. If the latency is excessively high, Player SDK synchronizes frames to ensure that the latency does not exceed the limit. 
config.mMaxDelayTime = 5000;
// Set the maximum buffer duration. Unit: millisecond. This parameter specifies the maximum buffer duration for the player to load data at a time. 
config.mMaxBufferDuration = 50000;
// Set the peak buffer duration. Unit: millisecond. When the network conditions are poor, the player stops loading data after the peak buffer duration elapses. 
config.mHighBufferDuration = 3000;
// Set the startup buffer duration. Unit: millisecond. A smaller value indicates a shorter startup duration. In this case, the player starts to load data soon after the playback starts. 
config.mStartBufferDuration = 500;
....// Configure other settings.
// Set the maximum cache duration. Unit: millisecond. Default value: 0. 
config.mMaxBackwardBufferDurationMs = 0;

// Configure the settings for the player.
aliPlayer.setConfig(config);

Penting
  • Pastikan durasi buffer memenuhi kondisi berikut: mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration.

  • Jika Anda mengatur durasi buffer maksimum (mMaxBufferDuration) ke nilai lebih dari 5 menit, sistem secara default menggunakan 5 menit untuk mencegah pengecualian memori yang disebabkan oleh ukuran buffer yang berlebihan.

Konfigurasikan header HTTP

SDK ApsaraVideo Player untuk Android menyediakan kelas PlayerConfig untuk menambahkan header HTTP ke permintaan. Contoh kode:

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Define a header.
String[] headers = new String[1];
headers[0]="Host:example.com"; // For example, add the host information to the header. 
// Configure the headers.
config.setCustomHeaders(headers);
....// Configure other settings.
  // Configure the settings for the player.
aliPlayer.setConfig(config);

Gambar-dalam-Gambar (PiP)

Catatan

Untuk contoh kode detail, lihat modul API-Example Pemutaran PiP (PictureInPicture). Proyek ini adalah proyek contoh Android untuk SDK ApsaraVideo Player yang ditulis dalam Java. Ini membantu developer dengan cepat menguasai integrasi inti SDK.

Prosedur:

  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); // Aspect ratio for PiP. Adjust based on your business needs.
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

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

    Pemicu OnClick (event klik)

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Rational aspectRatio = new Rational(16, 9); // Aspect ratio for PiP
            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); // Aspect ratio for PiP
        PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
        pipBuilder.setAspectRatio(aspectRatio);
        enterPictureInPictureMode(pipBuilder.build());
    
        Log.e(TAG, "PiP onUserLeaveHint");
    }

    Pemicu saat kembali ke aplikasi

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // Trigger from back press
        enterPictureInPictureMode();
    }
  3. Tangani UI untuk tampil/sembunyi PiP.

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // Handle entering PiP mode
            // Hide UI
            Log.e(TAG, "Entered PiP mode");
        } else {
            // Handle exiting PiP mode
            // Show UI 
            Log.e(TAG, "Exited PiP mode");
        }
    }

Degradasi Streaming Langsung RTS

Catatan

Untuk contoh kode detail, lihat modul API-Example Streaming langsung RTS ultra-latensi rendah (RtsLiveStream). Proyek ini adalah proyek contoh Android untuk SDK ApsaraVideo Player yang ditulis dalam Java. Ini membantu developer dengan cepat menguasai integrasi inti SDK.

Untuk informasi lebih lanjut, lihat Streaming langsung RTS.

Ganti antara saluran audio kiri dan kanan

SDK ApsaraVideo Player untuk Android menggunakan metode setOutputAudioChannel untuk menentukan saluran audio output. Jika sumber input berisi dua saluran audio, Anda dapat mengganti antara saluran audio kiri dan kanan. Jika sumber input hanya berisi satu saluran audio, konfigurasi outputAudioChannel tidak berlaku.

Catatan

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

/*
Specify OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT to use the left audio channel for playback.
Specify OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT to use the right audio channel for playback.
Specify OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE to use the audio channel settings of the input file.
*/
aliPlayer.setOutputAudioChannel();

Uraikan aliran audio

Anda dapat mengonfigurasi listener untuk memperoleh informasi tentang aliran audio dan video. Aliran audio dan video terenkripsi tidak dapat diuraikan.

Tampilkan kode

// Optional. Specify whether to return the address of the underlying data.
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true;// Specify whether to return only the address of the underlying video data.
config.mAudioDataAddr = true;// Specify whether to return only the address of the underlying audio data.
aliPlayer.setRenderFrameCallbackConfig(config);

// Optional. Return texture_oes_id for RenderFrame after hardware decoding and return the source data for RenderFrame after software decoding.
aliPlayer.enableHardwareDecoder(true);
// Configure a listener to obtain information about audio and video streams.
aliPlayer.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // The video data.
    } else {
        // The audio data.
    }
    return false;
});

Atur Warna Latar Belakang Video

Anda dapat mengatur warna latar belakang pemutar saat menggunakan SDK ApsaraVideo Player untuk Android. Contoh kode berikut memberikan contoh cara mendeklarasikan dan memanggil metode:

Contoh API

/**
 * Set the background color of the video.
 *
 * @param color  ARGB
 *
 */
/****
 * Set video background color
 * @param color  ARGB
 */
abstract public void setVideoBackgroundColor(int color);

Catatan Penggunaan

// The parameter value is an eight-digit hexadecimal ARGB color value. The first two digits of an eight-digit ARGB color value represent alpha, the next two represent red, the next two represent green, and the last two represent blue.
// For example, a value of 0x0000ff00 specifies green.
aliPlayer.setVideoBackgroundColor(0x0000ff00);

Tentukan nama domain untuk pemutaran berbasis vidAuth

Metode vidAuth memungkinkan Anda menentukan bidang seperti nama domain yang terkait dengan vid. Untuk detail tentang bidang yang didukung, lihat Parameter permintaan GetPlayInfo. API dan penggunaannya dijelaskan di bawah ini:

Contoh API

/**
 * Set the playback parameters.
 *
 * @param playConfig The playback parameters.
 */
public void setPlayConfig(VidPlayerConfigGen playConfig);

Catatan penggunaan

Tentukan parameter playDomain saat memanggil addPlayerConfig di VidPlayerConfigGen.

vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// Add the playDomain field. For more information about configurable fields, see:
// 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 decoding H.266

H.266 (VVC/Versatile Video Coding), sebagai standar pengkodean video terbaru, secara signifikan mengurangi bitrate sambil mempertahankan kualitas visual yang sama. Untuk mengoptimalkan performa dan mengontrol ukuran SDK utama, kemampuan decoding H.266 dikemas sebagai plugin terpisah untuk integrasi sesuai permintaan.

Prasyarat

  1. Versi SDK pemutar atau all-in-one adalah V7.6.0 atau yang lebih baru.

  2. Anda telah memperoleh lisensi Edisi Profesional. Untuk detailnya, lihat Dapatkan lisensi SDK Pemutar.

  3. ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung pemutaran video H.266 yang dikodekan oleh transkoding ApsaraVideo VOD.

Integrasikan plugin

SDK Pemutar

Integrasi Maven (disarankan)

Tambahkan dependensi untuk versi plugin yang ditentukan ke file build.gradle aplikasi Anda:

Catatan

Untuk versi terbaru SDK ApsaraVideo Player, lihat Riwayat rilis SDK Android.

// x.x.x must match the Player SDK version number
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

Integrasi lokal

Unduh versi terbaru SDK ApsaraVideo Player dan salin paket AlivcVVCCodec ke direktori libs proyek Anda (buat direktori libs secara manual jika belum ada). Untuk informasi lebih lanjut, lihat Integrasi lokal.

SDK all-in-one

Integrasi Maven

Tambahkan dependensi untuk versi plugin yang ditentukan ke file build.gradle aplikasi Anda:

// x.x.x must match the all-in-one SDK version number
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

Aktifkan plugin

Catatan

Mulai dari SDK ApsaraVideo Player V7.7.0, plugin diaktifkan secara default setelah integrasi. Tidak diperlukan aktivasi manual.

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

Kode kesalahan terkait

Untuk kode kesalahan terkait plugin decoding H.266, lihat Masalah umum lintas platform.

Segarkan otomatis sumber pemutaran

Mengaktifkan penyegaran otomatis sumber pemutaran mencegah gangguan pemutaran yang disebabkan oleh kedaluwarsa autentikasi. Fitur ini memicu listener saat sumber kedaluwarsa dan mengambil URL baru untuk memastikan pemutaran video berkelanjutan dan lancar.

Prasyarat

  1. Versi SDK pemutar atau all-in-one adalah V7.9.0 atau yang lebih baru.

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

Sumber VidAuth

Contoh antarmuka

/**
 * Set the VidAuth source expiration listener.
 *
 * This feature enables automated VidAuth source refresh to avoid playback interruptions
 * caused by expiration. When the listener is triggered, you can refresh the VidAuth source
 * and return the updated VidAuth using {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener The interface for listening to VidAuth source expiration events. See {@link OnVidAuthExpiredListener}.
 */
/****
 * Sets the listener for VidAuth source expiration events.
 *
 * This feature enables automated VidAuth source refresh to avoid playback interruptions
 * caused by expiration. When the listener is triggered, you can refresh the VidAuth source
 * and return the updated VidAuth using {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener The interface for listening to VidAuth source expiration events. See {@link OnVidAuthExpiredListener}.
 *
 */
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);

Komposisi fitur

Komposisi fitur

/**
 * VidAuth source expiration notification listener, used to handle VidAuth source expiration events.
 */
/****
 * Listener for VidAuth source expiration notifications.
 * Handles events when a VidAuth source expires.
 */
public interface OnVidAuthExpiredListener {

    /**
     * Called when the player detects that the VidAuth source has expired.
     *
     * You can refresh the VidAuth source in this callback and return the new VidAuth
     * using {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource The expired VidAuth source object. See {@link VidAuth}.
     * @param callback The callback used to provide the updated VidAuth source to the player. See {@link SourceRefreshCallback}.
     */
    /****
     * Called when the player detects that the VidAuth source has expired.
     *
     * You can refresh the VidAuth source in this callback and return the new VidAuth
     * using {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource The expired VidAuth source object. See {@link VidAuth}.
     * @param callback The callback used to provide the updated VidAuth source to the player. See {@link SourceRefreshCallback}.
     */
    void onVidAuthExpired(VidAuth expiredSource, SourceRefreshCallback<VidAuth> callback);
}

/**
 * Playback source refresh callback interface, used to handle playback source refresh results.
 *
 * This interface is applicable to playback source types that require dynamic updates,
 * such as URL source or VidAuth source. When the player triggers a refresh request,
 * the refresh result can be returned via this interface by invoking either the `onSuccess` or `onError` method.
 */
/****
 * A callback interface for handling playback source refresh results.
 *
 * This interface is applicable to playback source types that require dynamic updates,
 * such as URL source or VidAuth source. When the player triggers a refresh request,
 * the refresh result can be returned via this interface by invoking either the `onSuccess` or `onError` method.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Called by the player when the refresh operation succeeds.
     *
     * @param newSource The new playback source object containing the updated information. See {@link SourceBase}.
     *
     * This method indicates that the refresh operation was successfully completed. Developers should provide
     * the new playback source within this method so that the player can load the latest resource.
     */
    /****
     * Called by the player when the refresh operation succeeds.
     *
     * @param newSource The new playback source object containing the updated information. See {@link SourceBase}.
     *
     * This method indicates that the refresh operation was successfully completed. Developers should provide
     * the new playback source within this method so that the player can load the latest resource.
     */
    void onSuccess(T newSource);

    /**
     * Called by the player when the refresh operation fails.
     *
     * @param errorMsg A string describing the reason for the failure.
     *
     * This method indicates that the refresh operation has failed. Developers can use the `errorMsg`
     * to capture details of the failure and proceed with subsequent handling.
     */
    /****
     * Called by the player when the refresh operation fails.
     *
     * @param errorMsg A string describing the reason for the failure.
     *
     * This method indicates that the refresh operation has failed. Developers can use the `errorMsg`
     * to capture details of the failure and proceed with subsequent handling.
     */
    void onError(String errorMsg);
}

Catatan penggunaan

Anda dapat memperoleh kredensial pemutaran video dengan memanggil operasi GetVideoPlayAuth. Kami menyarankan Anda mengintegrasikan SDK server ApsaraVideo VOD untuk memperoleh kredensial dan menghindari penandatanganan sendiri. Untuk informasi lebih lanjut, lihat Portal OpenAPI.

// Set the VID playback credential expiration listener
aliPlayer.setOnVidAuthExpiredListener(new AliPlayer.OnVidAuthExpiredListener() {
    @Override
    public void onVidAuthExpired(VidAuth vidAuth, UrlPlayer.SourceRefreshCallback<VidAuth> sourceRefreshCallback) {
        
        String vid = vidAuth.getVid();

        // ------------------- User implementation starts -------------------
        // Call your own function to obtain a new PlayAuth from your app server.
        // clinetGetPlayAuthFunction is a sample function name. Replace it with your own implementation.
        clinetGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * Callback for successfully obtaining a new credential.
             * @param newPlayAuth New playback credential string obtained from your server.
             */
            @Override
            public void onAuthSuccess(String newPlayAuth) {                
                // 1. Update the old vidAuth object with the new PlayAuth
                vidAuth.setPlayAuth(newPlayAuth);
                
                // 2. Return the updated object to the player via the SDK callback
                sourceRefreshCallback.onSuccess(vidAuth);
            }

            /**
             * Callback for failing to obtain a new credential.
             * @param errorMessage Detailed error message.
             */
            @Override
            public void onAuthError(String errorMessage) {                
                // Return the error message to the player via the SDK callback
                sourceRefreshCallback.onError(errorMessage);
            }
        });
        // ------------------- User implementation ends -------------------
    }
});

UrlSource sumber

Contoh antarmuka

/**
 * Set the URL source expiration listener.
 *
 * This feature enables URL refresh to avoid playback interruptions caused by
 * URL expiration due to authentication. When the listener is triggered,
 * you can refresh the URL source and return the updated URL source using {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener Listener for handling URL source expiration events. See {@link OnURLSourceExpiredListener}.
 *
 * <p>For more information on configuring URL authentication, see
 * <a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL authentication documentation</a>.</p>
 */
/****
 * Sets the listener for URL source expiration events.
 *
 * This feature enables URL refresh to avoid playback interruptions caused by
 * URL expiration due to authentication. When the listener is triggered,
 * you can refresh the URL source and return the updated URL source using {@link SourceRefreshCallback#onSuccess}.
 *
 * @param listener Listener for handling URL source expiration events. See {@link OnURLSourceExpiredListener}.
 *
 * <p>For more information on configuring URL authentication, see
 * <a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL authentication documentation</a>.</p>
 */
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);

Komposisi fitur

Komposisi fitur

/**
 * Playback source refresh callback interface, used to handle playback source refresh results.
 *
 * This interface is applicable to playback source types that require dynamic updates,
 * such as URL source or VidAuth source. When the player triggers a refresh request,
 * the refresh result can be returned via this interface by invoking either the `onSuccess` or `onError` method.
 */
/****
 * A callback interface for handling playback source refresh results.
 *
 * This interface is applicable to playback source types that require dynamic updates,
 * such as URL source or VidAuth source. When the player triggers a refresh request,
 * the refresh result can be returned via this interface by invoking either the `onSuccess` or `onError` method.
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * Called by the player when the refresh operation succeeds.
     *
     * @param newSource The new playback source object containing the updated information. See {@link SourceBase}.
     *
     * This method indicates that the refresh operation was successfully completed. Developers should provide
     * the new playback source within this method so that the player can load the latest resource.
     */
    /****
     * Called by the player when the refresh operation succeeds.
     *
     * @param newSource The new playback source object containing the updated information. See {@link SourceBase}.
     *
     * This method indicates that the refresh operation was successfully completed. Developers should provide
     * the new playback source within this method so that the player can load the latest resource.
     */
    void onSuccess(T newSource);

    /**
     * Called by the player when the refresh operation fails.
     *
     * @param errorMsg A string describing the reason for the failure.
     *
     * This method indicates that the refresh operation has failed. Developers can use the `errorMsg`
     * to capture details of the failure and proceed with subsequent handling.
     */
    /****
     * Called by the player when the refresh operation fails.
     *
     * @param errorMsg A string describing the reason for the failure.
     *
     * This method indicates that the refresh operation has failed. Developers can use the `errorMsg`
     * to capture details of the failure and proceed with subsequent handling.
     */
    void onError(String errorMsg);
}

/**
 * URL source expiration notification listener, used to process expired sources and prevent playback interruptions.
 */
/****
 * Listener for URL source expiration notifications.
 * This helps process expired sources and prevents playback interruptions.
 */
public interface OnURLSourceExpiredListener {

    /**
     * Called when the player detects that the URL source (UrlSource) has expired.
     *
     * You can refresh the URL source in this callback and return the new UrlSource
     * using {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource The expired UrlSource object. See {@link UrlSource}.
     * @param callback The refresh callback used to return the updated UrlSource to the player. See {@link SourceRefreshCallback}.
     */
    /****
     * Called when the player detects that the URL source (UrlSource) has expired.
     *
     * You can refresh the URL source in this callback and return the new UrlSource
     * using {@link SourceRefreshCallback#onSuccess}.
     *
     * @param expiredSource The expired UrlSource object. See {@link UrlSource}.
     * @param callback The refresh callback used to return the updated UrlSource to the player. See {@link SourceRefreshCallback}.
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

Catatan penggunaan

// Set the URL expiration listener for the player
mAliyunVodPlayer.setOnURLSourceExpiredListener(new UrlPlayer.OnURLSourceExpiredListener() {
    @Override
    public void onUrlSourceExpired(UrlSource urlSource, UrlPlayer.SourceRefreshCallback<UrlSource> sourceRefreshCallback) {
        String expiredUrl = urlSource.getUri();
        Log.d(TAG, "[onUrlSourceExpired] Received expired URL: " + expiredUrl);

        // 1. Check if the authentication key is valid (assuming authenticationKey is a member variable)
        if (authenticationKey == null || authenticationKey.trim().isEmpty()) {
            Log.e(TAG, "Refresh failed: Authentication key is empty.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Authentication key is missing.");
            return; // Invalid key, exit early
        }

        // 2. Calculate the expiration time for the playback URL (validity period)
        // Use the class member validTime if valid, otherwise default to 3600 seconds (1 hour)
        long validityDuration = (AliyunVodPlayerView.this.validTime > 0) ? validTime : 3600;
        long newExpireTime = (System.currentTimeMillis() / 1000) + validityDuration;

        // 3. Extract the original URL from the expired URL (using signing method A as an example)
        // Restore the original resource URL by removing the parameter part (e.g., "?auth_key=")
        int authKeyIndex = expiredUrl.indexOf("?auth_key=");
        if (authKeyIndex == -1) {
            authKeyIndex = expiredUrl.indexOf("&auth_key=");
        }
        // Ensure safe handling even if auth_key is not found
        String originalUrl = (authKeyIndex != -1) ? expiredUrl.substring(0, authKeyIndex) : expiredUrl;

        // 4. Generate a new authenticated URL using the utility class
        String newAuthUrl = CdnAuthUtil.aAuth(originalUrl, authenticationKey, newExpireTime);

        // 5. Check the generated authenticated URL and return the result via the callback
        if (newAuthUrl != null && !newAuthUrl.isEmpty()) {
            Log.i(TAG, "Refresh success, new URL: " + newAuthUrl);
            // Create a UrlSource object and set the new URL as required by the SDK
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "Refresh failed: Failed to generate new authorized URL.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Failed to generate new URL.");
        }
    }
});

Tambahan fungsi utilitas

Ambil metode penandatanganan A sebagai contoh.

Tambahan fungsi utilitas

// Function to generate an authenticated URL
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);
    }
}

// Utility function to calculate 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("MD5 algorithm not found", e);
    }
}

Ganti pengontrol antarmuka jaringan (NIC) yang terikat

SDK ApsaraVideo Player untuk Android menyediakan metode AliPlayerGlobalSettings.enableSwitchNIC untuk secara otomatis mengganti NIC selama anomali jaringan, memastikan pemutaran resource yang stabil. Contoh kode:

Catatan

Metode ini hanya berlaku saat switch diaktifkan dan terdapat beberapa NIC.

AliPlayerGlobalSettings.enableSwitchNIC(true);

Performa

Atur skenario pemutaran

Menyetel skenario pemutaran secara otomatis mengonfigurasi parameter optimal (termasuk pengaturan buffer dan pengalihan fitur) berdasarkan skenario tersebut. Parameter kustom yang ditetapkan melalui antarmuka setConfig tetap berlaku (pengaturan kustom didahulukan).

Catatan
  • Anda dapat melihat konfigurasi parameter dengan memanggil antarmuka getConfig setelah menyetel skenario pemutaran.

Contoh antarmuka

/**
 * Set the player scene.
 *
 * @param scene. 
 */
/****
 * Set the player scene.
 *
 * @param scene. 
 */
abstract public void setPlayerScene(PlayerScene scene);

Skenario pemutaran

public enum PlayerScene {
    /**
     * Scene: none
     */
    /****
     * scene none
     */
    NONE,
    /**
     * Long video scene: applies to videos longer than 30 minutes
     */
    /****
     * long scene: apply to more than 30min
     */
    LONG,
    /**
     * Medium video scene: applies to videos 5 to 30 minutes long
     */
    /****
     * middle scene: apply to 5min-30min
     */
    MEDIUM,
    /**
     * Short video scene: applies to videos up to 5 minutes long
     */
    /****
     * short scene: apply to 0s-5min
     */
    SHORT,
    /**
     * Live streaming scene
     */
    /****
     * live scene
     */
    LIVE,
    /**
     * Ultra-low-latency live streaming scene
     */
    /****
     * RTS live scene
     */
    RTS_LIVE
}

Catatan penggunaan

// Set the short video scene
aliPlayer.setPlayerScene(PlayerScene.SHORT)

// Set the medium video scene
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)

// Set the long video scene
aliPlayer.setPlayerScene(PlayerScene.LONG)

// Set the live streaming scene
aliPlayer.setPlayerScene(PlayerScene.LIVE)

Pre-rendering

SDK ApsaraVideo Player untuk Android mendukung pre-rendering frame pertama sebelum pemutaran dimulai. Hal ini meningkatkan durasi pemuatan startup.

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Anda harus mengonfigurasi View sebelum memanggil Prepare untuk memastikan frame dirender ke View segera setelah persiapan.

  3. Setelah mengaktifkan fitur ini, urutan pemicuan persiapan sukses dan event rendering frame pertama berubah: Tanpa mengaktifkan fitur ini, persiapan sukses dipicu terlebih dahulu, diikuti oleh rendering frame pertama. Dengan fitur ini diaktifkan, rendering frame pertama mungkin dipicu sebelum persiapan sukses karena perbedaan kecepatan decoding dan rendering. Hal ini tidak memengaruhi pemutaran.

Berikut adalah contohnya:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

Cache lokal

Catatan

Untuk contoh kode detail, lihat modul API-Example Preload video (Preload). Proyek ini adalah proyek contoh Android untuk SDK ApsaraVideo Player yang ditulis dalam Java. Ini membantu developer dengan cepat menguasai integrasi inti SDK.

SDK ApsaraVideo Player untuk Android memungkinkan Anda menyimpan cache video selama pemutaran. Hal ini mengurangi waktu pemuatan startup, mempercepat proses pencarian, mengurangi latensi pemutaran, dan mengurangi konsumsi trafik selama putar ulang berulang.

Aktifkan caching lokal

Fitur cache lokal dinonaktifkan secara default. Untuk menggunakannya, Anda harus mengaktifkannya secara manual. Ini dikontrol oleh enableLocalCache di AliPlayerGlobalSettings. Berikut adalah contohnya:

Tampilkan kode

// Enable local caching (default path)
AliPlayerGlobalSettings.enableLocalCache(true, this);

/**
 *  You can also use the following code to configure caching.
 *  Enable local caching. After this feature is enabled, a media file is cached on your device. 
 *  @param enable: Specifies whether to enable the local caching feature. Valid values: true and false. true indicates that the local caching feature is enabled and false indicates that the local caching feature is disabled. Default value: false. 
 *  @param maxBufferMemoryKB: This parameter is deprecated in V5.4.7.1 or later.
 *  @param localCacheDir: Required. The directory of the cached file, which is an absolute path. 
 *  AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * Configure settings for clearing cached files. 
 * @param expireMin - This parameter is deprecated in V5.4.7.1 or later. 
 * @param maxCapacityMB - The maximum size of cached data. Unit: MB. By default, the maximum size of cached data is 20 GB. If the specified maximum size is exceeded, the system deletes cached files based on the time when the file is cached until the size of the cached data is less than or equal to the specified maximum size. During this process, the system preferentially deletes the earliest cache files. 
 * @param freeStorageMB - The minimum free space of the disk. Unit: MB. Default value: 0. If the idle space of the disk is less than the specified minimum space, the system deletes cached files based on the time when the file is cached until the idle space of the disk is greater than or equal to the specified minimum space. During this process, the system preferentially deletes the earliest cache files. 
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * Configure the callback for the URL hash value of a video file. If you do not configure the callback, the SDK calculates the URL hash value using the MD5 algorithm. 
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
Catatan
  • Jika URL pemutaran file video berisi parameter autentikasi, nilai parameter autentikasi berubah selama caching lokal dan pemutaran file video. Anda dapat memanggil operasi setCacheUrlHashCallback untuk menghitung nilai hash MD5 setelah menghapus parameter autentikasi. Misalnya, http://****.mp4?aaa adalah URL pemutaran file video yang berisi parameter autentikasi. Dalam hal ini, URL http://****.mp4 digunakan untuk menghitung nilai hash MD5 saat file video dimuat. Namun, jika Anda menghitung nilai hash MD5 setelah menghapus parameter autentikasi di URL kunci video M3U8 terenkripsi, pemutaran gagal karena video yang berbeda terkena URL kunci yang sama. Solusi: Hapus parameter autentikasi hanya dari URL pemutaran http(s)://xxxxx.m3u8?aaaa tetapi bukan URL kunci http(s)://yyyyy?bbbb di callback setCacheUrlHashCallback.进阶功能-本地缓存.png

  • Jika server menyajikan file media yang sama melalui HTTP dan HTTPS, Anda dapat menghapus header permintaan atau menstandarkannya sebelum menghitung nilai hash. Misalnya:

    • Jika URL pemutaran file video adalah https://****.mp4 dan http://****.mp4, nilai hash MD5 dihitung menggunakan ****.mp4 saat file video dimuat.

    • Jika URL pemutaran file video adalah https://****.mp4, nilai hash MD5 dihitung menggunakan URL http://****.mp4 saat file video dimuat.

  • Untuk SDK ApsaraVideo Player V5.5.4.0 atau yang lebih baru, jika Anda ingin memutar aliran HLS yang URL pemutarnya berisi parameter autentikasi, konfigurasikan PlayerConfig.mEnableStrictAuthMode untuk menentukan mode autentikasi. Untuk versi lama, nilai defaultnya false. Untuk V7.13.0 atau yang lebih baru, nilai defaultnya true.

    • false: menyimpan cache informasi autentikasi. Jika video tidak sepenuhnya di-cache, pemutar mengirim permintaan penandatanganan URL menggunakan informasi autentikasi yang di-cache saat Anda memutar konten video yang belum di-cache. Jika periode validitas URL yang ditandatangani pendek, atau jika Anda melanjutkan pemutaran setelah jeda panjang, autentikasi mungkin kedaluwarsa. Dalam hal ini, integrasikan fitur segarkan otomatis sumber pemutaran untuk menangani kedaluwarsa autentikasi.

    • Autentikasi ketat (true): Autentikasi tidak di-cache dan dilakukan setiap kali pemutaran dimulai. Tanpa koneksi jaringan, pemutaran akan gagal.

Aktifkan atau nonaktifkan caching lokal untuk satu URL

Anda dapat mengaktifkan atau menonaktifkan caching lokal untuk satu URL di player config.

// Obtain the configuration information.
PlayerConfig config = aliPlayer.getConfig();
// Configure whether to enable local caching for the playback URL. Default value: true. Local caching for the URL takes effect only when local caching is enabled in AliPlayerGlobalSettings and the value of this parameter is true. If the value of this parameter is false, the local caching for the URL is disabled. 
config.mEnableLocalCache = false;
....// Configure other settings.

// Configure the settings for the player.
aliPlayer.setConfig(config);

Preload

SDK ApsaraVideo Player untuk Android mendukung preload video, yang merupakan peningkatan dari fitur caching lokal. Fitur preload video memungkinkan Anda menentukan ukuran maksimum memori yang dapat ditempati oleh video yang di-cache. Hal ini membantu mengurangi durasi pemuatan startup.

Fitur ini memiliki batasan berikut:

  • Anda hanya dapat melakukan preload satu file MP4, MP3, FLV, atau HLS sekaligus.

Catatan

Secara default, penjadwalan resource jaringan diaktifkan saat Anda menggunakan SDK ApsaraVideo Player untuk Android melakukan preload video. Hal ini memastikan kualitas video yang sedang diputar. Jika penjadwalan resource jaringan diaktifkan, permintaan preload hanya dikirim setelah konten buffer video yang sedang diputar mencapai batas tertentu. Anda dapat menonaktifkan penjadwalan resource jaringan jika ingin mengelola permintaan preload real-time.

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. Aktifkan fitur caching lokal. Untuk informasi lebih lanjut, lihat Konfigurasikan caching lokal.

  2. Konfigurasikan sumber data.

    VidAuth (disarankan)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Vid information");// Required. The ID of the video. 
    vidAuth.setPlayAuth("<yourPlayAuth>");// Required. The playback credential, which is generated by calling GetVideoPlayAuth. 
    vidAuth.setRegion("Access region");// For Player SDK V5.5.5.0 or later, this parameter is deprecated. The player automatically parses the region information. For Player SDK V5.5.5.0 or earlier, this parameter is required. Specify the ID of the region in which ApsaraVideo VOD is activated for this parameter. Default value: cn-shanghai. 
    vidAuth.setQuality("Selected definition") //"AUTO" indicates adaptive bitrate

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid information");// Required. The ID of the video. vidSts.setAccessKeyId("<yourAccessKeyId>");// Required. The AccessKey ID that is generated when the temporary STS token is issued. To generate the AccessKey ID, call the AssumeRole operation in STS.  vidSts.setAccessKeySecret("<yourAccessKeySecret>");// Required. The AccessKey secret that is generated when the temporary STS token is issued. To generate the AccessKey secret, call the AssumeRole operation in STS.  vidSts.setSecurityToken("<yourSecurityToken>");// Required. The STS token. To obtain the STS token, call the AssumeRole operation in STS.  vidSts.setRegion("Access region");// Required. The region in which ApsaraVideo VOD is activated. Default value: cn-shanghai.
    vidSts.setQuality("Selected definition") //"AUTO" indicates adaptive bitrate

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("Playback URL");// Required. The playback URL can be the URL of an audio file or video file in ApsaraVideo VOD or on a third-party video-on-demand (VOD) platform.
  3. Konfigurasikan parameter tugas.

    Catatan

    Ini hanya berlaku untuk video multi-bitrate. Pilih salah satu dari setDefaultBandWidth, setDefaultResolution, dan setDefaultQuality.

    PreloadConfig preloadConfig = new PreloadConfig();
    // Set the bitrate for multi-bitrate streams
    preloadConfig.setDefaultBandWidth(400000);
    // Set the resolution for multi-bitrate streams
    preloadConfig.setDefaultResolution(640 * 480);
    // Set the quality for multi-bitrate streams
    preloadConfig.setDefaultQuality("FD");
    // Set the preload duration
    preloadConfig.setDuration(1000);
  4. Tambahkan listener tugas.

    Tampilkan kode

    /**
     * Preload listener implementation
     */
    private static class PreloadListenerImpl extends OnPreloadListener {
    
        @Override
        public void onError(@NonNull String taskId, @NonNull String urlOrVid, @NonNull ErrorInfo errorInfo) {
            // Loading failed
        }
    
        @Override
        public void onCompleted(@NonNull String taskId, @NonNull String urlOrVid) {
            // Loading completed
        }
    
        @Override
        public void onCanceled(@NonNull String taskId, @NonNull String urlOrVid) {
           // Loading canceled
        }
    }
  5. Buat tugas dan tambahkan ke instans MediaLoaderV2 untuk memulai preload.

    VidAuth (disarankan)

    // Build the preload task
    PreloadTask mPreloadTask = new PreloadTask(vidAuth, preloadConfig);
    // Get the MediaLoaderV2 instance
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Add the task and start preloading
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)

    VidSts

    // Build the preload task
    PreloadTask mPreloadTask = new PreloadTask(vidSts, preloadConfig);
    // Get the MediaLoaderV2 instance
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Add the task and start preloading
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl);

    UrlSource

    // Build the preload task
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // Get the MediaLoaderV2 instance
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Add the task and start preloading
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)
  6. Opsional: Kelola tugas.

    mediaLoaderV2.cancelTask(taskId);// Cancel the preload task with the specified task ID
    mediaLoaderV2.pauseTask(taskId);// Pause the preload task with the specified task ID
    mediaLoaderV2.resumeTask(taskId);// Resume the preload task with the specified task ID
  7. Opsional: Hapus file yang dimuat.

    Anda dapat menghapus file yang dimuat untuk menghemat ruang. SDK ApsaraVideo Player untuk Android tidak menyediakan metode untuk menghapus file yang dimuat. Anda harus menghapus file di direktori yang sesuai dalam aplikasi Anda.

Preload dinamis

Fitur preload dinamis memungkinkan Anda mengelola cache video yang sedang diputar dan video yang dipreloads. Anda juga dapat mengontrol jumlah video yang dipreloads. Hal ini membantu menjaga keseimbangan antara pengalaman pemutaran dan biaya.

Tampilkan kode

// Enable recommended configuration and dynamic preloading
aliListPlayer.setPreloadScene(IListPlayer.SceneType.SCENE_SHORT);

// Configure baseline preload duration
// Set the preload duration to 1,000 milliseconds
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// Configure the number of videos to preload. Forward and backward preloading are supported.
// 1 specifies the number of videos to preload forward. 3 specifies the number of videos to preload backward.
aliListPlayer.setPreloadCount(1, 3);

// Configure decreasing offset for dynamic preloading
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

Anda dapat melakukan preload video dalam definisi yang sama dengan aliran video saat ini saat memanggil metode listPlayer selama pemutaran video HLS multi-bitrate. Anda dapat menggunakan mode preload berbeda sesuai kebutuhan.

Perluas untuk melihat pola preload yang didukung

  /**
   * The default bitrate for playback and preloading.
   */
  /****
   * default mode, play and preload default bitrate of a stream
   */
  MultiBitratesMode_Default(0),

  /**
   * The preloading mode in which the first frame performance has a higher priority. In this case, the preloaded video is played by default.
   */
  /****
   * First frame cost (FC) priority, decrease first frame cost. only play bitrate of the hls stream which has been preloaded.
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * The preloading mode in which the first frame performance and playback smoothness have the same priority. In this case, the same bitrate is used before and after you call the moveToNext method to switch videos.
   */
  /****
   * First frame and play smooth, play the same bitrate before and after moveToNext
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * The preloading mode in which the playback smoothness has a higher priority. In this case, the bitrate of the previous video is used by default.
   */
  /****
   * Play Smooth priority, play the same bitrate before and after moveToNext.
   */
  MultiBitratesMode_SmoothPrio(3);

Tampilkan kode integrasi

// Specify the multi-bitrate preloading mode.
aliListPlayer.SetMultiBitratesMode(preLoadMode);


// Optional. Set the starting bitrate.
aliListPlayer.setDefaultBandWidth(defaultBandWidth)


// Optional. In the onPrepared callback, specify the abr mode.
aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
    @Override
    public void onPrepared() {
        //abr only effect on multiBitrate m3u8
        aliListPlayer.selectTrack(-1);
    }
});

Peroleh kecepatan unduh

SDK ApsaraVideo Player untuk Android menyediakan metode getExtraValue untuk mengkueri kecepatan unduh video tertentu. Callback onInfo dipanggil untuk memperoleh hasil kueri. Contoh kode:

aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
            // The download speed.
            long extraValue = infoBean.getExtraValue();
        }
    }
});

Atribut Jaringan

HTTPDNS

Fitur HTTPDNS menggunakan teknologi resolusi DNS untuk mengirim permintaan resolusi nama domain ke server HTTPDNS tertentu dan memperoleh hasil resolusi dengan cepat dan stabil. Hal ini mencegah pembajakan DNS.

SDK ApsaraVideo Player menyediakan layanan HTTPDNS untuk nama domain yang dipercepat oleh Alibaba Cloud CDN. Anda dapat menggunakan fitur HTTPDNS yang disempurnakan untuk mengimplementasikan penjadwalan tepat dan memastikan hasil resolusi domain real-time segera berlaku. Hal ini meningkatkan performa jaringan.

Contoh kode untuk menggunakan fitur HTTPDNS yang disempurnakan

Anda hanya dapat menggunakan fitur HTTPDNS yang disempurnakan untuk nama domain yang dipercepat. Sebelum menggunakan fitur tersebut, pastikan nama domain yang dipercepat telah ditambahkan dan dikonfigurasi. Untuk informasi lebih lanjut tentang cara menambahkan dan mengonfigurasi nama domain untuk CDN di ApsaraVideo VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi lebih lanjut tentang nama domain yang dipercepat, lihat Apa itu Alibaba Cloud CDN?.

// Enable the enhanced HTTPDNS feature.
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// Optional. Add an HTTPDNS pre-resolved domain name.
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");

HTTP/2

Catatan

Secara default, HTTP/2 diaktifkan untuk SDK ApsaraVideo Player untuk Android V5.5.0.0 atau yang lebih baru.

SDK ApsaraVideo Player untuk Android mendukung HTTP/2. Anda dapat mengaktifkan HTTP/2 untuk mengimplementasikan multiplexing permintaan. Hal ini mencegah blocking head-of-line (HOL) dan meningkatkan performa pemutaran. Contoh kode:

AliPlayerGlobalSettings.setUseHttp2(true);

Buat koneksi TCP sebelum permintaan pemutaran diinisiasi melalui HTTP

Anda dapat membuat koneksi Transmission Control Protocol (TCP) sebelum permintaan pemutaran diinisiasi melalui HTTP. Hal ini mengurangi waktu tunggu, memastikan ketepatan waktu dan konsistensi pemutaran video, meningkatkan pengalaman pengguna, dan mengoptimalkan penggunaan resource jaringan dan sistem. Contoh kode:

// Specify the domain parameter in the host[:port] format. Separate multiple domain names with semicolons (;). The port parameter is optional.
// Configure globally.
// Add or delete TCP connections. If you specify an empty string, no TCP connections are created.
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

Unduh Video

Catatan

Untuk contoh kode detail, lihat modul API-Example Unduh video dan pemutaran offline (Download). Proyek ini adalah proyek contoh Android untuk SDK ApsaraVideo Player yang ditulis dalam Java. Ini membantu developer dengan cepat menguasai integrasi inti SDK.

SDK ApsaraVideo Player untuk Android memungkinkan Anda mengunduh video ke perangkat lokal untuk pemutaran offline di ApsaraVideo Player. Mode unduh normal dan mode unduh aman didukung.

  • Unduh normal

    Video yang diunduh dalam mode unduh normal tidak dienkripsi oleh Alibaba Cloud dan dapat diputar menggunakan pemutar pihak ketiga.

  • Unduh aman

    Video yang diunduh dalam mode unduh aman dienkripsi oleh Alibaba Cloud. Anda tidak dapat menggunakan pemutar pihak ketiga untuk memutar video yang diunduh. Anda hanya dapat menggunakan ApsaraVideo Player untuk memutarnya.

Catatan penggunaan

  • Anda hanya dapat mengunduh video yang diputar berdasarkan VidSts atau VidAuth.

  • Untuk menggunakan fitur unduh video, Anda harus mengaktifkan fitur tersebut dan mengonfigurasi mode unduh di konsol ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat Unduh offline.

  • Anda dapat melanjutkan unduhan video.

Prosedur

  1. Opsional. Konfigurasikan file keamanan untuk verifikasi enkripsi. Anda hanya perlu mengonfigurasi file keamanan saat menggunakan mode unduh aman.

    Catatan

    Pastikan informasi dalam file keamanan untuk verifikasi enkripsi sesuai dengan informasi aplikasi. Jika tidak, unduhan video gagal.

    Jika Anda menggunakan mode unduh aman, Anda harus mengonfigurasi file kunci yang dihasilkan di konsol ApsaraVideo VOD di SDK Pemutar. File kunci digunakan untuk mendekripsi dan memverifikasi video untuk diunduh dan diputar. Untuk informasi lebih lanjut tentang cara menghasilkan file kunci, lihat bagian Aktifkan unduh aman dalam topik "Konfigurasikan pengaturan unduh".

    Kami menyarankan Anda mengonfigurasi pengaturan ini hanya sekali dalam aplikasi. Contoh berikut menunjukkan cara melakukannya:

    PrivateService.initService(getApplicationContext(),  "The path in which the encryptedApp.dat file is stored"); // We recommend that you store the encryptedApp.dat file on your mobile phone and set this parameter to the path in which the file is stored.
  2. Buat dan konfigurasikan pengunduh video.

    Buat pengunduh menggunakan AliDownloaderFactory. Contoh kode:

    AliMediaDownloader mAliDownloader = null;
    ......
    // Create a downloader.
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // Set the path for storing downloaded files.
    mAliDownloader.setSaveDir("The storage path");
  3. Konfigurasikan listener.

    Pengunduh menyediakan beberapa listener. Contoh kode:

    Tampilkan kode

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // Listen for the preparation of the content to be downloaded.
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           // Listen for the percentage of the download progress.
       }
       @Override
       public void onProcessingProgress(int percent) {
           // Listen for the percentage of the processing progress.
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           // Listen for download errors.
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           // Listen for a successful download.
       }
    });
  4. Siapkan sumber unduhan.

    Anda dapat memanggil metode prepare untuk menyiapkan sumber unduhan. Sumber VidSts dan VidAuth didukung. Contoh kode:

    • VidSts

      // Create a VidSts instance.
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Vid information"); // The video ID (VideoId).
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // The AccessKey ID of the temporary STS AccessKey pair. You must generate this by calling the AssumeRole operation of Security Token Service (STS).
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // The AccessKey secret of the temporary STS AccessKey pair. You must generate this by calling the AssumeRole operation of Security Token Service (STS).
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // The Security Token Service (STS) token. You must generate this by calling the AssumeRole operation of Security Token Service (STS).
      aliyunVidSts.setRegion("Region where the video-on-demand service is deployed"); // The region where the video-on-demand service is deployed. Default value: cn-shanghai.
      // If you have enabled HLS encryption parameter pass-through in the VOD console and the default parameter name is MtsHlsUriToken, you must configure VidPlayerConfigGen and pass it to vid. For more information, see the following example.
      // If you have not enabled HLS encryption parameter pass-through in the VOD console, you do not need to integrate the following code.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      aliyunVidSts.setPlayerConfig(vidConfig);
      
      // Prepare the download source.
      mAliDownloader.prepare(aliyunVidSts);
    • VidAuth

      // Create the VidAuth download source.
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("Video ID"); // The video ID. 
      vidAuth.setPlayAuth("<yourPlayAuth>");// The playback credential, which is generated by calling GetVideoPlayAuth. 
      vidAuth.setRegion("Access region"); // This parameter is deprecated in ApsaraVideo Player SDK V5.5.5.0 or later. If you use ApsaraVideo Player SDK V5.5.5.0 or later, the player automatically parses the region information. If you use ApsaraVideo Player SDK V5.5.5.0 or earlier, this parameter is required. Specify the ID of the region in which ApsaraVideo VOD is activated for this parameter. Default value: cn-shanghai. 
      // If you have enabled parameter pass-through for HLS encryption in the ApsaraVideo VOD console and the default parameter name is MtsHlsUriToken, you need to set the config parameter and pass it to the VID. For more information, see the following code.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // Prepare the download source.
      mAliDownloader.prepare(vidAuth);
    Catatan
    • File output dan file input dalam format yang sama dan tidak dapat diubah.

    • Jika Anda mengaktifkan parameter pass-through untuk enkripsi HLS di konsol ApsaraVideo VOD, parameter defaultnya adalah MtsHIsUriToken. Untuk informasi lebih lanjut, lihat Parameter pass-through untuk enkripsi HLS. Kemudian, atur nilai MtsHIsUriToken ke sumber ApsaraVideo VOD dengan mengikuti kode di atas.

  5. Setelah persiapan berhasil, pilih item untuk diunduh dan mulai mengunduh.

    Setelah persiapan berhasil, callback OnPreparedListener dipanggil. Objek TrackInfo berisi informasi seperti definisi video. Pilih track untuk diunduh. Contoh kode:

    public void onPrepared(MediaInfo mediaInfo) {
        // Preparation succeeded.
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // For example, download the first track.
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // Start downloading.
        mAliDownloader.start();
    }
  6. (Opsional) Perbarui sumber unduhan.

    Sumber VidSts atau VidAuth mungkin kedaluwarsa sebelum unduhan selesai. Oleh karena itu, kami menyarankan Anda memperbarui sumber unduhan sebelum memulai unduhan. Contoh kode:

    // Update the download source.
    mAliDownloader.updateSource(VidSts);
    // Start downloading.
    mAliDownloader.start();
  7. Lepaskan pengunduh setelah unduhan berhasil atau gagal.

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

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

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

    // Delete files through the downloader object.
    mAliDownloader.deleteFile();
    // Delete files through the static method. Returns 0 if successful.
    AliDownloaderFactory.deleteFile("The path of the downloaded folder","Video ID","Video format","Index of the downloaded video");

Langkah selanjutnya

Anda dapat memutar video yang diunduh menggunakan ApsaraVideo Player. Lakukan langkah-langkah berikut:

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

    String path = mAliDownloader.getFilePath();
  2. Atur jalur mutlak file video yang diunduh sebagai sumber URL untuk pemutaran.

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("Playback URL");// Set the absolute path of the downloaded video file. 
            aliPlayer.setDataSource(urlSource);

Mainkan video terenkripsi

SDK ApsaraVideo Player untuk Android memungkinkan Anda memutar video on-demand yang dienkripsi berdasarkan enkripsi HLS, enkripsi privat Alibaba Cloud, atau enkripsi DRM (digital rights management). SDK memungkinkan Anda memutar aliran langsung yang hanya dienkripsi berdasarkan enkripsi DRM. Untuk informasi lebih lanjut tentang cara memutar video terenkripsi, lihat Mainkan video terenkripsi.

Pemutaran Native RTS

SDK Pemutar Android mengintegrasikan SDK Native RTS untuk mengimplementasikan fitur streaming real-time (RTS) secara native. Untuk informasi lebih lanjut, lihat Implementasikan penarikan aliran RTS di Android.

Referensi