Tüm Ürünler
Search
Belge Merkezi

ApsaraVideo VOD:Gelişmiş özellikler

Son Güncelleme:Oct 27, 2026

Oynatma listesi oynatma, altyazı, video indirme ve şifreli oynatma dahil olmak üzere Android Oynatıcı SDK'sının gelişmiş özelliklerini kullanın. API referansı.

Önemli

Demoyu çalıştırmak için indirin ve derleyip çalıştırmak üzere Demoyu çalıştırın bölümündeki talimatları izleyin.

Professional Edition lisans doğrulaması

Not

Bazı oynatıcı özellikleri Professional Edition lisansı gerektirir. Desteklenen özellikleri Oynatıcı SDK özellik ayrıntıları bölümünde kontrol edin. Bu özellikleri kullanmak için Oynatıcı SDK lisansı edinin bölümünde açıklandığı şekilde yetkilendirmeyi tamamlayın.

Uygulama başlamadan veya herhangi bir oynatıcı API'sini çağırmadan önce bir dinleyici ayarlayın:

import com.aliyun.private_service.PrivateService;

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

PremiumBizType numaralandırır profesyonel özellikleri. İlgili bir özelliği kullandığınızda oynatıcı lisansı doğrular ve sonucu bu geri arama üzerinden döndürür. isValid değeri false ise errorMsg neden bilgisini içerir.

Oynatma

Oynatma listesi oynatma

Android Oynatıcı SDK, kısa videolar için başlatma hızını önemli ölçüde artıran ön yükleme özellikli oynatma listesi oynatma desteği sunar.

Yordam

  1. Bir oynatıcı oluşturun.

    AliPlayerFactory sınıfını kullanarak bir AliListPlayer örneği oluşturun. Örnek:

    AliListPlayer aliListPlayer;
    .....
    aliListPlayer = AliPlayerFactory.createAliListPlayer(getApplicationContext());
    aliListPlayer.setTraceId("traceId");  // traceId is a unique identifier for the device or user, typically IMEI or IDFA.
  2. İsteğe bağlı: Dinleyicileri ayarlayın.

    Dinleyiciler isteğe bağlıdır ancak önerilir. Bunlar olmadan olay bildirimlerini alamazsınız. Temel dinleyiciler şunlardır: OnPreparedListener, OnErrorListener, OnCompletionListener, OnLoadingStatusListener ve OnInfoListener.

    Kodu görüntülemek için genişletin

    aliListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            // Playback completed.
        }
    });
    aliListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // Error occurred.
        }
    });
    aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Preparation succeeded.
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // Video resolution changed.
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // First frame rendered.
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // Other information events. Type includes: loop playback started, buffer position, current playback position, autoplay started, etc.
        }
    });
    aliListPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            // Buffering started.
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            // Buffering progress.
        }
        @Override
        public void onLoadingEnd() {
            // Buffering ended.
        }
    });
    aliListPlayer.setOnSeekCompleteListener(new IPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete() {
            // Seeking completed.
        }
    });
    aliListPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            // Show subtitle.
        }
        @Override
        public void onSubtitleHide(long id) {
            // Hide subtitle.
        }
    });
    aliListPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            // Audio/video stream or definition switched successfully.
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // Audio/video stream or definition switch failed.
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // Player state changed.
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // Screenshot taken.
        }
    });
  3. Ön yüklenen öğe sayısını ayarlayın.

    Başlatma hızını artırmak için ön yüklenen öğe sayısını ayarlayın. Örnek:

    // Set the number of preloaded items. The total number of loaded items is 1 + count × 2.
    aliListPlayer.setPreloadCount(int count);
  4. Birden fazla oynatma kaynağını ekleyin veya kaldırın.

    Oynatma listesi oynatma Vid (VidSts ve VidPlayAuth) ve UrlSource kaynaklarını destekler. Örnekler:

    • URL: Üçüncü taraf veya Alibaba Cloud VOD oynatma adresi. Bir Alibaba Cloud oynatma adresi elde etmek için GetPlayInfo çağrısı yapın. Adresleri almak ve kendi imzalamanızı önlemek için VOD sunucu SDK'sını entegre edin. Geliştirici Portalı.

    • Vid: Ses ve video kimliği. Sesi veya videoyu yükledikten sonra bu kimliği konsoldan (yol: Medya Kitaplığı > Ses/Video) veya sunucu API'sini (Medya bilgilerini ara) kullanarak elde edebilirsiniz.

    // Add a Vid playback source.
    aliListPlayer.addVid(String videoId, String uid);
    // Add a UrlSource playback source.
    aliListPlayer.addUrl(String url, String uid);
    // Remove a source.
    aliListPlayer.removeSource(String uid);
    Not

    uid, bir videoyu benzersiz şekilde tanımlar. Aynı uid'ye sahip videolar aynı kabul edilir. Oynatma sırasında akış karıştırması oluşursa farklı görünümlerde aynı uid'nin ayarlanıp ayarlanmadığını kontrol edin. uid herhangi bir dize olabilir.

  5. Görüntüleme görünümünü ayarlayın.

    Oynatıcı SurfaceView ve TextureView'i destekler. Birini seçin:

    • SurfaceView'i ayarlayın. Örnek:

      Kodu görüntülemek için genişletin

      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);
          }
      });
    • TextureView'i ayarlayın. Örnek:

      Kodu görüntülemek için genişletin

      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. Bir video kaynağını oynatın.

    Bir veya daha fazla oynatma kaynağı ekledikten ve otomatik oynatmayı etkinleştirdikten sonra belirli bir video kaynağını otomatik olarak oynatmak için moveTo yöntemini çağırın. Örnek:

    Kodu görüntülemek için genişletin

    // Enable autoplay.
    aliListPlayer.setAutoPlay(true);
    
    // Use this method for URL sources.
    aliPlayer.moveTo(String uid);
    // Use this method for Vid sources. You must pass stsInfo, which includes the STS temporary credentials and temporary AccessKey pair. Obtain these credentials in advance. For more information, see Create a RAM role and perform STS temporary authorization.
    aliPlayer.moveTo(String uid, StsInfo info);
  7. Önceki veya sonraki videoyu oynatın.

    • Bir video kaynağını oynatmak için moveTo yöntemini çağırdıktan sonra önceki veya sonraki videoyu oynatmak için moveToPrev ve moveToNext yöntemlerini çağırın; burada moveTo tarafından belirtilen video kaynağı referans noktası olarak kullanılır. Örnek:

      Not

      Aynı view temelinde moveTo, moveToNext veya benzeri yöntemleri çağırarak video kaynaklarını değiştirirken titreme veya siyah ekran oluşabilir. Bu durumda listPlayer başlatılırken PlayerConfig alanı mClearFrameWhenStop değerini false olarak yapılandırın ve ayarı uygulamak için setConfig yöntemini çağırın.

      Kodu görüntülemek için genişletin

      // Enable autoplay.
      aliListPlayer.setAutoPlay(true);
      
      // Move to the next video. Note: This method applies only to URL sources and not to Vid playback.
      aliListPlayer.moveToNext();
      // Move to the previous video. Note: This method applies only to URL sources and not to Vid playback.
      aliListPlayer.moveToPrev();
      // Move to the next video. Note: This method applies only to Vid playback.
      aliListPlayer.moveToNext(StsInfo info);
      // Move to the previous video. Note: This method applies only to Vid playback.
      aliListPlayer.moveToPrev(StsInfo info);
Not

Daha iyi bir oynatma listesi oynatma deneyimi için kısa drama çözümünü kullanın. Kısa drama istemci geliştirmesi.

Şeffaflığa sahip videoların oynatılması

Özellik genel bakışı

ApsaraVideo Player SDK, şeffaf hediye animasyonları için alfa kanalı işlemeyi destekler. Canlı yayın senaryolarında bu animasyonlar canlı içeriği örtmeden oynatılır.

Sınırlamalar

Entegre SDK sürümü 6.8.0 veya üzeri ya da Oynatıcı SDK sürümü 6.9.0 veya üzeri şeffaf işlemeyi destekler.

Avantajlar

