Use os recursos avançados do Android Player SDK, incluindo reprodução de playlists, legendas, download de vídeo e reprodução criptografada. Referência da API.
Para executar a demonstração, baixe-a e siga as instruções em Executar a demonstração para compilar e executar o projeto.
Verificação de licença da Professional Edition
Alguns recursos do player exigem uma licença da Professional Edition. Verifique os recursos suportados em Detalhes dos recursos do Player SDK. Para usar esses recursos, conclua a autorização conforme descrito em Obter uma licença do Player SDK.
Defina um listener antes que o aplicativo inicie ou antes de chamar qualquer API do player:
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);
}
});
O PremiumBizType enumera os recursos profissionais. Ao usar um recurso relacionado, o player verifica a licença e retorna o resultado por meio deste callback. Se isValid for falso, errorMsg conterá o motivo.
Reprodução
Reprodução de playlist
O Android Player SDK oferece reprodução de playlists com pré-carregamento, melhorando significativamente a velocidade de início para vídeos curtos.
Procedimento
Para uma melhor experiência de reprodução de playlist, use a solução de dramas curtos. Desenvolvimento de cliente para dramas curtos.
Reprodução de vídeos com transparência
Visão geral do recurso
O ApsaraVideo Player SDK suporta renderização de canal alfa para animações de presentes transparentes. Em cenários de transmissão ao vivo, essas animações são reproduzidas sem obscurecer o conteúdo ao vivo.
Limites
O Integrated SDK versão 6.8.0 ou posterior, ou o Player SDK versão 6.9.0 ou posterior, suporta renderização transparente.
Benefícios
Vídeos MP4 com transparência oferecem melhor qualidade de animação, tamanhos de arquivo menores, maior compatibilidade e eficiência de desenvolvimento aprimorada em comparação com APNG ou IXD.
Melhor qualidade de animação: O MP4 retém detalhes e cores originais com mais precisão do que APNG ou IXD.
Tamanho de arquivo reduzido: O MP4 comprime de forma mais eficiente, melhorando a velocidade de carregamento e reduzindo o consumo de largura de banda.
Maior compatibilidade: O formato MP4 é universalmente suportado em dispositivos e navegadores.
Eficiência de desenvolvimento elevada: Os desenvolvedores não precisam implementar lógicas complexas de análise e renderização.
Código de exemplo
Legendas externas
Para exemplos de código detalhados, consulte o módulo API-Example Demonstração e troca de legendas externas (ExternalSubtitle). Este projeto de exemplo baseado em Java para o ApsaraVideo Player SDK para Android ajuda os desenvolvedores a dominar rapidamente os principais recursos de integração do SDK.
O Android Player SDK suporta a adição e troca de legendas externas nos formatos SRT, SSA, ASS e VTT.
-
Crie uma view para exibir legendas.
Crie diferentes views com base no formato da legenda.
Ao integrar o player V7.6.0 ou posterior e usar
VttSubtitleViewpara exibir legendas SRT e VTT, defina o seguinte listener:// 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); } }); -
Adicione legendas.
ImportanteDefina os arquivos de legenda no callback
onPrepared.mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // Set subtitles (must be done in onPrepared). mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL); } }); -
Defina listeners relacionados às legendas.
Legendas externas (renderização personalizada baseada em componentes de renderização)
O suporte completo para legendas externas WebVTT é implementado usando VttSubtitleView e WebVttResolver, permitindo a personalização flexível do tamanho da fonte, cor e fontes específicas das legendas.
Cenários aplicáveis:
Personalização de estilos de legendas WebVTT.
Integração do ApsaraVideo Player SDK versão 7.11.0 ou posterior.
Pré-requisitos:
Arquivos de fonte (.ttf) colocados no diretório
assets/fonts/do seu projeto.minSdk do projeto ≥ 21 (recomendado).
Listeners de legenda adicionados e conteúdo WebVTT acessível.
-
Crie
CustomStyleWebVttResolvere implementeWebVttResolver.public class CustomStyleWebVttResolver extends WebVttResolver { // Implement creation method. public CustomStyleWebVttResolver(Context context) { super(context); // Initialize fonts and other resources here later. } } -
Substitua
applyTextSpanspara personalizar estilos.Este método é chamado depois que a classe pai analisa os estilos básicos, permitindo o processamento secundário das legendas.
-
Método 1: Modifique
VttContentAttributee chame o método da classe pai./** * 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); } -
Opere diretamente sobre
SpannableStringBuilderpara modificar estilos WebVTT diretamente.ImportanteEste método pode causar perda de estilos nativos do WebVTT.
/** * 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 // ); }
-
-
Defina fontes personalizadas (Typeface).
-
Carregue fontes personalizadas do diretório
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. } } -
Aplique fontes personalizadas às legendas.
@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); } }Compatibilidade com versões anteriores do Android: Como o
TypefaceSpanno Android P (API 28) e anteriores não suporta passar diretamente um objetoTypeface, você precisa criar umMetricAffectingSpanpersonalizado./** * 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); } }
-
-
Integre com o player.
-
Inicialize a view de legenda.
// 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); } -
Vincule callbacks de legenda externa.
// 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); } } });
-
Reprodução apenas de áudio
Desative a reprodução de vídeo para obter reprodução apenas de áudio. Configure o PlayerConfig antes de chamar prepare.
PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // Enable audio-only playback.
aliPlayer.setConfig(config);
Alternância entre decodificador de software/hardware
Altere o método de decodificação antes do início da reprodução. A alteração durante a reprodução não tem efeito.
O Android Player SDK fornece decodificação de hardware H.264 e H.265 com o interruptor enableHardwareDecoder. A decodificação de hardware é ativada por padrão e reverte automaticamente para decodificação de software se a inicialização falhar. Exemplo:
// Enable hardware decoding. Enabled by default.
aliPlayer.enableHardwareDecoder(true);
Se o player alternar automaticamente da decodificação de hardware para software, ele aciona o callback onInfo. Exemplo:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
// Switched to software decoding.
}
}
});
Reprodução adaptativa H.265
Se o dispositivo estiver na lista de bloqueios de decodificação de hardware H.265 baseada em nuvem ou se a decodificação de hardware H.265 falhar, a degradação adaptativa será acionada: se existir um stream de backup H.264, o player o utilizará; caso contrário, haverá degradação para decodificação de software H.265.
Este recurso é ativado somente após você ativar o serviço de valor agregado de decodificação adaptativa integrada cliente-nuvem. Você precisa enviar um formulário Yida para solicitar autorização de licença.
O serviço de valor agregado de decodificação adaptativa integrada cliente-nuvem inclui: 1. Entrega dinâmica de dados de compatibilidade de decodificação de hardware baseados em nuvem; 2. Degradação adaptativa de streams H.265 para streams H.264.
-
O SDK ainda possui a capacidade de alternar automaticamente para decodificação de software em caso de falha na decodificação de hardware, mesmo sem ativar o serviço de valor agregado.
Exemplo de definição de um stream de backup:
// 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 "";
}
}
});
Troca adaptativa de definição de vídeo baseada em rede
Streams de vídeo com bitrate adaptativo HLS podem ser gerados por meio do grupo de modelos de empacotamento e transcodificação de vídeo no ApsaraVideo VOD. Para operações detalhadas, consulte Configurar bitrate adaptativo para VOD.
-
Para streams adaptativos gerados pela transcodificação do ApsaraVideo VOD, se você usar reprodução Vid, deverá especificar a lista de definições de reprodução padrão como
DEFINITION_AUTOpara obter e reproduzir o stream de vídeo adaptativo. Caso contrário, o player selecionará um stream de vídeo de baixa definição de acordo com a lógica padrão. Para a ordem padrão de reprodução de definições, consulte Qual definição o Player SDK reproduz por padrão quando várias definições são transcodificadas?. Exemplo de especificação da lista de definições para reprodução VidAuth:VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
O Android Player SDK suporta streams de vídeo HLS e DASH com bitrate adaptativo. Após o sucesso de prepare, você pode obter informações sobre cada stream de bitrate, ou seja, TrackInfo, chamando getMediaInfo. Exemplo:
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();
Durante a reprodução, você pode trocar o stream de bitrate em execução chamando o método selectTrack do player. Quando o valor for AUTO_SELECT_INDEX, a troca adaptativa de bitrate será ativada. Exemplo:
int index = trackInfo.getIndex();
// Switch bitrate.
aliPlayer.selectTrack(index);
// Switch bitrate and enable adaptive switching.
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
O resultado da troca é retornado por meio do callback OnTrackChangedListener (definido antes de chamar selectTrack). Exemplo:
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().
}
});
Opcional: Antes de chamar o método selectTrack do player para alternar para bitrate adaptativo, você pode definir o limite superior para troca de bitrate adaptativo (ABR) na configuração para evitar trocas automáticas para bitrates inesperados. Exemplo: (Recomendamos chamar o código abaixo antes que o player chame o método prepare ou antes que o player de playlist chame o método moveTo para que tenha efeito.)
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);
Captura de tela
O Android Player SDK fornece um recurso de captura de tela do vídeo atual, implementado pela interface snapshot. Ele captura os dados originais e os retorna como um bitmap. A interface de callback é OnSnapShotListener. Exemplo:
// 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();
Reprodução de prévia
Ao configurar o ApsaraVideo VOD, o Android Player SDK pode implementar reprodução de prévia, suportando os métodos de reprodução VidSts e VidAuth (VidAuth é recomendado para VOD). Para instruções de configuração e uso, consulte Pré-visualizar vídeos.
Após configurar a reprodução de prévia, defina a duração da prévia para o player usando o método VidPlayerConfigGen.setPreviewTime(). Exemplo para reprodução VidSts:
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20-second preview.
vidSts.setPlayConfig(configGen);// Set for playback source.
...
Quando a duração da prévia é definida, o servidor retorna apenas o conteúdo dentro do período de prévia, em vez do vídeo completo, ao reproduzir através do Android Player SDK.
O VidPlayerConfigGen suporta parâmetros de solicitação do servidor. Descrição dos parâmetros de solicitação.
Os formatos de vídeo FLV e MP3 não suportam reprodução de prévia.
Definir lista de bloqueios
O Android Player SDK fornece um mecanismo de lista de bloqueios de decodificação de hardware. Para dispositivos que explicitamente não podem usar decodificação de hardware, a decodificação de software é usada diretamente para evitar operações ineficazes. Exemplo:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
A lista de bloqueios é invalidada automaticamente após o encerramento do aplicativo.
Definir Referer
Defina o Referer da solicitação usando PlayerConfig. Combinado com a lista de bloqueios/permissões de Referer no console, isso controla as permissões de acesso. Exemplo:
// 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);
Definir UserAgent
Defina o UserAgent da solicitação usando PlayerConfig. O player inclui o UA nas solicitações. Exemplo:
// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Set UA.
config.mUserAgent = "UserAgent to set";
....// Other settings.
// Set configuration for the player.
aliPlayer.setConfig(config);
Configurar tempo e contagem de tentativas de rede
Defina o tempo limite de rede e a contagem de tentativas usando PlayerConfig. Exemplo:
// 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);
Se NetworkRetryCount estiver definido e um problema de rede causar carregamento, o player tentará novamente NetworkRetryCount vezes, sendo cada intervalo igual a mNetworkTimeout.
Se o status de carregamento persistir após várias tentativas, o evento
onErrorserá acionado, com ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT.Se NetworkRetryCount estiver definido como 0, quando o tempo limite de tentativa de rede expirar, o player acionará o evento
onInfo, com InfoBean.getCode()=InfoCode.NetworkRetry. Nesse ponto, você pode chamar o métodoreloaddo player para recarregar a rede ou lidar com a situação de outra forma.
Configurar cache e controle de latência
O Android Player SDK fornece interfaces para controlar cache e latência através de PlayerConfig. Exemplo:
Definir cabeçalhos HTTP
Usando o método PlayerConfig, você pode adicionar parâmetros de cabeçalho HTTP às solicitações no player. Exemplo:
// 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
Para exemplos de código detalhados, consulte o módulo API-Example Reprodução Picture-in-Picture (PictureInPicture). Este projeto de exemplo baseado em Java para o ApsaraVideo Player SDK para Android ajuda os desenvolvedores a dominar rapidamente os principais recursos de integração do SDK.
Procedimento:
-
No arquivo
AndroidManifest.xml, declare as permissões de Picture-in-Picture.<activity android:name=".PictureInPictureActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" /> -
Alterne a
Activityalvo para o modo 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());Você pode acionar o modo Picture-in-Picture a partir de OnClick (evento de clique), ao sair do aplicativo ou ao retornar ao aplicativo. Métodos de implementação:
Acionador OnClick (evento de clique)
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()); } });Acionar ao sair do aplicativo
@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"); }Acionar ao retornar ao aplicativo
@Override public void onBackPressed() { super.onBackPressed(); // Trigger from back press. enterPictureInPictureMode(); } -
Gerencie a UI para exibição/desaparecimento do 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"); } }
Degradação RTS ao vivo
Para exemplos de código detalhados, consulte o módulo API-Example Reprodução ao vivo RTS de latência ultrabaixa (RtsLiveStream). Este projeto de exemplo baseado em Java para o ApsaraVideo Player SDK para Android ajuda os desenvolvedores a dominar rapidamente os principais recursos de integração do SDK.
Alternar canais de áudio esquerdo/direito
O Android Player SDK fornece o método setOutputAudioChannel para definir o canal de saída de áudio. Se a fonte de entrada for estéreo, você pode alternar para o canal esquerdo ou direito usando este método. Se a fonte de entrada for mono, a configuração não terá efeito.
A configuração do canal de saída de áudio afeta tanto a renderização de áudio quanto os callbacks de dados 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();
Analisar streams de áudio
Defina um listener para obter dados de streams de áudio e vídeo. Os streams não devem estar criptografados, pois streams criptografados não podem ser analisados.
Definir cor de fundo do vídeo
O Android Player SDK suporta a definição da cor de fundo para a renderização do player. Interface e instruções de uso:
Exemplo de interface
/**
* Set video background color.
*
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);
Instruções de uso
// 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);
vidAuthDefinir domínio de reprodução especificado
Usando vidAuth, você pode especificar campos como o domínio para o vid. Para campos suportados, consulte Parâmetros de solicitação GetPlayInfo. Interface e instruções de uso:
Exemplo de interface
/**
* Set playback parameters.
*
* @param playConfig Playback parameters.
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);
Instruções de uso
Use o método addPlayerConfig de VidPlayerConfigGen para adicionar o campo 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 decodificação H.266
O H.266 (VVC/Versatile Video Coding) é um padrão de codificação de vídeo de próxima geração que reduz significativamente a taxa de bits com qualidade equivalente. A capacidade de decodificação H.266 é empacotada independentemente como um plugin para integração sob demanda.
Pré-requisitos
Versão do Player/Integrated SDK V7.6.0 ou posterior.
Autorização de licença da Professional Edition concluída. Obter uma licença do Player SDK.
O ApsaraVideo Player com o plugin de decodificação H.266 suporta apenas vídeos H.266 transcodificados pelo ApsaraVideo VOD transcodificação de áudio e vídeo.
Integrar plugin
Ativar plugin
A partir do Android Player SDK 7.7.0, o plugin é ativado por padrão após a integração e não requer ativação manual.
AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);
Códigos de erro relacionados
Para códigos de erro do plugin de decodificação H.266, consulte Problemas comuns para players em todas as plataformas.
Atualização automática de fontes de reprodução
Ativar a atualização automática para fontes de reprodução evita interrupções na reprodução causadas pela expiração da fonte sob mecanismos de autenticação.
Pré-requisitos
Versão do Player/Integrated SDK V7.9.0 ou posterior.
Uso de fonte VidAuth para reprodução ou seu negócio tem assinatura de URL configurada.
Fonte VidAuth
Exemplo de 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);
Componentes do recurso
Fonte UrlSource
Exemplo de 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);
Componentes do recurso
Funções utilitárias suplementares
Usando tipo de autenticação A como exemplo.
Alternar NIC vinculada
O Android Player SDK fornece o método AliPlayerGlobalSettings.enableSwitchNIC para alternar automaticamente NICs durante anomalias de rede, garantindo reprodução estável de recursos. Exemplo:
Isso só entra em vigor quando o interruptor está ativado e existem múltiplas NICs.
AliPlayerGlobalSettings.enableSwitchNIC(true);
Aprimoramento de áudio
O Android Player SDK fornece um plugin de aprimoramento de áudio para melhorar a experiência de reprodução de áudio, apresentando normalização de volume, aprimoramento de voz e som surround.
Introdução ao recurso
-
Normalização de volume: Ajusta automaticamente todo o conteúdo de áudio para um nível de volume consistente, melhorando significativamente a experiência de reprodução para vídeos com volume original excessivamente baixo ou alto.
Canais suportados: Mono / Estéreo / 5,1 / 7,1.
Taxas de amostragem suportadas: 16kHz / 44,1kHz / 48kHz.
-
Aprimoramento de voz: Aprimora inteligentemente o diálogo preservando o timbre original, tornando as vozes mais claras e brilhantes em cenas ruidosas.
Canais suportados: Estéreo.
Taxas de amostragem suportadas: 44,1kHz / 48kHz.
-
Som surround: Aplica renderização de surround virtual a vídeos multicanal e estéreo, proporcionando uma experiência imersiva em fones de ouvido ou dispositivos padrão. Inclui os modos 3DSurround (surround estéreo) e MegaBass (super graves).
Canais suportados: Mono / Estéreo / 5,1 / 7,1.
Taxas de amostragem suportadas: 44,1kHz / 48kHz.
Pré-requisitos
Versão do Player/Integrated SDK V7.13.0 ou posterior.
Autorização de Licença da Professional Edition obtida. Obter uma licença do Player SDK.
Suporte de fonte de áudio para aprimoramento de áudio:
Streams VOD: Devem usar transcodificação de áudio e vídeo do ApsaraVideo VOD.
Streams ao vivo: Suporta qualquer fonte.
Integrar plugin
Integração Maven (recomendada)
Adicione a dependência para a versão especificada do plugin no arquivo build.gradle do seu aplicativo:
Para as versões mais recentes do Android Player SDK, consulte Histórico de lançamentos do Android SDK.
// x.x.x matches the player SDK version number.
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'
Integração local
Baixe o Android Player SDK mais recente e copie o pacote AlivcAudioEnhanceFilter para o diretório libs do seu projeto (crie-o manualmente se não existir). Para detalhes, consulte Integração local.
Interfaces do recurso
setFilterValid
Controla o interruptor principal para aprimoramento de áudio. O nome target para o filtro de aprimoramento de áudio é audioEnhance. Quando desativado, todos os três sub-recursos ficam inativos (desativado por padrão).
player.setFilterValid("audioEnhance", true); // Enable.
player.setFilterValid("audioEnhance", false); // Disable.
setFilterConfig
Defina FilterConfig antes de prepare. Entra em vigor após o início da reprodução.
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);
|
Parâmetro |
Tipo |
Descrição |
|
|
Boolean |
Interruptor do recurso de som surround. |
|
|
String |
Tipo de som surround: |
|
|
Boolean |
Interruptor do recurso de aprimoramento de voz. |
|
|
Float |
Intensidade do aprimoramento de voz, faixa 1,0 ~ 10,0. |
|
|
Boolean |
Interruptor do recurso de normalização de volume. |
updateFilterConfig
Durante ou após a preparação do player, para ajustar parâmetros dinamicamente, chame esta interface para atualizá-los.
Chamar updateFilterConfig antes de prepare não tem efeito. Use setFilterConfig para a configuração inicial.
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];
O tipo de som surround ("3DSurround" / "MegaBass") e a intensidade do aprimoramento de voz (dialoguenhance_voice) devem ser definidos juntamente com o atributo enable no primeiro uso. Caso contrário, valores padrão serão usados para inicialização (som surround padrão é "3DSurround", intensidade de voz padrão é 1,0), e eles não poderão ser modificados durante a reprodução.
Desempenho
Definir cenário de reprodução
Definir o cenário de reprodução configura automaticamente parâmetros ideais (incluindo configurações de buffer e interruptores de recursos). É compatível com configurações de parâmetros personalizados via interface setConfig (configurações personalizadas têm precedência).
Após definir o cenário de reprodução, você pode visualizar a configuração de parâmetros usando a interface
getConfig.
Exemplo de interface
/**
* Set the player scenario.
*
* @param scene
*/
abstract public void setPlayerScene(PlayerScene scene);
Cenários de reprodução
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
}
Instruções de uso
// 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é-renderização
O Android Player SDK suporta renderizar rapidamente o primeiro quadro antes do início da reprodução, o que pode melhorar a velocidade de inicialização.
Este recurso é desativado por padrão.
Você deve definir a
Viewantes de chamarPreparepara garantir que o quadro seja renderizado naViewassim que estiver pronto.-
Ativar este recurso afeta a ordem de acionamento dos eventos de sucesso de preparação e renderização do primeiro quadro: sem ele, o sucesso de preparação é acionado antes da renderização do primeiro quadro; com ele, devido a diferenças na velocidade de decodificação e renderização, a renderização do primeiro quadro pode ser acionada antes do sucesso de preparação, mas isso não afeta a reprodução.
Exemplo:
aliPlayer.setOption(ALLOW_PRE_RENDER, 1);
Cache local
Para exemplos de código detalhados, consulte o módulo API-Example Pré-carregamento de vídeo (Preload). Este projeto de exemplo baseado em Java para o ApsaraVideo Player SDK para Android ajuda os desenvolvedores a dominar rapidamente os principais recursos de integração do SDK.
O cache local melhora a velocidade de início, a velocidade de busca e reduz travamentos para reprodução repetida, economizando largura de banda.
Ativar cache local
O cache local é desativado por padrão. Para usá-lo, ative-o manualmente usando AliPlayerGlobalSettings e enableLocalCache. Exemplo:
-
Se as URLs de reprodução de vídeo incluírem parâmetros de autenticação, os parâmetros mudarão entre o cache e a reprodução. Para melhorar a taxa de acerto de cache para a mesma URL sob diferentes autenticações, remova os parâmetros de autenticação antes de calcular o valor hash (por exemplo, MD5) via
setCacheUrlHashCallback. Por exemplo, para uma URL comohttp://****.mp4?aaa, calcule o hash usandohttp://****.mp4. No entanto, para vídeos m3u8 criptografados, se você remover parâmetros de autenticação das keyURLs antes do hashing, vídeos diferentes podem atingir a mesma chave, causando falha na reprodução. Solução: No callbacksetCacheUrlHashCallback, verifique o domínio e remova os parâmetros de autenticação apenas para domínios de reprodução (http(s)://xxxxx.m3u8?aaaa), não para domínios keyURL (http(s)://yyyyy?bbbb). Use curl para obter a playlist de vídeo criptografado HLS M3U8, onde playURL é o endereço M3U8 e keyURL é o endereço da chave de descriptografia AES-128. Exemplo de saída do 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 -
Se o servidor suportar protocolos HTTP e HTTPS apontando para o mesmo arquivo de mídia, remova ou padronize o protocolo antes de calcular o hash. Por exemplo:
Para URLs
https://****.mp4ehttp://****.mp4, calcule o hash usando****.mp4.Para a URL
https://****.mp4, padronize parahttp://****.mp4antes de calcular o hash.
-
Para a versão 5.5.4.0 ou posterior do Player SDK, se a URL de reprodução de vídeo incluir parâmetros de autenticação e usar o protocolo HLS, você pode definir
PlayerConfig.mEnableStrictAuthModepara escolher entre os modos de autenticação (o padrão é false para versões mais antigas; true para a versão 7.13.0 e posteriores):Autenticação não estrita (false): A autenticação é armazenada em cache. Se apenas parte da mídia foi armazenada em cache anteriormente, o player usa a autenticação em cache para solicitações subsequentes. Se a autenticação de URL tiver um curto período de validade ou a reprodução for retomada após uma longa pausa, a autenticação pode expirar. Integre com atualização automática de fontes de reprodução para lidar com a expiração da autenticação.
Autenticação estrita (true): A autenticação não é armazenada em cache. A autenticação ocorre em cada inicialização, causando falha na inicialização sem rede.
Ativar ou desativar cache local para uma única URL
Para ativar ou desativar o cache local para uma URL específica, defina-o na 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);
Cache grande
Definir a duração máxima do buffer armazena dados de vídeo na memória durante a reprodução, melhorando o desempenho e a experiência de visualização. No entanto, grandes durações de buffer consomem memória significativa. Ativar o cache grande armazena dados de vídeo em arquivos, reduzindo o uso de memória e melhorando ainda mais o desempenho do player.
Quando mMaxBufferDuration excede 50000 ms, ativar o cache local ativa automaticamente o cache grande. Procedimento:
-
Ative o cache local global.
O cache local é desativado por padrão. Para usá-lo, ative-o manualmente usando
AliPlayerGlobalSettingseenableLocalCache. Para exemplos de código, consulte Cache local em Ativar cache local. -
Ative o cache local para a URL.
Para exemplos de código, consulte Cache local em Ativar ou desativar cache local para uma única URL.
-
Ative o cache grande.
AliPlayerGlobalSettings.enableBufferToLocalCache(true);
Pré-carregamento
O pré-carregamento é uma evolução do cache local que melhora a velocidade de início do vídeo definindo o uso de memória para armazenamento de vídeo em cache.
Limitações do pré-carregamento:
Atualmente suporta o carregamento de arquivos de mídia únicos, como MP4, MP3, FLV e HLS.
O Android Player SDK fornece agendamento automático de recursos de rede durante o pré-carregamento por padrão para reduzir o impacto das solicitações de rede de pré-carregamento na reprodução de vídeo em andamento. A estratégia de agendamento automático permite solicitações de pré-carregamento somente depois que o buffer do vídeo atualmente em reprodução atinge um determinado limiar. Para controlar as solicitações de pré-carregamento em tempo real você mesmo, desative essa estratégia usando o seguinte método:
AliPlayerGlobalSettings.enableNetworkBalance(false);
Ative o cache local. Para etapas detalhadas, consulte Cache local.
-
Defina a fonte de dados.
VidAuth (recomendado)
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. -
Defina os parâmetros da tarefa.
NotaAplica-se apenas a vídeos com múltiplos bitrates. Escolha um entre
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); -
Adicione o listener da tarefa.
-
Construa a tarefa e adicione à instância
MediaLoaderV2para iniciar o pré-carregamento.VidAuth (recomendado)
// 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) -
Opcional: Gerencie tarefas.
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. -
Opcional: Exclua arquivos carregados.
Exclua arquivos carregados conforme necessário para economizar espaço. O Android Player SDK não fornece uma interface de exclusão; exclua arquivos do diretório de carregamento em seu aplicativo.
Pré-carregamento dinâmico
A estratégia de pré-carregamento dinâmico permite que os integradores controlem tanto o cache do vídeo atualmente em reprodução quanto o número e o cache dos itens pré-carregados, equilibrando a experiência de reprodução e a sobrecarga de custos.
Pré-carregamento de vídeo HLS com múltiplos bitrates
Em cenários de reprodução de vídeo HLS com múltiplos bitrates + listPlayer, os integradores podem pré-carregar streams correspondentes à definição de reprodução atual e escolher modos de pré-carregamento com base nas necessidades do negócio.
Obter velocidade de download
Obtenha a velocidade atual de download de vídeo através do callback onInfo, implementado pela interface getExtraValue. Exemplo:
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
// Current download speed.
long extraValue = infoBean.getExtraValue();
}
}
});
Recursos de rede
HTTPDNS
O HTTPDNS resolve nomes de domínio via HTTP para servidores específicos, reduzindo riscos de sequestro de DNS e fornecendo resolução mais rápida e estável.
O ApsaraVideo Player SDK fornece HTTPDNS aprimorado para domínios do Alibaba Cloud CDN, suportando agendamento preciso de CDN e resolução em tempo real.
Exemplo de uso do HTTPDNS aprimorado
O HTTPDNS aprimorado fornece serviços apenas para domínios do Alibaba Cloud CDN. Certifique-se de que seu domínio seja um domínio do Alibaba Cloud CDN e esteja configurado corretamente. Para adicionar domínios CDN no VOD, consulte Adicionar domínio acelerado. Alibaba Cloud CDN.
// Enable enhanced HTTPDNS.
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// Optional: Add HTTPDNS pre-resolution domains.
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");
HTTP/2
O Android Player SDK ativa o HTTP/2 por padrão a partir da versão 5.5.0.0.
O Android Player SDK suporta o protocolo HTTP/2, que usa multiplexação para evitar bloqueio de cabeça de linha e melhorar o desempenho de reprodução. Exemplo:
AliPlayerGlobalSettings.setUseHttp2(true);
HTTP/3
O IETF QUIC tornou-se um padrão oficial em 2022. O Android Player SDK suporta apenas IETF QUIC h3-v1 e não Google QUIC.
Se a conexão HTTP/3 expirar ou falhar, ela sofrerá degradação automática para HTTP/2.
O Android Player SDK suporta o protocolo HTTP/3. Você precisa preencher um formulário para solicitar a ativação do HTTP/3 para seu domínio, permitindo que vídeos acelerados através deste domínio no VOD suportem reprodução HTTP/3. Em seguida, configure o player para usar HTTP/3 nas solicitações para obter melhor resiliência em redes fracas. Exemplo:
// Get configuration first.
PlayerConfig config = aliPlayer.getConfig();
// Request using HTTP/3 protocol.
config.mEnableHttp3 = true;
....// Other settings.
// Set configuration for the current player instance.
aliPlayer.setConfig(config);
Pré-conexão TCP HTTP
Para solicitações de reprodução de vídeo HTTP (não HTTPS), estabelecer conexões TCP antecipadamente melhora significativamente a experiência do usuário, reduz o tempo de conexão de rede, garante reprodução imediata e contínua e otimiza o uso de recursos de rede e sistema. Uso:
// 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");
Plugins pagos
Download de vídeo
Para exemplos de código detalhados, consulte o módulo API-Example Download de vídeo e reprodução offline (Download). Este projeto de exemplo baseado em Java para o ApsaraVideo Player SDK para Android ajuda os desenvolvedores a dominar rapidamente os principais recursos de integração do SDK.
O Android Player SDK fornece um recurso de download de vídeo para serviços VOD, permitindo que os usuários armazenem vídeos em cache localmente usando o ApsaraVideo Player. Ele oferece dois métodos de download: download padrão e download seguro.
-
Download padrão
Os dados de vídeo baixados não são criptografados pelo Alibaba Cloud e podem ser reproduzidos por players de terceiros.
-
Download seguro
Os dados de vídeo baixados são criptografados pelo Alibaba Cloud. Players de terceiros não podem reproduzi-los. Apenas o ApsaraVideo Player pode reproduzi-los.
Instruções de uso
Apenas os métodos VidSts e VidAuth suportam download de vídeo.
Para usar o recurso de download de vídeo do player, ative e configure o modo de download no console VOD. Para etapas detalhadas, consulte Download offline.
O download de vídeo suporta downloads retomáveis.
Procedimento
-
Opcional: Configure o arquivo de verificação de criptografia para download seguro. Necessário apenas para download seguro; não é necessário para download padrão.
NotaCertifique-se de que o arquivo de verificação de criptografia configurado corresponda às informações do seu aplicativo; caso contrário, o download de vídeo falhará.
Para download seguro, configure o arquivo de chave gerado no console VOD no Player SDK para verificação de descriptografia durante o download e reprodução de vídeo. Para geração de arquivo de chave, consulte Ativar download seguro.
Recomendamos configurar isso uma vez no Application. Exemplo:
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. -
Crie e defina o downloader.
Crie um downloader usando AliDownloaderFactory. Exemplo:
AliMediaDownloader mAliDownloader = null; ...... // Create downloader. mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); // Configure download save path. mAliDownloader.setSaveDir("Save folder path"); -
Defina listeners de eventos.
O downloader fornece múltiplos listeners de eventos. Exemplo:
-
Prepare a fonte de download.
Prepare a fonte de download usando o método
prepare. As fontes de download suportam os métodos VidSts e VidAuth. Exemplos:-
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);
NotaO formato do arquivo de origem corresponde ao formato do arquivo baixado; alterá-lo não é suportado.
Se você ativou a passagem de parâmetros de criptografia padrão HLS no console VOD com o nome de parâmetro padrão MtsHlsUriToken, consulte Passagem de parâmetros de criptografia padrão HLS, então defina o valor MtsHlsUriToken na fonte VOD conforme mostrado acima.
-
-
Após a preparação bem-sucedida, selecione o item de download e inicie o download.
Após a preparação bem-sucedida, o método
OnPreparedListeneré chamado. O TrackInfo retornado contém informações como a definição do stream de vídeo. Selecione um Track para download. Exemplo: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(); } -
(Opcional) Atualize a fonte de download.
Para evitar a expiração de VidSts e VidAuth, você pode atualizar as informações da fonte de download e iniciar o download. Exemplo:
// Update download source. mAliDownloader.updateSource(VidSts); // Start download. mAliDownloader.start(); -
Após sucesso ou falha no download, libere o downloader.
Após o sucesso do download, chame
releaseno callbackonCompletionouonErrorpara liberar o downloader. Exemplo:mAliDownloader.stop(); mAliDownloader.release(); -
Opcional: Exclua arquivos baixados.
Você pode excluir arquivos baixados durante ou após o download. Exemplo:
// 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");
Próximos passos
Vídeos baixados podem ser reproduzidos usando o ApsaraVideo Player. Etapas:
-
Após a conclusão do download, obtenha o caminho absoluto do arquivo de vídeo.
String path = mAliDownloader.getFilePath(); -
Defina o caminho absoluto via VOD UrlSource para reprodução.
UrlSource urlSource = new UrlSource(); urlSource.setUri("Playback address");// Set absolute path of downloaded video. aliPlayer.setDataSource(urlSource);
Reprodução criptografada
Vídeos VOD suportam criptografia padrão HLS, criptografia proprietária do Alibaba Cloud e criptografia DRM. Vídeos ao vivo suportam apenas criptografia DRM. Para reprodução criptografada, consulte Reprodução criptografada.
Reprodução Native RTS
O Android Player SDK integra o Native RTS SDK para transmissão ao vivo com latência ultrabaixa. Implementar pull de stream RTS no Android.