Exploitez les fonctionnalités avancées du SDK Player Android, notamment la lecture par liste, les sous-titres, le téléchargement vidéo et la lecture chiffrée. Référence API.
Pour exécuter la démo, téléchargez-la et suivez les instructions de la rubrique Exécuter la démo afin de la compiler et de la lancer.
Vérification de licence Édition Professionnelle
Certaines fonctionnalités du lecteur nécessitent une licence Édition Professionnelle. Consultez les fonctionnalités prises en charge dans la rubrique Détails des fonctionnalités du SDK Player. Pour utiliser ces fonctionnalités, procédez à l'autorisation comme décrit dans Obtenir une licence SDK Player.
Configurez un écouteur avant le démarrage de l'application ou avant d'appeler toute API du lecteur :
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);
}
});
L'énumération PremiumBizType liste les fonctionnalités professionnelles. Lorsque vous utilisez une fonctionnalité concernée, le lecteur vérifie la licence et renvoie le résultat via ce rappel. Si isValid est faux, errorMsg contient la raison de l'échec.
Lecture
Lecture par liste de lecture
Le SDK Player Android offre une lecture par liste avec préchargement, ce qui améliore considérablement la vitesse de démarrage des vidéos courtes.
Procédure
Pour une meilleure expérience de lecture par liste, utilisez la solution de mini-séries. Développement client mini-séries.
Lecture de vidéos avec transparence
Présentation de la fonctionnalité
Le SDK ApsaraVideo Player prend en charge le rendu du canal alpha pour les animations de cadeaux transparents. Dans les scénarios de diffusion en direct, ces animations s'affichent sans masquer le contenu live.
Limites
Le SDK intégré version 6.8.0 ou ultérieure, ou le SDK Player version 6.9.0 ou ultérieure, prend en charge le rendu transparent.
Avantages
Par rapport aux formats APNG ou IXD, les vidéos MP4 avec transparence offrent une meilleure qualité d'animation, une taille de fichier réduite, une compatibilité accrue et une efficacité de développement améliorée.
Meilleure qualité d'animation : Le format MP4 conserve les détails et les couleurs d'origine plus fidèlement que l'APNG ou l'IXD.
Taille de fichier réduite : La compression MP4 est plus efficace, ce qui améliore la vitesse de chargement et réduit la consommation de bande passante.
Compatibilité supérieure : Le format MP4 est universellement pris en charge par les appareils et les navigateurs.
Efficacité de développement accrue : Les développeurs n'ont pas besoin de mettre en œuvre une logique complexe d'analyse et de rendu.
Exemple de code
Sous-titres externes
Pour des exemples de code détaillés, reportez-vous au module API-Example Démonstration et bascule de sous-titres externes (ExternalSubtitle). Ce projet d'exemple basé sur Java pour le SDK ApsaraVideo Player pour Android aide les développeurs à maîtriser rapidement les fonctionnalités essentielles d'intégration du SDK.
Le SDK Player Android permet d'ajouter et de changer des sous-titres externes aux formats SRT, SSA, ASS et VTT.
-
Créez une vue pour afficher les sous-titres.
Créez différentes vues selon le format des sous-titres.
Lors de l'intégration du lecteur version 7.6.0 ou ultérieure et de l'utilisation de
VttSubtitleViewpour afficher les sous-titres SRT et VTT, configurez l'écouteur suivant :// 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); } }); -
Ajoutez des sous-titres.
ImportantDéfinissez les fichiers de sous-titres dans le rappel
onPrepared.mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // Set subtitles (must be done in onPrepared). mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL); } }); -
Configurez les écouteurs liés aux sous-titres.
Sous-titres externes (rendu personnalisé basé sur des composants de rendu)
La prise en charge complète des sous-titres externes WebVTT est mise en œuvre à l'aide de VttSubtitleView et WebVttResolver, permettant une personnalisation flexible de la taille, de la couleur et des polices spécifiques des sous-titres.
Scénarios applicables :
Personnalisation des styles de sous-titres WebVTT.
Intégration du SDK ApsaraVideo Player version 7.11.0 ou ultérieure.
Prérequis :
Les fichiers de police (.ttf) sont placés dans le répertoire
assets/fonts/de votre projet.Le minSdk du projet est ≥ 21 (recommandé).
Les écouteurs de sous-titres sont ajoutés et le contenu WebVTT peut être obtenu.
-
Créez
CustomStyleWebVttResolveret implémentezWebVttResolver.public class CustomStyleWebVttResolver extends WebVttResolver { // Implement creation method. public CustomStyleWebVttResolver(Context context) { super(context); // Initialize fonts and other resources here later. } } -
Redéfinissez
applyTextSpanspour personnaliser les styles.Cette méthode est appelée après que la classe parente a analysé les styles de base, permettant un traitement secondaire des sous-titres.
-
Méthode 1 : Modifiez
VttContentAttributeet appelez la méthode de la classe parente./** * 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); } -
Opérez directement sur
SpannableStringBuilderpour modifier les styles WebVTT directement.ImportantCette méthode peut entraîner la perte des styles WebVTT natifs.
/** * 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 // ); }
-
-
Définissez des polices personnalisées (Typeface).
-
Chargez les polices personnalisées depuis le répertoire
asset/fonts/.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. } } -
Appliquez les polices personnalisées aux sous-titres.
@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); } }Compatibilité avec les anciennes versions d'Android : Étant donné que
TypefaceSpandans Android P (API 28) et les versions antérieures ne prend pas en charge le passage direct d'un objetTypeface, vous devez créer unMetricAffectingSpanpersonnalisé./** * 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); } }
-
-
Intégrez au lecteur.
-
Initialisez la vue des sous-titres.
// 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); } -
Liez les rappels de sous-titres externes.
// 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); } } });
-
Lecture audio uniquement
Désactivez la lecture vidéo pour obtenir une lecture audio uniquement. Configurez PlayerConfig avant d'appeler prepare.
PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // Enable audio-only playback.
aliPlayer.setConfig(config);
Bascule entre décodeur logiciel et matériel
Changez la méthode de décodage avant le début de la lecture. Le changement en cours de lecture n'a aucun effet.
Le SDK Player Android fournit un décodage matériel H.264 et H.265 avec le commutateur enableHardwareDecoder. Le décodage matériel est activé par défaut et revient automatiquement au décodage logiciel en cas d'échec de l'initialisation. Exemple :
// Enable hardware decoding. Enabled by default.
aliPlayer.enableHardwareDecoder(true);
Si le lecteur passe automatiquement du décodage matériel au décodage logiciel, il déclenche le rappel onInfo. Exemple :
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
// Switched to software decoding.
}
}
});
Lecture adaptative H.265
Si l'appareil figure sur la liste noire cloud du décodage matériel H.265 ou si le décodage matériel H.265 échoue, une dégradation adaptative se déclenche : si un flux de secours H.264 existe, le lecteur l'utilise ; sinon, il passe au décodage logiciel H.265.
Cette fonctionnalité n'est activée qu'après l'activation du service à valeur ajoutée de décodage adaptatif intégré client-cloud. Vous devez soumettre un formulaire Yida pour demander une autorisation de licence.
Le service à valeur ajoutée de décodage adaptatif intégré client-cloud comprend : 1. Distribution dynamique des données de compatibilité du décodage matériel cloud ; 2. Dégradation adaptative des flux H.265 vers des flux H.264.
-
Le SDK conserve la capacité de basculer automatiquement vers le décodage logiciel en cas d'échec du décodage matériel, même sans activation du service à valeur ajoutée.
Exemple de configuration d'un flux de secours :
// 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 "";
}
}
});
Changement adaptatif de définition vidéo selon le réseau
Les flux vidéo à débit binaire adaptatif HLS peuvent être générés via le groupe de modèles de conditionnement et de transcodage vidéo dans ApsaraVideo VOD. Pour les opérations détaillées, consultez Configurer le débit binaire adaptatif pour VOD.
-
Pour les flux adaptatifs générés par le transcodage ApsaraVideo VOD, si vous utilisez la lecture Vid, vous devez spécifier la liste de définitions de lecture par défaut comme
DEFINITION_AUTOpour obtenir et lire le flux vidéo adaptatif. Sinon, le lecteur sélectionne un flux vidéo basse définition selon la logique par défaut. Pour l'ordre de lecture des définitions par défaut, consultez Quelle définition le SDK Player lit-il par défaut lorsque plusieurs définitions sont transcodées ?. Exemple de spécification de la liste de définitions pour la lecture VidAuth :VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
Le SDK Player Android prend en charge les flux vidéo HLS et DASH à débit binaire adaptatif. Une fois prepare réussi, vous pouvez obtenir des informations sur chaque flux de débit binaire, à savoir TrackInfo, en appelant getMediaInfo. Exemple :
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();
Pendant la lecture, vous pouvez changer le flux de débit binaire lu en appelant la méthode selectTrack du lecteur. Lorsque la valeur est AUTO_SELECT_INDEX, cela active le changement adaptatif de débit binaire. Exemple :
int index = trackInfo.getIndex();
// Switch bitrate.
aliPlayer.selectTrack(index);
// Switch bitrate and enable adaptive switching.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
Le résultat du changement est renvoyé via le rappel OnTrackChangedListener (à configurer avant d'appeler selectTrack). Exemple :
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().
}
});
Facultatif : Avant d'appeler la méthode selectTrack du lecteur pour passer au débit binaire adaptatif, vous pouvez définir la limite supérieure pour le changement de débit binaire adaptatif (ABR) dans la configuration afin d'éviter le basculement automatique vers des débits binaires inattendus. Exemple : (Nous recommandons d'appeler le code suivant avant que le lecteur n'appelle la méthode prepare ou avant que le lecteur de liste n'appelle la méthode moveTo pour qu'il prenne effet.)
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);
Capture d'écran
Le SDK Player Android offre une fonctionnalité de capture d'écran pour la vidéo en cours, mise en œuvre par l'interface snapshot. Elle capture les données d'origine et les renvoie sous forme de bitmap. L'interface de rappel est OnSnapShotListener. Exemple :
// 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();
Lecture d'aperçu
En configurant ApsaraVideo VOD, le SDK Player Android peut mettre en œuvre une lecture d'aperçu, prenant en charge les méthodes de lecture VidSts et VidAuth (VidAuth est recommandé pour VOD). Pour les instructions de configuration et d'utilisation, consultez Aperçu des vidéos.
Après avoir configuré la lecture d'aperçu, définissez la durée de l'aperçu pour le lecteur à l'aide de la méthode VidPlayerConfigGen.setPreviewTime(). Exemple pour la lecture VidSts :
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20-second preview.
vidSts.setPlayConfig(configGen);// Set for playback source.
...
Lorsque la durée de l'aperçu est définie, le serveur renvoie uniquement le contenu correspondant à la période d'aperçu au lieu de la vidéo complète lors de la lecture via le SDK Player Android.
VidPlayerConfigGen prend en charge les paramètres de requête serveur. Description des paramètres de requête.
Les formats vidéo FLV et MP3 ne prennent pas en charge la lecture d'aperçu.
Définir la liste noire
Le SDK Player Android fournit un mécanisme de liste noire de décodage matériel. Pour les appareils qui ne peuvent explicitement pas utiliser le décodage matériel, le décodage logiciel est utilisé directement afin d'éviter des opérations inefficaces. Exemple :
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
La liste noire est automatiquement invalidée après la fermeture de l'application.
Définir le Referer
Définissez le Referer de la requête à l'aide de PlayerConfig. Combiné à la liste noire/liste d'autorisation Referer dans la console, cela permet de contrôler les permissions d'accès. Exemple :
// 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);
Définir le UserAgent
Définissez le UserAgent de la requête à l'aide de PlayerConfig. Le lecteur inclut l'UA dans les requêtes. Exemple :
// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Set UA.
config.mUserAgent = "UserAgent to set";
....// Other settings.
// Set configuration for the player.
aliPlayer.setConfig(config);
Configurer le délai et le nombre de tentatives réseau
Définissez le délai d'attente réseau et le nombre de tentatives à l'aide de PlayerConfig. Exemple :
// 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);
Si NetworkRetryCount est défini et qu'un problème réseau provoque un chargement, le lecteur effectue NetworkRetryCount tentatives, chacune espacée de mNetworkTimeout.
Si l'état de chargement persiste après plusieurs tentatives, l'événement
onErrorest déclenché, avec ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT.Si NetworkRetryCount est défini à 0, lorsque le délai de nouvelle tentative réseau expire, le lecteur déclenche l'événement
onInfo, avec InfoBean.getCode()=InfoCode.NetworkRetry. À ce stade, vous pouvez appeler la méthodereloaddu lecteur pour recharger le réseau ou gérer la situation autrement.
Configurer le cache et le contrôle de latence
Le SDK Player Android fournit des interfaces pour contrôler le cache et la latence via PlayerConfig. Exemple :
Définir les en-têtes HTTP
À l'aide de la méthode PlayerConfig, vous pouvez ajouter des paramètres d'en-tête HTTP aux requêtes du lecteur. Exemple :
// 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);
Picture-in-Picture
Pour des exemples de code détaillés, reportez-vous au module API-Example Lecture Picture-in-Picture (PictureInPicture). Ce projet d'exemple basé sur Java pour le SDK ApsaraVideo Player pour Android aide les développeurs à maîtriser rapidement les fonctionnalités essentielles d'intégration du SDK.
Procédure :
-
Dans le fichier
AndroidManifest.xml, déclarez les permissions Picture-in-Picture.<activity android:name=".PictureInPictureActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" /> -
Basculez l'
Activitycible en mode Picture-in-Picture.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());Vous pouvez déclencher le mode Picture-in-Picture depuis un événement OnClick (clic), en quittant l'application ou en y revenant. Méthodes d'implémentation :
Déclencheur OnClick (événement clic)
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()); } });Déclenchement en quittant l'application
@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"); }Déclenchement au retour dans l'application
@Override public void onBackPressed() { super.onBackPressed(); // Trigger from back press. enterPictureInPictureMode(); } -
Gérez l'interface utilisateur pour l'apparition/disparition du Picture-in-Picture.
@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"); } }
Dégradation RTS Live
Pour des exemples de code détaillés, reportez-vous au module API-Example Lecture live RTS ultra-basse latence (RtsLiveStream). Ce projet d'exemple basé sur Java pour le SDK ApsaraVideo Player pour Android aide les développeurs à maîtriser rapidement les fonctionnalités essentielles d'intégration du SDK.
Basculer les canaux audio gauche/droite
Le SDK Player Android fournit la méthode setOutputAudioChannel pour définir le canal audio de sortie. Si la source d'entrée est stéréo, vous pouvez basculer vers le canal gauche ou droit à l'aide de cette méthode. Si la source d'entrée est mono, le paramètre n'a aucun effet.
Le paramètre du canal audio de sortie affecte à la fois le rendu audio et les rappels de données PCM.
/*
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();
Analyser les flux audio
Configurez un écouteur pour obtenir les données des flux audio et vidéo. Les flux ne doivent pas être chiffrés, car les flux chiffrés ne peuvent pas être analysés.
Définir la couleur d'arrière-plan vidéo
Le SDK Player Android permet de définir la couleur d'arrière-plan pour le rendu du lecteur. Interface et instructions d'utilisation :
Exemple d'interface
/**
* Set video background color.
*
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);
Instructions d'utilisation
// 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);
vidAuthDéfinir le domaine de lecture spécifié
À l'aide de vidAuth, vous pouvez spécifier des champs tels que le domaine pour le vid. Pour les champs pris en charge, consultez Paramètres de requête GetPlayInfo. Interface et instructions d'utilisation :
Exemple d'interface
/**
* Set playback parameters.
*
* @param playConfig Playback parameters.
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);
Instructions d'utilisation
Utilisez la méthode addPlayerConfig de VidPlayerConfigGen pour ajouter le champ playDomain.
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);
Plugin de décodage H.266
Le H.266 (VVC/Versatile Video Coding) est une norme de codage vidéo de nouvelle génération qui réduit considérablement le débit binaire à qualité équivalente. La capacité de décodage H.266 est conditionnée indépendamment sous forme de plugin pour une intégration à la demande.
Prérequis
Version du SDK Player/intégré V7.6.0 ou ultérieure.
Autorisation de licence Édition Professionnelle obtenue. Obtenir une licence SDK Player.
ApsaraVideo Player avec le plugin de décodage H.266 prend uniquement en charge les vidéos H.266 transcodées par ApsaraVideo VOD via le transcodage audio et vidéo.
Intégrer le plugin
Activer le plugin
À partir du SDK Player Android 7.7.0, le plugin est activé par défaut après l'intégration et ne nécessite pas d'activation manuelle.
AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);
Codes d'erreur associés
Pour les codes d'erreur du plugin de décodage H.266, consultez Problèmes courants pour les lecteurs sur toutes les plateformes.
Rafraîchissement automatique des sources de lecture
L'activation du rafraîchissement automatique des sources de lecture évite les interruptions de lecture causées par l'expiration des sources sous des mécanismes d'authentification.
Prérequis
Version du SDK Player/intégré V7.9.0 ou ultérieure.
Utilisation de la source VidAuth pour la lecture ou votre activité a configuré la signature d'URL.
Source VidAuth
Exemple d'interface
/**
* 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);
Composants de la fonctionnalité
Source UrlSource
Exemple d'interface
/**
* 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);
Composants de la fonctionnalité
Fonctions utilitaires supplémentaires
En prenant l'authentification de type A comme exemple.
Changer de carte réseau liée
Le SDK Player Android fournit la méthode AliPlayerGlobalSettings.enableSwitchNIC pour basculer automatiquement de carte réseau lors d'anomalies réseau, garantissant une lecture stable des ressources. Exemple :
Cela ne prend effet que lorsque le commutateur est activé et que plusieurs cartes réseau existent.
AliPlayerGlobalSettings.enableSwitchNIC(true);
Amélioration audio
Le SDK Player Android fournit un plugin d'amélioration audio pour améliorer l'expérience de lecture audio, comprenant la normalisation du volume, l'amélioration de la voix et le son surround.
Présentation de la fonctionnalité
-
Normalisation du volume : Ajuste automatiquement tout le contenu audio à un niveau de volume constant, améliorant considérablement l'expérience de lecture pour les vidéos dont le volume d'origine est trop faible ou trop élevé.
Canaux pris en charge : Mono / Stéréo / 5.1 / 7.1.
Fréquences d'échantillonnage prises en charge : 16kHz / 44.1kHz / 48kHz.
-
Amélioration de la voix : Améliore intelligemment les dialogues tout en préservant le timbre d'origine, rendant les voix plus claires et plus brillantes dans les scènes bruyantes.
Canaux pris en charge : Stéréo.
Fréquences d'échantillonnage prises en charge : 44.1kHz / 48kHz.
-
Son surround : Applique un rendu surround virtuel aux vidéos multicanaux et stéréo, offrant une expérience immersive sur casque ou appareils standards. Inclut les modes 3DSurround (surround stéréo) et MegaBass (super basses).
Canaux pris en charge : Mono / Stéréo / 5.1 / 7.1.
Fréquences d'échantillonnage prises en charge : 44.1kHz / 48kHz.
Prérequis
Version du SDK Player/intégré V7.13.0 ou ultérieure.
Autorisation de licence Édition Professionnelle obtenue. Obtenir une licence SDK Player.
Prise en charge des sources audio pour l'amélioration audio :
Flux VOD : Doivent utiliser le transcodage audio et vidéo ApsaraVideo VOD.
Flux en direct : Prend en charge n'importe quelle source.
Intégrer le plugin
Intégration Maven (recommandée)
Ajoutez la dépendance pour la version spécifiée du plugin dans le fichier build.gradle de votre application :
Pour les dernières versions du SDK Player Android, consultez Historique des versions du SDK Android.
// x.x.x matches the player SDK version number.
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'
Intégration locale
Téléchargez la dernière version du SDK Player Android et copiez le package AlivcAudioEnhanceFilter dans le répertoire libs de votre projet (créez-le manuellement s'il n'existe pas). Pour plus de détails, consultez Intégration locale.
Interfaces de la fonctionnalité
setFilterValid
Contrôle le commutateur principal de l'amélioration audio. Le nom target pour le filtre d'amélioration audio est audioEnhance. Lorsqu'il est désactivé, les trois sous-fonctionnalités sont inactives (désactivé par défaut).
player.setFilterValid("audioEnhance", true); // Enable.
player.setFilterValid("audioEnhance", false); // Disable.
setFilterConfig
Définissez FilterConfig avant prepare. Cela prend effet après le début de la lecture.
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);
|
Paramètre |
Type |
Description |
|
|
Boolean |
Commutateur de la fonctionnalité son surround. |
|
|
String |
Type de son surround : |
|
|
Boolean |
Commutateur de la fonctionnalité d'amélioration de la voix. |
|
|
Float |
Intensité de l'amélioration de la voix, plage 1.0 ~ 10.0. |
|
|
Boolean |
Commutateur de la fonctionnalité de normalisation du volume. |
updateFilterConfig
Pendant ou après la préparation du lecteur, pour ajuster dynamiquement les paramètres, appelez cette interface pour les mettre à jour.
Appeler updateFilterConfig avant prepare n'a aucun effet. Utilisez setFilterConfig pour la configuration initiale.
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];
Le type de son surround ("3DSurround" / "MegaBass") et l'intensité de l'amélioration de la voix (dialoguenhance_voice) doivent être définis conjointement avec l'attribut enable lors de la première utilisation. Sinon, les valeurs par défaut sont utilisées pour l'initialisation (le son surround utilise par défaut "3DSurround", l'intensité de la voix utilise par défaut 1.0), et elles ne peuvent pas être modifiées pendant la lecture.
Performance
Définir le scénario de lecture
La définition du scénario de lecture configure automatiquement les paramètres optimaux (y compris les paramètres de tampon et les commutateurs de fonctionnalités). Elle est compatible avec les paramètres personnalisés via l'interface setConfig (les paramètres personnalisés sont prioritaires).
Après avoir défini le scénario de lecture, vous pouvez consulter la configuration des paramètres à l'aide de l'interface
getConfig.
Exemple d'interface
/**
* Set the player scenario.
*
* @param scene
*/
abstract public void setPlayerScene(PlayerScene scene);
Scénarios de lecture
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
}
Instructions d'utilisation
// 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)
Pré-rendu
Le SDK Player Android permet de rendre rapidement la première image avant le début de la lecture, ce qui peut améliorer la vitesse de démarrage.
Cette fonctionnalité est désactivée par défaut.
Vous devez définir la
Viewavant d'appelerPreparepour garantir que l'image soit rendue dans laViewdès qu'elle est prête.-
L'activation de cette fonctionnalité affecte l'ordre de déclenchement des événements de succès de préparation et de rendu de la première image : sans elle, le succès de préparation est déclenché avant le rendu de la première image ; avec elle, en raison des différences de vitesse de décodage et de rendu, le rendu de la première image peut être déclenché avant le succès de préparation, mais cela n'affecte pas la lecture.
Exemple :
aliPlayer.setOption(ALLOW_PRE_RENDER, 1);
Cache local
Pour des exemples de code détaillés, reportez-vous au module API-Example Préchargement vidéo (Preload). Ce projet d'exemple basé sur Java pour le SDK ApsaraVideo Player pour Android aide les développeurs à maîtriser rapidement les fonctionnalités essentielles d'intégration du SDK.
Le cache local améliore la vitesse de démarrage, la vitesse de recherche et réduit les saccades lors de lectures répétées, tout en économisant la bande passante.
Activer le cache local
Le cache local est désactivé par défaut. Pour l'utiliser, activez-le manuellement à l'aide de AliPlayerGlobalSettings et enableLocalCache. Exemple :
-
Si les URL de lecture vidéo incluent des paramètres d'authentification, ces paramètres changent entre la mise en cache et la lecture. Pour améliorer le taux de réussite du cache pour la même URL sous différentes authentifications, supprimez les paramètres d'authentification avant de calculer la valeur de hachage (par exemple, MD5) via
setCacheUrlHashCallback. Par exemple, pour une URL commehttp://****.mp4?aaa, calculez le hachage en utilisanthttp://****.mp4. Cependant, pour les vidéos m3u8 chiffrées, si vous supprimez les paramètres d'authentification des keyURL avant le hachage, différentes vidéos pourraient utiliser la même clé, provoquant un échec de lecture. Solution : Dans le rappelsetCacheUrlHashCallback, vérifiez le domaine et supprimez les paramètres d'authentification uniquement pour les domaines de lecture (http(s)://xxxxx.m3u8?aaaa), pas pour les domaines keyURL (http(s)://yyyyy?bbbb). Utilisez curl pour obtenir la liste de lecture M3U8 de la vidéo HLS chiffrée, où playURL est l'adresse M3U8 et keyURL est l'adresse de la clé de déchiffrement AES-128. Exemple de sortie terminal :# 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 -
Si le serveur prend en charge les protocoles HTTP et HTTPS pointant vers le même fichier média, supprimez ou normalisez le protocole avant de calculer le hachage. Par exemple :
Pour les URL
https://****.mp4ethttp://****.mp4, calculez le hachage en utilisant****.mp4.Pour l'URL
https://****.mp4, normalisez enhttp://****.mp4avant de calculer le hachage.
-
Pour le SDK Player version 5.5.4.0 et ultérieure, si l'URL de lecture vidéo inclut des paramètres d'authentification et utilise le protocole HLS, vous pouvez définir
PlayerConfig.mEnableStrictAuthModepour choisir entre les modes d'authentification (la valeur par défaut est false pour les anciennes versions ; true pour la version 7.13.0 et ultérieure) :Authentification non stricte (false) : L'authentification est mise en cache. Si seule une partie du média a été mise en cache précédemment, le lecteur utilise l'authentification mise en cache pour les requêtes suivantes. Si l'authentification URL a une courte période de validité ou si la lecture reprend après une longue pause, l'authentification peut expirer. Intégrez le rafraîchissement automatique des sources de lecture pour gérer l'expiration de l'authentification.
Authentification stricte (true) : L'authentification n'est pas mise en cache. L'authentification se produit à chaque démarrage, provoquant un échec du démarrage sans réseau.
Activer ou désactiver le cache local pour une URL unique
Pour activer ou désactiver le cache local pour une URL spécifique, définissez-le dans la player config.
// 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);
Préchargement
Le préchargement est une évolution du cache local qui améliore la vitesse de démarrage vidéo en définissant l'utilisation de la mémoire pour la mise en cache vidéo.
Limitations du préchargement :
Prend actuellement en charge le chargement de fichiers médias uniques tels que MP4, MP3, FLV et HLS.
Le SDK Player Android fournit par défaut une planification automatique des ressources réseau pendant le préchargement afin de réduire l'impact des requêtes réseau de préchargement sur la lecture vidéo en cours. La stratégie de planification automatique n'autorise les requêtes de préchargement qu'après que le tampon de la vidéo en cours de lecture ait atteint un certain seuil. Pour contrôler vous-même les requêtes de préchargement en temps réel, désactivez cette stratégie à l'aide de la méthode suivante :
AliPlayerGlobalSettings.enableNetworkBalance(false);
Activez le cache local. Pour les étapes détaillées, consultez Cache local.
-
Définissez la source de données.
VidAuth (recommandé)
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. -
Définissez les paramètres de la tâche.
RemarqueS'applique uniquement aux vidéos multi-débits. Choisissez l'une des options suivantes :
setDefaultBandWidth,setDefaultResolutionousetDefaultQuality.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); -
Ajoutez l'écouteur de tâche.
-
Construisez la tâche et ajoutez-la à l'instance
MediaLoaderV2pour démarrer le préchargement.VidAuth (recommandé)
// 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) -
Facultatif : Gérez les tâches.
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. -
Facultatif : Supprimez les fichiers chargés.
Supprimez les fichiers chargés selon vos besoins pour économiser de l'espace. Le SDK Player Android ne fournit pas d'interface de suppression ; supprimez les fichiers du répertoire de chargement dans votre application.
Préchargement dynamique
La stratégie de préchargement dynamique permet aux intégrateurs de contrôler à la fois le cache de la vidéo en cours de lecture et le nombre ainsi que le cache des éléments préchargés, équilibrant ainsi l'expérience de lecture et les coûts.
Préchargement vidéo HLS multi-débits
Dans les scénarios de lecture vidéo HLS multi-débits avec listPlayer, les intégrateurs peuvent précharger des flux correspondant à la définition de lecture actuelle et choisir des modes de préchargement en fonction des besoins métier.
Obtenir la vitesse de téléchargement
Obtenez la vitesse de téléchargement vidéo actuelle via le rappel onInfo, mis en œuvre par l'interface getExtraValue. Exemple :
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
// Current download speed.
long extraValue = infoBean.getExtraValue();
}
}
});
Fonctionnalités réseau
HTTPDNS
HTTPDNS résout les noms de domaine via HTTP vers des serveurs spécifiques, réduisant les risques de détournement DNS et fournissant une résolution plus rapide et plus stable.
Le SDK ApsaraVideo Player fournit un HTTPDNS amélioré pour les domaines Alibaba Cloud CDN, prenant en charge une planification CDN précise et une résolution en temps réel.
Exemple d'utilisation de HTTPDNS amélioré
HTTPDNS amélioré fournit des services uniquement pour les domaines Alibaba Cloud CDN. Assurez-vous que votre domaine est un domaine Alibaba Cloud CDN et qu'il est correctement configuré. Pour ajouter des domaines CDN dans VOD, consultez Ajouter un domaine accéléré. Alibaba Cloud CDN.
// Enable enhanced HTTPDNS.
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// Optional: Add HTTPDNS pre-resolution domains.
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");
HTTP/2
Le SDK Player Android active HTTP/2 par défaut à partir de la version 5.5.0.0.
Le SDK Player Android prend en charge le protocole HTTP/2, qui utilise le multiplexage pour éviter le blocage de tête de ligne et améliorer les performances de lecture. Exemple :
AliPlayerGlobalSettings.setUseHttp2(true);
Pré-connexion TCP HTTP
Pour les requêtes de lecture vidéo HTTP (non-HTTPS), l'établissement préalable de connexions TCP améliore considérablement l'expérience utilisateur, réduit le temps de connexion réseau, assure une lecture immédiate et continue, et optimise l'utilisation des ressources réseau et système. Utilisation :
// 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");
Téléchargement vidéo
Pour des exemples de code détaillés, reportez-vous au module API-Example Téléchargement vidéo et lecture hors ligne (Download). Ce projet d'exemple basé sur Java pour le SDK ApsaraVideo Player pour Android aide les développeurs à maîtriser rapidement les fonctionnalités essentielles d'intégration du SDK.
Le SDK Player Android fournit une fonctionnalité de téléchargement vidéo pour les services VOD, permettant aux utilisateurs de mettre en cache des vidéos localement à l'aide d'ApsaraVideo Player. Il offre deux méthodes de téléchargement : téléchargement standard et téléchargement sécurisé.
-
Téléchargement standard
Les données vidéo téléchargées ne sont pas chiffrées par Alibaba Cloud et peuvent être lues par des lecteurs tiers.
-
Téléchargement sécurisé
Les données vidéo téléchargées sont chiffrées par Alibaba Cloud. Les lecteurs tiers ne peuvent pas les lire. Seul ApsaraVideo Player peut les lire.
Instructions d'utilisation
Seules les méthodes VidSts et VidAuth prennent en charge le téléchargement vidéo.
Pour utiliser la fonctionnalité de téléchargement vidéo du lecteur, activez et configurez le mode de téléchargement dans la console VOD. Pour les étapes détaillées, consultez Téléchargement hors ligne.
Le téléchargement vidéo prend en charge les téléchargements interrompus et repris.
Procédure
-
Facultatif : Configurez le fichier de vérification de chiffrement pour le téléchargement sécurisé. Requis uniquement pour le téléchargement sécurisé ; non nécessaire pour le téléchargement standard.
RemarqueAssurez-vous que le fichier de vérification de chiffrement configuré correspond aux informations de votre application ; sinon, le téléchargement vidéo échouera.
Pour le téléchargement sécurisé, configurez le fichier de clé généré dans la console VOD dans le SDK Player pour la vérification de déchiffrement lors du téléchargement et de la lecture vidéo. Pour la génération du fichier de clé, consultez Activer le téléchargement sécurisé.
Nous recommandons de configurer cela une seule fois dans Application. Exemple :
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. -
Créez et configurez le téléchargeur.
Créez un téléchargeur à l'aide d'AliDownloaderFactory. Exemple :
AliMediaDownloader mAliDownloader = null; ...... // Create downloader. mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); // Configure download save path. mAliDownloader.setSaveDir("Save folder path"); -
Configurez les écouteurs d'événements.
Le téléchargeur fournit plusieurs écouteurs d'événements. Exemple :
-
Préparez la source de téléchargement.
Préparez la source de téléchargement à l'aide de la méthode
prepare. Les sources de téléchargement prennent en charge les méthodes VidSts et VidAuth. Exemples :-
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);
RemarqueLe format du fichier source correspond au format du fichier téléchargé ; le modifier n'est pas pris en charge.
Si vous avez activé le transfert de paramètre de chiffrement standard HLS dans la console VOD avec le nom de paramètre par défaut MtsHlsUriToken, consultez Transfert de paramètre de chiffrement standard HLS, puis définissez la valeur MtsHlsUriToken dans la source VOD comme indiqué ci-dessus.
-
-
Après une préparation réussie, sélectionnez l'élément de téléchargement et démarrez le téléchargement.
Après une préparation réussie, la méthode
OnPreparedListenerest appelée. Le TrackInfo renvoyé contient des informations telles que la définition du flux vidéo. Sélectionnez un Track pour le téléchargement. Exemple :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(); } -
(Facultatif) Mettez à jour la source de téléchargement.
Pour éviter l'expiration de VidSts et VidAuth, vous pouvez mettre à jour les informations de la source de téléchargement et démarrer le téléchargement. Exemple :
// Update download source. mAliDownloader.updateSource(VidSts); // Start download. mAliDownloader.start(); -
Après un succès ou un échec du téléchargement, libérez le téléchargeur.
Après un téléchargement réussi, appelez
releasedans le rappelonCompletionouonErrorpour libérer le téléchargeur. Exemple :mAliDownloader.stop(); mAliDownloader.release(); -
Facultatif : Supprimez les fichiers téléchargés.
Vous pouvez supprimer les fichiers téléchargés pendant ou après le téléchargement. Exemple :
// 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");
Étapes suivantes
Les vidéos téléchargées peuvent être lues à l'aide d'ApsaraVideo Player. Étapes :
-
Une fois le téléchargement terminé, obtenez le chemin absolu du fichier vidéo.
String path = mAliDownloader.getFilePath(); -
Définissez le chemin absolu via VOD UrlSource pour la lecture.
UrlSource urlSource = new UrlSource(); urlSource.setUri("Playback address");// Set absolute path of downloaded video. aliPlayer.setDataSource(urlSource);
Lecture chiffrée
Les vidéos VOD prennent en charge le chiffrement standard HLS, la cryptographie propriétaire Alibaba Cloud et le chiffrement DRM. Les vidéos en direct ne prennent en charge que le chiffrement DRM. Pour la lecture chiffrée, consultez Lecture chiffrée.
Lecture Native RTS
Le SDK Player Android intègre le SDK Native RTS pour la diffusion en direct à très faible latence. Mettre en œuvre le tirage de flux RTS sur Android.