Şeffaflığa sahip MP4 videoları, APNG veya IXD ile karşılaştırıldığında daha iyi animasyon kalitesi, daha küçük dosya boyutu, daha yüksek uyumluluk ve geliştirme verimliliği sağlar.

  1. Daha iyi animasyon kalitesi: MP4, orijinal ayrıntıları ve renkleri APNG veya IXD'den daha doğru korur.

  2. Daha küçük dosya boyutu: MP4 daha verimli sıkıştırma sağlayarak yükleme hızını artırır ve bant genişliği tüketimini azaltır.

  3. Daha yüksek uyumluluk: MP4, cihazlar ve tarayıcılar arasında evrensel olarak desteklenir.

  4. Daha yüksek geliştirme verimliliği: Geliştiricilerin karmaşık ayrıştırma ve işleme mantığını uygulamasına gerek kalmaz.

Örnek kod

Aşağıdaki arayüzü ekleyin: Alfa modunu ayarlayın (video varlığında alfa kanalının konumu: üst, alt, sol, sağ). Varsayılan değer None'dır.

Not
  • Varlıktaki alfa kanalının konumu setAlphaRenderMode parametre ayarıyla eşleşmelidir.

  • playerview boyutu, varlığın çözünürlüğüyle orantılı olmalıdır.

/**
 * Set alpha render mode.
 *
 * @param alphaRenderMode The specified alpha render mode. See {@link AlphaRenderMode}.
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------View usage-------------
// For View, transparency must be set.
//TextureView
TextureView aliplayerView; // View used for playback.
aliplayerView.setOpaque(false);

//SurfaceView
SurfaceView aliplayerView; // View used for playback.
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); // Place SurfaceView at the top of the display window.

//-----------AliPlayer usage-----------
// Set alpha mode.
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// Set the asset corresponding 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 transition issues occur after single-instance playback completes, clear the screen.
        aliPlayer.clearScreen();
    }
}
aliPlayer.setAutoPlay(true);
aliPlayer.prepare();

Harici altyazılar

Not

Ayrıntılı kod örnekleri için API-Example Harici altyazı gösterimi ve geçişi (ExternalSubtitle) modülüne bakın. Android için ApsaraVideo Player SDK'sına yönelik bu Java tabanlı örnek proje, geliştiricilerin çekirdek SDK entegrasyon özelliklerini hızlıca öğrenmesine yardımcı olur.

Android Oynatıcı SDK, SRT, SSA, ASS ve VTT formatlarında harici altyazı ekleme ve değiştirme desteği sunar.

  1. Altyazıları görüntülemek için bir görünüm oluşturun.

    Altyazı formatına göre farklı görünümler oluşturun.

    Kodu görüntülemek için genişletin

    // For displaying SRT and VTT subtitles.
    SubtitleView subtitleView = new SubtitleView(getContext());
    // For player V7.6.0 and later, we recommend using VttSubtitleView to display SRT and VTT subtitles.
    VttSubtitleView vttSubtitleView = new VttSubtitleView(getContext());
    // For displaying ASS and SSA subtitles.
    AssSubtitleView assSubtitleView = new AssSubtitleView(getContext());
    // Add the subtitle view to the layout.
    viewGroup.addView(assSubtitleView);

    Oynatıcı V7.6.0 veya sonrasını entegre ederken ve SRT ile VTT altyazılarını görüntülemek için VttSubtitleView kullanırken aşağıdaki dinleyiciyi ayarlayın:

    // Required for player 7.6.0 and 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. Altyazı ekleyin.

    Önemli

    Altyazı dosyalarını onPrepared geri çağırmasında ayarlayın.

    mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // Set subtitles (must be done in onPrepared).
            mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL);
        }
    });
  3. Altyazı ile ilgili dinleyicileri ayarlayın.

    Kodu görüntülemek için genişletin

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

Harici altyazılar (işleme bileşenlerine dayalı özel işleme)

WebVTT harici altyazıları için tam destek, VttSubtitleView ve WebVttResolver kullanılarak uygulanır; bu, altyazı yazı tipi boyutu, rengi ve belirli yazı tiplerinin esnek şekilde özelleştirilmesine olanak tanır.

Not

Uygulanabilir senaryolar:

  • WebVTT altyazı stillerini özelleştirme.

  • ApsaraVideo Player SDK sürüm 7.11.0 veya sonrasını entegre etme.

Önemli

Ön koşullar:

  • Yazı tipi dosyaları (.ttf), projenizin assets/fonts/ dizinine yerleştirilir.

  • Proje minSdk ≥ 21 (önerilir).

  • Altyazı dinleyicileri eklenir ve WebVTT içeriği alınabilir.

  1. CustomStyleWebVttResolver oluşturun ve WebVttResolver uygulayın.

    public class CustomStyleWebVttResolver extends WebVttResolver {
    
        // Implement creation method.
        public CustomStyleWebVttResolver(Context context) {
            super(context);
            // Initialize fonts and other resources here later.
        }
    }
  2. Stilleri özelleştirmek için applyTextSpans yöntemini geçersiz kılın.

    Bu yöntem, üst sınıf temel stilleri ayrıştırdıktan sonra çağrılır ve altyazıların ikincil işlenmesine olanak tanır.

    • Yöntem 1: VttContentAttribute değerini değiştirin ve üst sınıf yöntemini çağırın.

      /**
       * Override text style application logic to implement custom style effects.
       * This method is called after the parent class parses basic styles, allowing secondary processing of font size, color, and other attributes.
       *
       * @param spannableStringBuilder Used to build styled text.
       * @param vttContentAttribute Style attribute object for the current text segment (includes font, color, size, etc.).
       * @param start Start position for style application (inclusive).
       * @param end End position for style application (exclusive).
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // Set.
          // Save original font size (in px) for later adjustment.
          // Default font size is 0.0533f times 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 parent class method to apply text.
          super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end);
      }
    • WebVTT stillerini doğrudan değiştirmek için SpannableStringBuilder üzerinde doğrudan işlem yapın.

      Önemli

      Bu yöntem, yerel WebVTT stillerinin kaybına neden olabilir.

      /**
       * Override text style application logic to implement custom style effects.
       * This method is called after the parent class parses basic styles, allowing secondary processing of font size, color, and other attributes.
       *
       * @param spannableStringBuilder Used to build styled text.
       * @param vttContentAttribute Style attribute object for the current text segment (includes font, color, size, etc.).
       * @param start Start position for style application (inclusive).
       * @param end End position for 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 size.
          spannableStringBuilder.setSpan(
              new AbsoluteSizeSpan(20), // Unit: px.
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // Set relative size.
          // spannableStringBuilder.setSpan(
          //     new RelativeSizeSpan(2.0f), // Multiple of TextView default font size.
          //     start, end,
          //     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          // );
      }
  3. Özel yazı tipleri (Typeface) ayarlayın.

    1. Özel yazı tiplerini asset/fonts/ dizininden yükleyin.

      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. Özel yazı tiplerini altyazılara uygulayın.

      @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.
          // Calling 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);
          }
      }

      Eski Android sürümleriyle uyumluluk: Android P (API 28) ve öncesi sürümlerdeki TypefaceSpan, Typeface nesnesini doğrudan geçirmeyi desteklemediğinden özel bir MetricAffectingSpan oluşturmanız gerekir.

      /**
        * 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 a Typeface object.
      */
      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's font.
            *
            * @param tp TextPaint object used for drawing text.
            */
          @Override
          public void updateDrawState(TextPaint tp) {
              tp.setTypeface(typeface);
          }
      
          /**
            * Update text measurement state.
            * Called during text layout calculation (e.g., width, line breaks) to ensure measurement matches actual drawing.
            *
            * @param p TextPaint object used for measuring text.
            */
          @Override
          public void updateMeasureState(TextPaint p) {
              p.setTypeface(typeface);
          }
      }
  4. Oynatıcı ile entegre edin.

    1. Altyazı görünümünü başlatın.

      // 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. Harici altyazı geri çağırmalarını bağlayın.

      // Set 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);
              }
          }
      });

Yalnızca ses oynatma

Yalnızca ses oynatma elde etmek için video oynatmayı devre dışı bırakın. Prepare çağrısından önce PlayerConfig'i yapılandırın.

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

Yazılım/donanım kod çözücü geçişi

Not

Kod çözme yöntemini oynatma başlamadan önce değiştirin. Oynatma sırasındaki değişiklik etkili olmaz.

Android Oynatıcı SDK, enableHardwareDecoder anahtarıyla H.264 ve H.265 donanım kod çözme desteği sunar. Donanım kod çözme varsayılan olarak etkindir ve başlatma başarısız olursa otomatik olarak yazılım kod çözmeye geri döner. Örnek:

// Enable hardware decoding. Enabled by default.
aliPlayer.enableHardwareDecoder(true);

Oynatıcı donanımdan yazılım kod çözmeye otomatik olarak geçerse onInfo geri çağırmasını tetikler. Örnek:

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

H.265 uyarlamalı oynatma

Cihaz bulut tabanlı H.265 donanım kod çözme kara listesine ekliyse veya H.265 donanım kod çözme başarısız olursa uyarlamalı düşürme tetiklenir: Bir H.264 yedek akışı varsa oynatıcı bunu kullanır; yoksa H.265 yazılım kod çözmeye düşer.

Not
  • Bu özellik, yalnızca istemci-bulut entegre uyarlamalı kod çözme ek hizmetini etkinleştirdiğinizde kullanılabilir. Lisans yetkilendirmesi için bir Yida formu göndererek başvurmanız gerekir.

  • İstemci-bulut entegre uyarlamalı kod çözme ek hizmeti şunları içerir: 1. Bulut tabanlı donanım kod çözme uyumluluk verilerinin dinamik teslimi; 2. H.265 akışlarının H.264 akışlarına uyarlamalı düşürülmesi.

  • SDK, ek hizmeti etkinleştirmeseniz bile donanım kod çözme hatası durumunda otomatik olarak yazılım kod çözmeye geçme yeteneğine sahiptir.

    Yedek akış ayarlama örneği:

// Maintain a Map at the application layer to store key-value pairs of original URLs and backup URLs. When switching, query the backup URL in the Map based on the original URL.
 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 "";
        }
    }
});

Ağ uyarlamalı video tanımı geçişi

Not
  • HLS uyarlamalı bit hızı video akışları, ApsaraVideo VOD'daki video paketleme ve transkodlama şablon grubu aracılığıyla oluşturulabilir. Ayrıntılı işlemler için VOD için uyarlamalı bit hızı yapılandırma konusuna bakın.

  • ApsaraVideo VOD transkodlama tarafından oluşturulan uyarlamalı akışlar için Vid oynatma kullanıyorsanız uyarlamalı video akışını almak ve oynatmak için varsayılan oynatma tanımı listesini DEFINITION_AUTO olarak belirtmeniz gerekir. Aksi takdirde oynatıcı varsayılan mantığa göre düşük tanımlı bir video akışı seçer. Varsayılan tanım oynatma sırası için Birden fazla tanım transkodlandığında oynatıcı SDK'sı varsayılan olarak hangi tanımı oynatır? konusuna bakın. VidAuth oynatma için tanım listesini belirtme örneği:

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

Android oynatıcı SDK'sı uyarlamalı bit hızlı HLS ve DASH video akışlarını destekler. prepare başarılı olduktan sonra getMediaInfo yöntemini çağırarak her bit hızı akışı hakkında bilgi alabilirsiniz; bu bilgi TrackInfo olarak adlandırılır. Örnek:

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

Oynatma sırasında oynatıcının selectTrack yöntemini çağırarak oynatılan bit hızı akışını değiştirebilirsiniz. Değer AUTO_SELECT_INDEX olduğunda uyarlamalı bit hızı geçişini etkinleştirir. Örnek:

int index = trackInfo.getIndex();
// Switch bitrate.
aliPlayer.selectTrack(index);
// Switch bitrate and enable adaptive switching.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

Geçiş sonucu OnTrackChangedListener geri çağırması aracılığıyla döndürülür (selectTrack çağrılmadan önce ayarlanır). Örnek:

aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
    @Override
    public void onChangedSuccess(TrackInfo trackInfo) {
        // Switch succeeded.
    }
    @Override
    public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
        // Switch failed. Obtain the failure reason from errorInfo.getMsg().
    }
});

İsteğe bağlı: Oynatıcının selectTrack yöntemini çağırarak uyarlamalı bit hızına geçmeden önce config içindeki uyarlamalı bit hızı (ABR) geçişinin üst sınırını ayarlayarak beklenmeyen bit hızlarına otomatik geçişi önleyebilirsiniz. Örnek: (Aşağıdaki kodu oynatıcı prepare yöntemini çağırmadan veya oynatma listesi oynatıcısı moveTo yöntemini çağırmadan önce çağırmanızı öneririz.)

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // Set the pixel count upper limit for ABR definition to 921600 (width × height = 1280 × 720), so ABR allows switching to definitions with pixel counts ≤ this value.
aliPlayer.setConfig(config);

Ekran görüntüsü

Android oynatıcı SDK'sı, mevcut video için snapshot arayüzü tarafından uygulanan bir ekran görüntüsü özelliği sağlar. Orijinal veriyi yakalar ve bunu bitmap olarak döndürür. Geri çağrı arayüzü OnSnapShotListener'dir. Örnek:

// Set screenshot callback.
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // Obtain the bitmap and image dimensions.
    }
});
// Capture the current playback frame.
aliPlayer.snapshot();

Önizleme oynatma

ApsaraVideo VOD'u yapılandırarak Android oynatıcı SDK'sı önizleme oynatmayı uygulayabilir; hem VidSts hem de VidAuth oynatma yöntemlerini destekler (VOD için VidAuth önerilir). Yapılandırma ve kullanım talimatları için Videoları önizleyin konusuna bakın.

Önizleme oynatmayı yapılandırdıktan sonra VidPlayerConfigGen.setPreviewTime() yöntemini kullanarak oynatıcı için önizleme süresini ayarlayın. VidSts oynatma örneği:

VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20-second preview.
vidSts.setPlayConfig(configGen);// Set for playback source.
...

Önizleme süresi ayarlandığında sunucu, Android oynatıcı SDK'sı aracılığıyla oynatılırken tam video yerine yalnızca önizleme dönemi içindeki içeriği döndürür.

Not

Kara liste ayarlama

Android oynatıcı SDK'sı bir donanım kod çözme kara listesi mekanizması sağlar. Donanım kod çözmeyi açıkça kullanamayan cihazlar için etkisiz işlemlerden kaçınmak amacıyla doğrudan yazılım kod çözme kullanılır. Örnek:

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

Kara liste, uygulama kapatıldıktan sonra otomatik olarak geçersiz hale gelir.

Referer ayarlama

PlayerConfig kullanarak istek Referer'ını ayarlayın. Konsoldaki Referer kara listesi/beyaz listesi ile birleştirildiğinde erişim izinlerini kontrol eder. Örnek:

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Set referer, for example: http://example.aliyundoc.com. (Note: Include the protocol part when setting the referer.)
config.mReferrer = referrer;
....// Other settings.
  // Set configuration for the player.
aliPlayer.setConfig(config);

UserAgent ayarlama

PlayerConfig kullanarak istek UserAgent'ini ayarlayın. Oynatıcı UA'yı isteklere dahil eder. Örnek:

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Set UA.
config.mUserAgent = "UserAgent to set";
....// Other settings.
  // Set configuration for the player.
aliPlayer.setConfig(config);

Ağ yeniden deneme süresini ve sayısını yapılandırma

PlayerConfig kullanarak ağ zaman aşımı ve yeniden deneme sayısını ayarlayın. Örnek:

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Set network timeout duration, in milliseconds.
config.mNetworkTimeout = 5000;
// Set timeout retry count. The interval between retries is networkTimeout. networkRetryCount=0 means no retry; the retry policy is determined by the app. Default value is 2.
config.mNetworkRetryCount=2;
....// Other settings.
  // Set configuration for the player.
aliPlayer.setConfig(config);
Not
  • NetworkRetryCount ayarlanırsa ve bir ağ sorunu yüklemeye neden olursa oynatıcı NetworkRetryCount kez yeniden dener ve her aralık mNetworkTimeout'dur.

  • Birden çok yeniden denemeden sonra yükleme durumu devam ederse onError olayı tetiklenir ve ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT olur.

  • NetworkRetryCount 0 olarak ayarlanırsa ağ yeniden denemesi zaman aşımına uğradığında oynatıcı onInfo olayını tetikler ve InfoBean.getCode()=InfoCode.NetworkRetry olur. Bu noktada ağı yeniden yüklemek için oynatıcının reload yöntemini çağırabilir veya başka şekilde işleyebilirsiniz.

Önbellek ve gecikme kontrolünü yapılandırma

Android oynatıcı SDK'sı PlayerConfig aracılığıyla önbelleği ve gecikmeyi kontrol etmek için arayüzler sağlar. Örnek:

Kodu görüntülemek için genişletin

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Maximum latency. Note: Valid for live streaming. When latency is large, the player SDK internally synchronizes frames to keep latency within this range.
config.mMaxDelayTime = 5000;
// Maximum buffer duration, in ms. The player loads up to this duration of buffer data each time.
config.mMaxBufferDuration = 50000;
// High buffer duration, in ms. When poor network conditions cause data loading, loading stops when buffer duration reaches this value.
config.mHighBufferDuration = 3000;
// Startup buffer duration, in ms. Shorter duration means faster startup but may cause quick entry into loading state after playback starts.
config.mStartBufferDuration = 500;
....// Other settings.
// Maximum backward buffer duration, in ms. Default is 0.
config.mMaxBackwardBufferDurationMs = 0;

// Set configuration for the player.
aliPlayer.setConfig(config);
Önemli
  • Arabellek süreleri şu koşulu sağlamalıdır: mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration.

  • mMaxBufferDuration 5 dakikayı aşarsa sistem aşırı arabellek boyutundan kaynaklanan bellek istisnalarını önlemek için varsayılan olarak 5 dakikaya ayarlar.

HTTP üst bilgilerini ayarlama

PlayerConfig yöntemini kullanarak oynatıcıdaki isteklere HTTP üst bilgi parametreleri ekleyebilirsiniz. Örnek:

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Define headers.
String[] headers = new String[1];
headers[0]="Host:example.com";// For example, set Host in the header.
// Set headers.
config.setCustomHeaders(headers);
....// Other settings.
  // Set configuration for the player.
aliPlayer.setConfig(config);

Resim İçinde Resim

Not

Ayrıntılı kod örnekleri için API-Example Resim İçinde Resim oynatma (PictureInPicture) modülüne bakın. Android için ApsaraVideo Player SDK'sına yönelik bu Java tabanlı örnek proje, geliştiricilerin çekirdek SDK entegrasyon özelliklerini hızlıca öğrenmesine yardımcı olur.

Yordam:

  1. AndroidManifest.xml dosyasında Resim İçinde Resim izinlerini beyan edin.

    <activity
      android:name=".PictureInPictureActivity"
      android:exported="true"
      android:supportsPictureInPicture="true"
      android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
  2. Hedef Activity'yi Resim İçinde Resim moduna geçirin.

    Rational aspectRatio = new Rational(16, 9); // Aspect ratio for Picture-in-Picture; adjust based on your business needs.
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    Resim İçinde Resim modunu OnClick (tıklama olayı), uygulamadan çıkarken veya uygulamaya dönerken tetikleyebilirsiniz. Uygulama yöntemleri:

    OnClick (tıklama olayı) tetikleme

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Rational aspectRatio = new Rational(16, 9); // Aspect ratio for Picture-in-Picture.
            PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
            pipBuilder.setAspectRatio(aspectRatio);
            enterPictureInPictureMode(pipBuilder.build());
        }
    });

    Uygulamadan çıkarken tetikleme

    @Override
    protected void onUserLeaveHint() {
        super.onUserLeaveHint();
        Rational aspectRatio = new Rational(16, 9); // Aspect ratio for Picture-in-Picture.
        PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
        pipBuilder.setAspectRatio(aspectRatio);
        enterPictureInPictureMode(pipBuilder.build());
    
        Log.e(TAG, "Picture-in-Picture onUserLeaveHint");
    }

    Uygulamaya dönerken tetikleme

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // Trigger from back press.
        enterPictureInPictureMode();
    }
  3. Resim İçinde Resim görünümünün/görünmemesinin kullanıcı arayüzünü işleyin.

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // Handle entering Picture-in-Picture mode.
            // hide UI
            Log.e(TAG, "Entered Picture-in-Picture mode");
        } else {
            // Handle exiting Picture-in-Picture mode.
            // show UI 
            Log.e(TAG, "Exited Picture-in-Picture mode");
        }
    }

Canlı RTS düşürme

Not

Ayrıntılı kod örnekleri için API-Example RTS ultra düşük gecikmeli canlı oynatma (RtsLiveStream) modülüne bakın. Android için ApsaraVideo Player SDK'sına yönelik bu Java tabanlı örnek proje, geliştiricilerin çekirdek SDK entegrasyon özelliklerini hızlıca öğrenmesine yardımcı olur.

RTS canlı oynatma.

Sol/sağ ses kanallarını değiştirme

Android oynatıcı SDK'sı, çıktı ses kanalını ayarlamak için setOutputAudioChannel yöntemini sağlar. Giriş kaynağı stereo ise bu yöntemi kullanarak sol veya sağ kanala geçiş yapabilirsiniz. Giriş kaynağı mono ise ayarlamanın etkisi olmaz.

Not

Çıktı ses kanalı ayarı hem ses işleme hem de PCM veri geri çağırmalarını etkiler.

/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT switches to left channel playback,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT switches to right channel playback,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE does not switch channels, maintaining the input source channels.
*/
aliPlayer.setOutputAudioChannel();

Ses akışlarını ayrıştırma

Ses ve video akışı verilerini almak için bir dinleyici ayarlayın. Akışlar şifrelenmemiş olmalıdır çünkü şifreli akışlar ayrıştırılamaz.

Kodu görüntülemek için genişletin

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

// Optional configuration 2: For hardware decoding, RenderFrame returns texture_oes_id; for software decoding, RenderFrame returns source data.
aliPlayer.enableHardwareDecoder(true);
// Set listener to obtain audio and video data.
aliPlayer.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // Video data.
    } else {
        // Audio data.
    }
    return false;
});

Video arka plan rengini ayarlama

Android oynatıcı SDK'sı, oynatıcı işlemesi için arka plan rengi ayarlamayı destekler. Arayüz ve kullanım talimatları:

Arayüz örneği

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

Kullanım talimatları

// Parameter is an 8-digit hexadecimal value. Each pair of digits represents A (alpha transparency), R (red), G (green), B (blue) in order.
// For example, 0x0000ff00 represents green.
aliPlayer.setVideoBackgroundColor(0x0000ff00);

vidAuthBelirtilen oynatma alanını ayarlama

vidAuth kullanarak vid için alan gibi alanları belirtebilirsiniz. Desteklenen alanlar için GetPlayInfo istek parametreleri konusuna bakın. Arayüz ve kullanım talimatları:

Arayüz örneği

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

Kullanım talimatları

playDomain alanını eklemek için VidPlayerConfigGen'in addPlayerConfig yöntemini kullanın.

vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// Add playDomain field. For other fields you can add, refer to
//https://www.alibabacloud.com/help/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);

H.266 kod çözme eklentisi

H.266 (VVC/Versatile Video Coding), eşdeğer kalitede bit hızını önemli ölçüde azaltan bir sonraki nesil video kodlama standardıdır. H.266 kod çözme yeteneği, isteğe bağlı entegrasyon için bağımsız olarak bir eklenti olarak paketlenmiştir.

Ön koşullar

  1. Oynatıcı/entegre SDK sürümü V7.6.0 veya üzeri.

  2. Professional Edition lisans yetkilendirmesi tamamlandı. Oynatıcı SDK lisansı edinin.

  3. H.266 kod çözme eklentisine sahip ApsaraVideo Player, yalnızca ApsaraVideo VOD ses ve video transkodlama tarafından transkodlanan H.266 videolarını destekler.

Eklentiyi entegre etme

Oynatıcı SDK'sı

Maven entegrasyonu (önerilir)

Uygulamanızın build.gradle dosyasına belirtilen eklenti sürümü için bağımlılığı ekleyin:

Not

En son Android oynatıcı SDK sürümleri için Android SDK sürüm geçmişi konusuna bakın.

// x.x.x matches the player SDK version number.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

Yerel entegrasyon

Download the latest Android player SDK and copy the AlivcVVCCodec package to your project's libs directory (create it manually if it doesn't exist). For details, see Local integration.

Entegre SDK

Maven entegrasyonu

Uygulamanızın build.gradle dosyasına belirtilen eklenti sürümü için bağımlılığı ekleyin:

// x.x.x matches the integrated SDK version number.
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

Eklentiyi etkinleştirme

Not

Android oynatıcı SDK 7.7.0'dan başlayarak eklenti entegrasyondan sonra varsayılan olarak etkindir ve manuel etkinleştirme gerektirmez.

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

İlgili hata kodları

H.266 kod çözme eklentisi hata kodları için Tüm platformlardaki oynatıcılar için yaygın sorunlar konusuna bakın.

Oynatma kaynaklarını otomatik yenileme

Oynatma kaynakları için otomatik yenilemeyi etkinleştirmek, kimlik doğrulama mekanizmaları altında kaynak süresinin dolmasından kaynaklanan oynatma kesintilerini önler.

Ön koşullar

  1. Oynatıcı/entegre SDK sürümü V7.9.0 veya üzeri.

  2. VidAuth kaynağını kullanma veya işletmenizin URL imzalama yapılandırması bulunması.

VidAuth kaynağı

Arayüz örneği

/**
 * Set 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);

Özellik bileşenleri

Özellik bileşenleri

/**
 * 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}.
     */
    void onVidAuthExpired(VidAuth expiredSource, SourceRefreshCallback<VidAuth> callback);
}

/**
 * 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.
     */
    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.
     */
    void onError(String errorMsg);
}

Kullanım talimatları

GetVideoPlayAuth API'sini kullanarak video oynatma kimlik bilgilerini edinin. Kimlik bilgilerini almak ve kendi imzalamanızı önlemek için VOD sunucu SDK'sını entegre etmenizi öneririz. Daha fazla bilgi için OpenAPI portalı konusuna bakın.

// Set 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 get new PlayAuth from your app server.
        // clinetGetPlayAuthFunction is an example function name; replace it with your own implementation.
        clinetGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * Callback when new credentials are successfully obtained.
             * @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 when obtaining new credentials fails.
             * @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 kaynağı

Arayüz örneği

/**
 * Set 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);

Özellik bileşenleri

Özellik bileşenleri

/**
 * 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.
     */
    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.
     */
    void onError(String errorMsg);
}

/**
 * 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}.
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

Kullanım talimatları

// Set the player's URL expiration listener.
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 of the class).
        if (authenticationKey == null || authenticationKey.trim().isEmpty()) {
            Log.e(TAG, "Refresh failed: Authentication key is empty.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Authentication key is missing.");
            return; // Exit early if the key is invalid.
        }

        // 2. Calculate the validity duration (expiration time) for the playback URL.
        // If the class member validTime is valid, use it; 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 authentication type A as an example).
        // Restore the original resource address by removing URL parameters (e.g., "?auth_key=").
        int authKeyIndex = expiredUrl.indexOf("?auth_key=");
        if (authKeyIndex == -1) {
            authKeyIndex = expiredUrl.indexOf("&auth_key=");
        }
        // Safely handle cases where auth_key is not found.
        String originalUrl = (authKeyIndex != -1) ? expiredUrl.substring(0, authKeyIndex) : expiredUrl;

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

        // 5. Check the generated authenticated URL and return the result via callback.
        if (newAuthUrl != null && !newAuthUrl.isEmpty()) {
            Log.i(TAG, "Refresh success, new URL: " + newAuthUrl);
            // Create a UrlSource object as required by the SDK and set the new URL.
            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.");
        }
    }
});

Ek yardımcı işlevler

kimlik doğrulama türü A örneği olarak kullanılır.

Ek yardımcı işlevler

// Authenticated URL generation function.
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);
    }
}

// MD5 calculation utility function.
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);
    }
}

Bağlı NIC'i değiştirme

Android oynatıcı SDK'sı, ağ anomalileri sırasında NIC'leri otomatik olarak değiştirmek ve kaynak oynatmanın kararlılığını sağlamak için AliPlayerGlobalSettings.enableSwitchNIC yöntemini sağlar. Örnek:

Not

Bu, yalnızca anahtar etkinleştirildiğinde ve birden çok NIC bulunduğunda etkili olur.

AliPlayerGlobalSettings.enableSwitchNIC(true);

Ses geliştirmesi

Android oynatıcı SDK'sı, ses oynatma deneyimini iyileştirmek için ses normalleştirme, ses geliştirmesi ve surround ses özelliklerine sahip bir ses geliştirme eklentisi sağlar.

Özellik tanıtımı

  • Ses normalleştirme: Tüm ses içeriğini tutarlı bir ses seviyesine otomatik olarak ayarlar; aşırı düşük veya yüksek orijinal sese sahip videolar için oynatma deneyimini önemli ölçüde iyileştirir.

    • Desteklenen kanallar: Mono / Stereo / 5.1 / 7.1.

    • Desteklenen örneklem oranları: 16kHz / 44.1kHz / 48kHz.

  • Ses geliştirmesi: Diyaloğu akıllıca geliştirirken orijinal tınıyı korur; gürültülü sahnelerde sesleri daha net ve parlak hale getirir.

    • Desteklenen kanallar: Stereo.

    • Desteklenen örneklem oranları: 44.1kHz / 48kHz.

  • Surround ses: Çok kanallı ve stereo videolara sanal surround işlemesi uygular; kulaklıklarda veya standart cihazlarda sürükleyici bir deneyim sağlar. 3DSurround (stereo surround) ve MegaBass (süper bas) modlarını içerir.

    • Desteklenen kanallar: Mono / Stereo / 5.1 / 7.1.

    • Desteklenen örneklem oranları: 44.1kHz / 48kHz.

Ön koşullar

  1. Oynatıcı SDK sürümü V7.13.0 veya üzeri.

  2. Professional Edition Lisans yetkilendirmesi alındı. Oynatıcı SDK lisansı edinin.

Önemli

Ses geliştirmesi için ses kaynağı desteği:

  • VOD akışları: ApsaraVideo VOD ses ve video transkodlama kullanılmalıdır.

  • Canlı akışlar: Herhangi bir kaynağı destekler.

Eklentiyi entegre etme

Maven entegrasyonu (önerilir)

Uygulamanızın build.gradle dosyasına belirtilen eklenti sürümü için bağımlılığı ekleyin:

Not

En son Android oynatıcı SDK sürümleri için Android SDK sürüm geçmişi konusuna bakın.

// x.x.x matches the player SDK version number.
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'

Yerel entegrasyon

Download the latest Android player SDK and copy the AlivcAudioEnhanceFilter package to your project's libs directory (create it manually if it doesn't exist). For details, see Local integration.

Özellik arayüzleri

setFilterValid

Ses geliştirmesi için ana anahtarı kontrol eder. Ses geliştirme filtresi için target adı audioEnhance'dir. Devre dışı bırakıldığında üç alt özelliğin tümü etkin değildir (varsayılan olarak devre dışıdır).

player.setFilterValid("audioEnhance", true);   // Enable.
player.setFilterValid("audioEnhance", false);  // Disable.
setFilterConfig

FilterConfig değerini prepare öncesinde ayarlayın. Oynatma başladıktan sonra etkili olur.

FilterConfig filterConfig = new FilterConfig();
FilterConfig.Filter filterItem = new FilterConfig.Filter("audioEnhance");
FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
// Surround sound.
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // Type must be set together with enable_surround on first use.
// Voice enhancement.
opts.setOption("enable_dialoguenhance", true);
opts.setOption("dialoguenhance_voice", 1.0f); // 1.0 ~ 10.0. Voice must be set together with enable_dialoguenhance on first use.
// Volume normalization.
opts.setOption("enable_normalizer", true);

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


Parametre


Tür


Açıklama


enable_surround


Boolean


Surround ses özelliği anahtarı.


surround_effect_type


Dize


Surround ses türü: "3DSurround" / "MegaBass".


enable_dialoguenhance


Boolean


Ses geliştirmesi özelliği anahtarı.


dialoguenhance_voice


Float


Ses geliştirmesi gücü, aralık 1.0 ~ 10.0.


enable_normalizer


Boolean


Ses normalleştirme özelliği anahtarı.

updateFilterConfig

Oynatıcı hazırlığı sırasında veya sonrasında parametreleri dinamik olarak ayarlamak için bu arayüzü çağırarak bunları güncelleyin.

Not

updateFilterConfig çağrısının prepare öncesinde etkisi yoktur. İlk yapılandırma için setFilterConfig kullanın.

AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // If not the first time enabling surround, this Type setting is invalid because initialization is already complete.
[player updateFilterConfig:@"audioEnhance" options:opts];
Önemli

Surround ses türü ("3DSurround" / "MegaBass") ve ses geliştirmesi gücü (dialoguenhance_voice), ilk kullanımda enable niteliği ile birlikte ayarlanmalıdır. Aksi takdirde başlatma için varsayılan değerler kullanılır (surround ses varsayılan olarak "3DSurround", ses gücü varsayılan olarak 1.0) ve bunlar oynatma sırasında değiştirilemez.

Performans

Oynatma senaryosunu ayarlama

Oynatma senaryosunu ayarlamak, optimal parametreleri (arabellek ayarları ve özellik anahtarları dahil) otomatik olarak yapılandırır. setConfig arayüzü aracılığıyla özel parametre ayarlarıyla uyumludur (özel ayarlar önceliklidir).

Not
  • Oynatma senaryosunu ayarladıktan sonra parametre yapılandırmasını getConfig arayüzünü kullanarak görüntüleyebilirsiniz.

Arayüz örneği

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

Oynatma senaryoları

public enum PlayerScene {
    /**
     * Scenario: none.
     */
    NONE,
    /**
     * Long video scenario: applies to videos longer than 30 minutes.
     */
    LONG,
    /**
     * Medium video scenario: applies to videos between 5 and 30 minutes.
     */
    MEDIUM,
    /**
     * Short video scenario: applies to videos up to 5 minutes.
     */
    SHORT,
    /**
     * Live scenario.
     */
    LIVE,
    /**
     * Ultra-low latency live scenario.
     */
    RTS_LIVE
}

Kullanım talimatları

// Set short video scenario.
aliPlayer.setPlayerScene(PlayerScene.SHORT)

// Set medium video scenario.
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)

// Set long video scenario.
aliPlayer.setPlayerScene(PlayerScene.LONG)

// Set live scenario.
aliPlayer.setPlayerScene(PlayerScene.LIVE)

Ön işleme

Android oynatıcı SDK'sı, oynatma başlamadan önce ilk karenin hızlı bir şekilde işlenmesini destekler; bu, başlatma hızını iyileştirebilir.

Not
  1. Bu özellik varsayılan olarak devre dışıdır.

  2. Karenin hazır olduğu anda View üzerine işlenmesini sağlamak için Prepare çağrılmadan önce View ayarlanmalıdır.

  3. Bu özelliği etkinleştirmek, hazırlık başarı ve ilk kare işleme olaylarının tetikleme sırasını etkiler: Bu özellik olmadan hazırlık başarısı ilk kare işlemesinden önce tetiklenir; bu özellik ile kod çözme ve işleme hızındaki farklar nedeniyle ilk kare işlemesi hazırlık başarısından önce tetiklenebilir ancak bu oynatmayı etkilemez.

    Örnek:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

Yerel önbellek

Not

Ayrıntılı kod örnekleri için API-Example Video ön yükleme (Preload) modülüne bakın. Android için ApsaraVideo Player SDK'sına yönelik bu Java tabanlı örnek proje, geliştiricilerin çekirdek SDK entegrasyon özelliklerini hızlıca öğrenmesine yardımcı olur.

Yerel önbellek, tekrarlanan oynatma için başlatma hızını ve atlama hızını iyileştirir, takılmayı azaltır ve bant genişliğinden tasarruf sağlar.

Yerel önbelleği etkinleştirme

Yerel önbellek varsayılan olarak devre dışıdır. Kullanmak için AliPlayerGlobalSettings ve enableLocalCache kullanarak manuel olarak etkinleştirin. Örnek:

Kodu görüntülemek için genişletin

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

/**
 * You can also use the following code for cache settings.
 * Enable local cache. After enabling, content is cached to local files.
 * @param enable: Local cache feature switch. true: enable, false: disable. Disabled by default.
 * @param maxBufferMemoryKB: Deprecated since version 5.4.7.1, currently has no effect.
 * @param localCacheDir: Must be set. Local cache directory as an absolute path.
 * AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * Local cache file cleanup configuration.
 * @param expireMin - Deprecated since version 5.4.7.1, currently has no effect.
 * @param maxCapacityMB - Maximum cache capacity in MB. Default is 20 GB. During cleanup, if total cache size exceeds this value, cache items are deleted one by one from oldest to newest until size is ≤ maxCapacityMB.
 * @param freeStorageMB - Minimum free disk space in MB. Default is 0. During cleanup, if current disk space is less than this value, cache items are deleted one by one until free space ≥ this value or all cache is cleared.
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * Set callback for loading URL hash value. If not set, SDK uses MD5 algorithm.
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
Not
  • Video oynatma URL'leri kimlik doğrulama parametreleri içeriyorsa parametreler önbelleğe alma ve oynatma arasında değişir. Farklı kimlik doğrulamaları altında aynı URL için önbellek isabet oranını artırmak için karma değeri (örn. MD5) hesaplamadan önce setCacheUrlHashCallback aracılığıyla kimlik doğrulama parametrelerini kaldırın. Örneğin, http://****.mp4?aaa gibi bir URL için karma değerini http://****.mp4 kullanarak hesaplayın. Ancak şifreli m3u8 videoları için keyURL'lerden kimlik doğrulama parametrelerini kaldırırsanız farklı videolar aynı anahtara isabet edebilir ve bu oynatma hatasına neden olabilir. Çözüm: setCacheUrlHashCallback geri çağrısında alanı kontrol edin ve yalnızca oynatma alanları (http(s)://xxxxx.m3u8?aaaa) için kimlik doğrulama parametrelerini kaldırın; keyURL alanları (http(s)://yyyyy?bbbb) için kaldırmayın. HLS şifreli video M3U8 oynatma listesini almak için curl kullanın; burada playURL M3U8 adresi ve keyURL AES-128 şifre çözme anahtarı adresidir. Örnek terminal çıktısı:

    # playURL: M3U8 playlist request
    C:\Users\futan>curl "https://videxxxv.cc/a003xxx2a-hd-encrypt-stream.m3u8?MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a&auth_key=17xxxrmonwFHJ"
    
    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    # keyURL: AES-128 encryption key address
    #EXT-X-KEY:METHOD=AES-128,URI="https://apxxx.cc/decrypt?Ciphertext=NWNiNDQyN2MtNjV1ZS00ZWIwLTk0YTAtNTJhOWIyZWV1OTY2MzdoRTJ6TjVxcXkweFY2xxxNCt4OGNFRGNReHRG&MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a"
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00001.ts?auth_key=1706560316-65b7xxx39f1d6c77
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00002.ts?auth_key=1706560316-65b7xxxe8eca2faf
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00003.ts?auth_key=1706560316-65b7xxx50c6981b3
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00004.ts?auth_key=1706560316-65b7xxxf7228c594
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00005.ts?auth_key=1706560316-65b7xxx6dc68c35d
  • Sunucu aynı medya dosyasına işaret eden hem HTTP hem de HTTPS protokollerini destekliyorsa karma değerini hesaplamadan önce protokolü kaldırın veya standartlaştırın. Örneğin:

    • https://****.mp4 ve http://****.mp4 URL'leri için karma değerini ****.mp4 kullanarak hesaplayın.

    • https://****.mp4 URL'si için karma değerini hesaplamadan önce http://****.mp4 olarak standartlaştırın.

  • Oynatıcı SDK sürümü 5.5.4.0 ve sonrası için video oynatma URL'si kimlik doğrulama parametreleri içeriyor ve HLS protokolü kullanıyorsa kimlik doğrulama modları arasında seçim yapmak için PlayerConfig.mEnableStrictAuthMode değerini ayarlayabilirsiniz (varsayılan olarak eski sürümler için false; sürüm 7.13.0 ve sonrası için true):

    • Katı olmayan kimlik doğrulama (false): Kimlik doğrulama önbelleğe alınır. Daha önce medyanın yalnızca bir kısmı önbelleğe alındıysa oynatıcı sonraki istekler için önbelleğe alınan kimlik doğrulamayı kullanır. URL kimlik doğrulamasının kısa bir geçerlilik süresi varsa veya uzun bir duraklatmadan sonra oynatma devam ederse kimlik doğrulamanın süresi dolabilir. Kimlik doğrulama süresinin dolmasını işlemek için oynatma kaynaklarını otomatik yenileme ile entegre edin.

    • Katı kimlik doğrulama (true): Kimlik doğrulama önbelleğe alınmaz. Her başlatmada kimlik doğrulama gerçekleşir ve ağ olmadığında başlatma başarısız olur.

Tek bir URL için yerel önbelleği etkinleştirme veya devre dışı bırakma

Belirli bir URL için yerel önbelleği etkinleştirmek veya devre dışı bırakmak için player config içinde ayarlayın.

// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Whether to enable local cache for the playback URL. Default is true. When global local cache is enabled and this is set to true, local cache takes effect for this URL. If set to false, local cache is disabled for this URL.
config.mEnableLocalCache = false;
....// Other settings.

// Set configuration for the player.
aliPlayer.setConfig(config);

Ön yükleme

Ön yükleme, video önbellekleme için bellek kullanımını ayarlayarak video başlatma hızını iyileştiren yerel önbelleğin yükseltmesidir.

Ön yükleme sınırlamaları:

  • Şu anda MP4, MP3, FLV ve HLS gibi tekli medya dosyalarının yüklenmesini destekler.

Not

Android oynatıcı SDK'sı, ön yükleme sırasında varsayılan olarak otomatik ağ kaynağı zamanlaması sağlar; bu, devam eden video oynatma üzerinde ön yükleme ağ isteklerinin etkisini azaltır. Otomatik zamanlama stratejisi, şu anda oynatılan videonun arabelleği belirli bir eşiğe ulaştıktan sonra ön yükleme isteklerine izin verir. Gerçek zamanlı ön yükleme isteklerini kendiniz kontrol etmek için aşağıdaki yöntemi kullanarak bu stratejiyi devre dışı bırakın:

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. Yerel önbelleği etkinleştirin. Ayrıntılı adımlar için Yerel önbellek konusuna bakın.

  2. Veri kaynağını ayarlayın.

    VidAuth (önerilir)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Vid info");// Required parameter: Video ID.
    vidAuth.setPlayAuth("<yourPlayAuth>");// Required parameter: Playback credential, generated by calling the GetVideoPlayAuth API of VOD.
    vidAuth.setRegion("Access region");// For player SDK version 5.5.5.0 and later, this parameter is deprecated and not required; the player automatically parses the region. For versions before 5.5.5.0, this parameter is required; the default VOD access region is cn-shanghai.
    vidAuth.setQuality("Selected definition") //"AUTO" represents adaptive bitrate.

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid info");// Required parameter: Video ID. vidSts.setAccessKeyId("<yourAccessKeyId>");// Required parameter: Access key ID of the STS temporary AK pair, generated by calling the AssumeRole API of STS.  vidSts.setAccessKeySecret("<yourAccessKeySecret>");// Required parameter: Access key of the STS temporary AK pair, generated by calling the AssumeRole API of STS.  vidSts.setSecurityToken("<yourSecurityToken>");// Required parameter: STS security token, generated by calling the AssumeRole API of STS.  vidSts.setRegion("Access region");// Required parameter: VOD access region; default is cn-shanghai.
    vidSts.setQuality("Selected definition") //"AUTO" represents adaptive bitrate.

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("Playback address");// Required parameter: Playback address, which can be a third-party VOD address or an Alibaba Cloud VOD playback address.
  3. Görev parametrelerini ayarlayın.

    Not

    Yalnızca çoklu bit hızlı videolar için geçerlidir. setDefaultBandWidth, setDefaultResolution veya setDefaultQuality seçeneklerinden birini seçin.

    PreloadConfig preloadConfig = new PreloadConfig();
    // Set preloading bitrate for multi-bitrate streams.
    preloadConfig.setDefaultBandWidth(400000);
    // Set preloading resolution for multi-bitrate streams.
    preloadConfig.setDefaultResolution(640 * 480);
    // Set preloading quality for multi-bitrate streams.
    preloadConfig.setDefaultQuality("FD");
    // Set preloading duration.
    preloadConfig.setDuration(1000);
  4. Görev dinleyicisi ekleyin.

    Kodu görüntülemek için genişletin

    /**
     * Preloading listener implementation.
     */
    private static class PreloadListenerImpl extends OnPreloadListener {
    
        @Override
        public void onError(@NonNull String taskId, @NonNull String urlOrVid, @NonNull ErrorInfo errorInfo) {
            // Loading error.
        }
    
        @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. Görevi oluşturun ve ön yüklemeyi başlatmak için MediaLoaderV2 örneğine ekleyin.

    VidAuth (önerilir)

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

    VidSts

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

    UrlSource

    // Build preloading.
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // Get MediaLoaderV2 instance.
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // Add task and start preloading.
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)
  6. İsteğe bağlı: Görevleri yönetin.

    mediaLoaderV2.cancelTask(taskId);// Cancel preloading task with specified task ID.
    mediaLoaderV2.pauseTask(taskId);// Pause preloading task with specified task ID.
    mediaLoaderV2.resumeTask(taskId);// Resume preloading task with specified task ID.
  7. İsteğe bağlı: Yüklenen dosyaları silin.

    Alan tasarrufu sağlamak için gerektiğinde yüklenen dosyaları silin. Android oynatıcı SDK'sı bir silme arayüzü sağlamaz; dosyaları uygulamanızdaki yükleme dizininden silin.

Dinamik ön yükleme

Dinamik ön yükleme stratejisi, entegratörlerin hem şu anda oynatılan videonun önbelleğini hem de ön yüklenen öğelerin sayısını ve önbelleğini kontrol etmesine olanak tanır; bu, oynatma deneyimi ile maliyet yükü arasında denge kurar.

Kodu görüntülemek için genişletin

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

// Configure baseline preloading duration.
// Set preloading duration to 1000ms.
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// Configure number of preloads, supporting bidirectional.
// 1 for forward preloads, 3 for backward preloads.
aliListPlayer.setPreloadCount(1, 3);

// Configure dynamic preloading decrement offset.
aliListPlayer.enablePreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, true);
aliListPlayer.setPreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, "{\"algorithm\": \"sub\",\"offset\": \"200\"}");

Çoklu bit hızlı HLS videolarının ön yüklenmesi

listPlayer + çoklu bit hızlı HLS video oynatma senaryolarında entegratörler mevcut oynatma tanımıyla eşleşen akışları ön yükleyebilir ve iş ihtiyaçlarına göre ön yükleme modlarını seçebilir.

Desteklenen ön yükleme modlarını görüntülemek için genişletin

  /**
   * Default configuration, play and preload default bitrate.
   */
  MultiBitratesMode_Default(0),

  /**
   * First frame priority configuration, decrease first frame cost. Only play bitrate of the HLS stream which has been preloaded.
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * Balance first frame and playback smoothness, play the same bitrate before and after moveToNext, and prioritize first frame performance.
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * Playback smoothness priority configuration, play the same bitrate before and after moveToNext.
   */
  MultiBitratesMode_SmoothPrio(3);

Entegrasyon kodunu görüntülemek için genişletin

// Select multi-bitrate loading mode.
aliListPlayer.SetMultiBitratesMode(preLoadMode);

// (Optional) Select startup bitrate.
aliListPlayer.setDefaultBandWidth(defaultBandWidth)

// (Optional) In onPrepared callback, select ABR mode.
aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
    @Override
    public void onPrepared() {
        // ABR only affects multi-bitrate m3u8.
        aliListPlayer.selectTrack(-1);
    }
});

İndirme hızını alma

getExtraValue arayüzü tarafından uygulanan onInfo geri çağrısı aracılığıyla mevcut video indirme hızını alın. Örnek:

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

Ağ özellikleri

HTTPDNS

HTTPDNS, alan adlarını belirli sunuculara HTTP üzerinden çözerek DNS ele geçirme risklerini azaltır ve daha hızlı, daha kararlı çözümleme sağlar.

ApsaraVideo Player SDK, Alibaba Cloud CDN alan adları için geliştirilmiş HTTPDNS sağlar; hassas CDN zamanlaması ve gerçek zamanlı çözümlemeyi destekler.

Geliştirilmiş HTTPDNS kullanım örneği

Geliştirilmiş HTTPDNS yalnızca Alibaba Cloud CDN alan adları için hizmet sağlar. Alan adınızın bir Alibaba Cloud CDN alan adı olduğundan ve doğru yapılandırıldığından emin olun. VOD'da CDN alan adları ekleme için Hızlandırılmış alan adı ekle konusuna bakın. Alibaba Cloud CDN.

// Enable enhanced HTTPDNS.
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// Optional: Add HTTPDNS pre-resolution domains.
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");

HTTP/2

Not

Android oynatıcı SDK'sı, 5.5.0.0 sürümünden başlayarak HTTP/2'yi varsayılan olarak etkinleştirir.

Android oynatıcı SDK'sı, baştan engelleme sorununu önlemek ve oynatma performansını iyileştirmek için çoğullama kullanan HTTP/2 protokolünü destekler. Örnek:

AliPlayerGlobalSettings.setUseHttp2(true);

HTTP ön bağlantılı TCP

HTTP video oynatma istekleri (HTTPS olmayan) için TCP bağlantılarını önceden kurmak kullanıcı deneyimini önemli ölçüde iyileştirir, ağ bağlantı süresini azaltır, anında ve sürekli oynatma sağlar ve ağ ile sistem kaynağı kullanımını optimize eder. Kullanım:

// Domain format is host[:port]; port is optional. Separate multiple domains with semicolons (;).
// Global setting.
// Full interface uses the current string each time it's set (more - add, less - remove). Empty string stops pre-connection.
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

Video indirme

Not

Ayrıntılı kod örnekleri için API-Example Video indirme ve çevrimdışı oynatma (Download) modülüne bakın. Android için ApsaraVideo Player SDK'sına yönelik bu Java tabanlı örnek proje, geliştiricilerin çekirdek SDK entegrasyon özelliklerini hızlıca öğrenmesine yardımcı olur.

Android oynatıcı SDK'sı, VOD hizmetleri için bir video indirme özelliği sağlar; kullanıcıların ApsaraVideo Player kullanarak videoları yerel olarak önbelleğe almalarına olanak tanır. Standart indirme ve güvenli indirme olmak üzere iki indirme yöntemi sunar.

  • Standart indirme

    İndirilen video verileri Alibaba Cloud tarafından şifrelenmez ve üçüncü taraf oynatıcılar tarafından oynatılabilir.

  • Güvenli indirme

    İndirilen video verileri Alibaba Cloud tarafından şifrelenir. Üçüncü taraf oynatıcılar bunu oynatamaz. Yalnızca ApsaraVideo Player bunu oynatabilir.

Kullanım talimatları

  • Yalnızca VidSts ve VidAuth yöntemleri video indirmeyi destekler.

  • Oynatıcının video indirme özelliğini kullanmak için VOD konsolunda indirme modunu etkinleştirin ve yapılandırın. Ayrıntılı adımlar için Çevrimdışı indirme konusuna bakın.

  • Video indirme kaldığı yerden indirmeyi destekler.

Yordam

  1. İsteğe bağlı: Güvenli indirme için şifreleme doğrulama dosyasını yapılandırın. Yalnızca güvenli indirme için gereklidir; standart indirme için gerekli değildir.

    Not

    Yapılandırılan şifreleme doğrulama dosyasının uygulama bilgilerinizle eşleştiğinden emin olun; aksi takdirde video indirme başarısız olur.

    Güvenli indirme için VOD konsolunda oluşturulan anahtar dosyasını video indirme ve oynatma sırasında şifre çözme doğrulaması için oynatıcı SDK'sında yapılandırın. Anahtar dosyası oluşturma için Güvenli indirmeyi etkinleştir konusuna bakın.

    Bunu Application'da bir kez yapılandırmanızı öneririz. Örnek:

    PrivateService.initService(getApplicationContext(),  "Path to encryptedApp.dat file"); // We recommend storing the encryptedApp.dat verification file on the phone and setting its local file path here.
  2. İndiriciyi oluşturun ve ayarlayın.

    AliDownloaderFactory kullanarak bir indirici oluşturun. Örnek:

    AliMediaDownloader mAliDownloader = null;
    ......
    // Create downloader.
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // Configure download save path.
    mAliDownloader.setSaveDir("Save folder path");
  3. Olay dinleyicilerini ayarlayın.

    İndirici birden çok olay dinleyicisi sağlar. Örnek:

    Kodu görüntülemek için genişletin

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // Download item prepared successfully.
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           // Download progress percentage.
       }
       @Override
       public void onProcessingProgress(int percent) {
           // Processing progress percentage.
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           // Download error.
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           // Download successful.
       }
    });
  4. İndirme kaynağını hazırlayın.

    prepare yöntemini kullanarak indirme kaynağını hazırlayın. İndirme kaynakları VidSts ve VidAuth yöntemlerini destekler. Örnekler:

    • VidSts

      // Create VidSts
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Vid information"); // Video ID (VideoId).
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // AccessKey ID of the temporary STS AccessKey pair, generated by calling the AssumeRole operation of the Security Token Service (STS).
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // AccessKey secret of the temporary STS AccessKey pair, generated by calling the AssumeRole operation of the Security Token Service (STS).
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Security Token Service (STS) token, generated by calling the AssumeRole operation of the Security Token Service (STS).
      aliyunVidSts.setRegion("region"); // The region of the video-on-demand (VOD) service. 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 set the config and pass it into the vid, as shown below.
      // If you have not enabled HLS encryption parameter pass-through in the VOD console, skip the following code.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      aliyunVidSts.setPlayerConfig(vidConfig);
              
      
      // Prepare the download source
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      // Create VidAuth.
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("Vid info");// Video ID.
      vidAuth.setPlayAuth("<yourPlayAuth>");// Playback credential, generated by calling VOD GetVideoPlayAuth API.
      vidAuth.setRegion("Access region");// For player SDK version 5.5.5.0 and later, this parameter is deprecated and not required; the player automatically parses the region. For versions before 5.5.5.0, this parameter is required; VOD access region default is cn-shanghai.
      // If you enabled HLS standard encryption parameter pass-through in VOD console with default parameter name MtsHlsUriToken, set config and pass it to vid as follows.
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // Prepare download source.
      mAliDownloader.prepare(vidAuth);
    Not
    • Kaynak dosya formatı indirilen dosya formatıyla eşleşir; değiştirilmesi desteklenmez.

    • VOD konsolunda HLS standart şifreleme parametre passthrough'unu varsayılan parametre adı MtsHlsUriToken ile etkinleştirdiyseniz HLS standart şifreleme parametre passthrough'u konusuna bakın, ardından yukarıda gösterildiği gibi VOD kaynağında MtsHlsUriToken değerini ayarlayın.

  5. Hazırlık başarılı olduktan sonra indirme öğesini seçin ve indirmeyi başlatın.

    Hazırlık başarılı olduktan sonra OnPreparedListener yöntemi çağrılır. Dönen TrackInfo, video akışı tanımı gibi bilgileri içerir. İndirmek için bir Track seçin. Örnek:

    public void onPrepared(MediaInfo mediaInfo) {
        // Download item prepared successfully.
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // For example: download the first TrackInfo.
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // Start download.
        mAliDownloader.start();
    }
  6. (İsteğe bağlı) İndirme kaynağını güncelleyin.

    VidSts ve VidAuth süresinin dolmasını önlemek için indirme kaynağı bilgilerini güncelleyebilir ve indirmeyi başlatabilirsiniz. Örnek:

    // Update download source.
    mAliDownloader.updateSource(VidSts);
    // Start download.
    mAliDownloader.start();
  7. İndirme başarılı veya başarısız olduktan sonra indiriciyi serbest bırakın.

    İndirme başarılı olduktan sonra indiriciyi serbest bırakmak için release veya onCompletion geri çağrısında onError yöntemini çağırın. Örnek:

    mAliDownloader.stop();
    mAliDownloader.release();
  8. İsteğe bağlı: İndirilen dosyaları silin.

    İndirme sırasında veya sonrasında indirilen dosyaları silebilirsiniz. Örnek:

    // Delete file via object.
    mAliDownloader.deleteFile();
    // Delete via static method; returns 0 if successful.
    AliDownloaderFactory.deleteFile("Path to download folder","Video ID","Video format","Downloaded video index");

Sonraki adımlar

İndirilen videolar ApsaraVideo Player kullanılarak oynatılabilir. Adımlar:

  1. İndirme tamamlandıktan sonra video dosyasının mutlak yolunu alın.

    String path = mAliDownloader.getFilePath();
  2. Oynatma için VOD UrlSource aracılığıyla mutlak yolu ayarlayın.

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

Şifreli oynatma

VOD videoları HLS standart şifrelemeyi, Alibaba Cloud tescilli kriptografisini ve DRM şifrelemeyi destekler. Canlı videolar yalnızca DRM şifrelemeyi destekler. Şifreli oynatma için Şifreli oynatma konusuna bakın.

Yerel RTS oynatma

Android Oynatıcı SDK'sı, ultra düşük gecikmeli canlı yayın için Native RTS SDK'sını entegre eder. Android'de RTS akış çekme uygulayın.

Referanslar