Este tópico descreve como usar os recursos básicos do ApsaraVideo Player SDK para Android. Aprenda a configure fontes de reprodução, ajustar volume e velocidade, alternar resoluções e faixas de áudio, entre outras funcionalidades.
Para execute e testar o demo, faça o baixe ApsaraVideo Player SDK e siga as instruções em execute the demo para compilar e execute o projeto.
configure uma source de vídeo
O ApsaraVideo Player SDK para Android suporta reprodução de vídeo sob demanda (VOD) e streaming ao vivo.
Métodos de reprodução VOD: VidAuth (recomendado para usuários do ApsaraVideo VOD), VidSts, UrlSource e reprodução criptografada.
Métodos de reprodução de stream ao vivo: UrlSource e reprodução criptografada.
UrlSource reproduz mídia a partir de uma URL. VidSts e VidAuth reproduzem mídia pelo ID da mídia (Vid).
Para obter informações sobre as regiões suportadas, consulte ApsaraVideo VOD region IDs.
Reprodução VOD
VidAuth (Recomendado)
Para reproduzir um vídeo VOD com VidAuth, defina a propriedade vid com o ID da mídia e a propriedade playAuth com a credencial de reprodução.
ID da mídia: Obtenha o ID da mídia após fazer upload do arquivo. No console do ApsaraVideo VOD, selecione Media Files > Audio/Video. Também é possível chamar a API SearchMedia.
Credencial de reprodução: Chame a operação GetVideoPlayAuth para obter a credencial. Recomendamos integrar o sdk server-side do ApsaraVideo VOD para evitar a geração manual de assinaturas. Para exemplos, consulte o OpenAPI Explorer.
Recomendamos VidAuth em vez de VidSts para usuários do ApsaraVideo VOD, pois oferece melhor usabilidade e segurança. Para mais detalhes, consulte Credential method vs. STS method.
Se você ative a passagem de parâmetros de criptografia HLS no console do ApsaraVideo VOD, o nome padrão do parâmetro será MtsHlsUriToken. Para mais informações, consulte Parameter pass-through for HLS encryption.
Código de exemplo:
VidAuth vidAuth = new VidAuth();
vidAuth.setVid("Vid"); // Required. The video ID (VideoId).
vidAuth.setPlayAuth("<yourPlayAuth>"); // Required. The playback credential from GetVideoPlayAuth.
vidAuth.setRegion("region-id"); // Deprecated for SDK V5.5.5.0 and later. The player automatically parses the region. For earlier versions, this parameter is required. Default: cn-shanghai.
// vidAuth.setAuthTimeout(3600); // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console, the default parameter is MtsHlsUriToken. Specify config and pass it with your VidAuth data source.
VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
vidAuth.setPlayerConfig(config);
aliPlayer.setDataSource(vidAuth);
VidSts
A reprodução via VidSts usa credenciais STS temporárias em vez de credenciais de reprodução VOD. Antes de reproduzir vídeos VOD com VidSts, obtenha um token STS e um par AccessKey (AccessKey ID e AccessKey secret). Para mais detalhes, consulte Obtain an STS token.
Caso a passagem de parâmetros de criptografia HLS esteja ativada no console do ApsaraVideo VOD, o nome padrão do parâmetro é MtsHlsUriToken. Consulte Parameter pass-through for HLS encryption para mais informações.
Código de exemplo:
VidSts vidSts = new VidSts();
vidSts.setVid("Vid"); // Required. The video ID (VideoId).
vidSts.setAccessKeyId("<yourAccessKeyId>"); // Required. The temporary AccessKey ID from STS (AssumeRole).
vidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Required. The temporary AccessKey secret from STS (AssumeRole).
vidSts.setSecurityToken("<yourSecurityToken>"); // Required. The STS token from AssumeRole.
vidSts.setRegion("RegionID"); // Required. The ApsaraVideo VOD region. Default: cn-shanghai.
// vidSts.setAuthTimeout(3600); // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console, the default parameter is MtsHlsUriToken. Specify config and pass it with your vidSts data source.
// If it is not enabled, the following configuration is not neccessary.
VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
vidSts.setPlayerConfig(config);
aliPlayer.setDataSource(vidSts);
UrlSource
Para reproduzir um vídeo VOD com UrlSource, passe diretamente a URL de reprodução.
Chame a operação GetPlayInfo para obter URLs de reprodução do ApsaraVideo VOD. Recomendamos integrar o sdk server-side do ApsaraVideo VOD. Para exemplos, consulte o OpenAPI Explorer.
Para arquivos locais, garanta que possui permissão de acesso. Use caminhos completos como
/sdcard/video/sample.mp4oucontent://media/video/123.
UrlSource urlSource = new UrlSource();
urlSource.setUri("your-playback-url"); // Required. A VOD URL, third-party URL, or local file path.
aliPlayer.setDataSource(urlSource);
Reprodução criptografada
Vídeos VOD suportam criptografia HLS, criptografia proprietária da Alibaba Cloud e criptografia DRM. Para detalhes sobre a reprodução, consulte Play an encrypted video.
Reprodução de stream ao vivo
Para reprodução de streams ao vivo, consulte Standard live streaming playback.
Controlar a reprodução
O ApsaraVideo Player SDK para Android fornece métodos para iniciar, pausar, parar e buscar posições na reprodução.
Preparar o player
Chame prepare para carregar e analisar os dados da mídia.
aliPlayer.prepare();
Iniciar a reprodução
Chame start para começar ou retomar a reprodução.
aliPlayer.start();
Buscar uma posição
Use seekTo para saltar para uma posição específica. Este método é útil quando o usuário arrasta a barra de progresso ou retoma a reprodução de um ponto salvo.
// Specify the target time in milliseconds.
aliPlayer.seekTo(long position);
Para defina a posição inicial antes de chamar prepare, use setStartTime. Essa configuração tem efeito apenas uma vez por chamada de prepare e é limpa automaticamente depois.
// Set the start position in milliseconds. seekMode specifies accurate or inaccurate seeking.
aliPlayer.setStartTime(time, seekMode);
Pausar a reprodução
Chame pause para pausar a reprodução.
aliPlayer.pause();
Parar a reprodução
Chame stop para interromper a reprodução.
aliPlayer.stop();
Desvincular a visualização do player
Após parar a reprodução e antes de destruir a instância do player, desvincule a visualização para liberar recursos de renderização e evitar vazamentos de memória. escolha o método de desvinculação conforme o tipo de visualização em uso.
SurfaceView / TextureView
Chame setSurface passando null para desvincular.
// Unbind the player view
aliPlayer.setSurface(null);
AliDisplayView
Chame setDisplayView passando null para desvincular.
// Unbind the player view
aliPlayer.setDisplayView(null);
Desvincule a visualização após chamar stop e antes de chamar release ou releaseAsync. A sequência completa para encerrar a reprodução é: stop → desvincular visualização → release / releaseAsync.
Destruir o player
Destrua o player de forma síncrona ou assíncrona.
// Synchronous destroy. Blocks until player resources are released. Automatically calls stop.
aliPlayer.release();
// Asynchronous destroy. Returns immediately. Automatically calls stop.
aliPlayer.releaseAsync();
Se a resposta rápida da UI for crítica, use releaseAsync. Observe os seguintes pontos:
Não realize operações no objeto player durante a destruição assíncrona.
A destruição assíncrona inclui um processo de parada assíncrono. Não é necessário parar o player manualmente antes de chamar
releaseAsync.
Monitorar o status do player
O ApsaraVideo Player SDK para Android oferece listeners para monitorar eventos de reprodução e mudanças de status.
Defina listeners
configure múltiplos listeners para o player. Recomendamos defina OnErrorListener, OnCompletionListener, OnLoadingStatusListener e OnInfoListener.
aliPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
// This callback is triggered if an error occurs when you use the player.
@Override
public void onError(ErrorInfo errorInfo) {
ErrorCode errorCode = errorInfo.getCode(); // The error code.
String errorMsg = errorInfo.getMsg(); // The error message.
// errorExtra provides extra error information in a JSON string. For example:
//{ "Url": "xxx",
// "Module": "NetWork",
// "ModuleCode": "-377",
// "ModuleMessage": "Redirect to a url that is not a media"}
// Note that the value of ModuleCode is not always the same as the value of errorCode.
String errorExtra= errorInfo.getExtra();
// Stop the player after an error occurs.
aliPlayer.stop();
}
});
aliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
// After you call the aliPlayer.prepare() method, the player starts to read and parse data. This callback is triggered after the data is parsed.
@Override
public void onPrepared() {
// The player is prepared.
}
});
aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
// This callback is triggered after the playback is complete.
@Override
public void onCompletion() {
// In most cases, you can call the stop method to stop the playback.
aliPlayer.stop();
}
});
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
// The information about the player, such as the current playback position and the buffered position.
@Override
public void onInfo(InfoBean infoBean) {
InfoCode code = infoBean.getCode(); // The information code.
String msg = infoBean.getExtraMsg();// The information content.
long value = infoBean.getExtraValue(); // The information value.
// The current playback position: InfoCode.CurrentPosition.
// The buffered position: InfoCode.BufferedPosition.
}
});
aliPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
// The loading status of the player. You can use this to display a loading screen when the network connection is poor.
@Override
public void onLoadingBegin() {
// The player starts to load data. The video and audio are not ready for playback.
// In most cases, you can display a circular loading indicator.
}
@Override
public void onLoadingProgress(int percent, float netSpeed) {
// The loading progress in percentage and the network speed.
// The network speed is a reserved field. The value is 0.
}
@Override
public void onLoadingEnd() {
// The player stops loading data. The video and audio are ready for playback.
// In most cases, you can hide the circular loading indicator.
}
});
Monitorar mudanças de estado da reprodução
Use o callback onStateChanged para monitorar transições de estado do player.
aliPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
@Override
public void onStateChanged(int newState) {
/*
int idle = 0;
int initalized = 1;
int prepared = 2;
int started = 3;
int paused = 4;
int stopped = 5;
int completion = 6;
int error = 7;
*/
}
});
configure a exibição do vídeo
configure como o vídeo é dimensionado, rotacionado e espelhado durante a reprodução.
Modo de dimensionamento
O sdk suporta três modos de dimensionamento:
// Scale to fit the view while maintaining the aspect ratio (letterboxing).
aliPlayer.setScaleMode(ScaleMode.SCALE_ASPECT_FIT);
// Scale to fill the view while maintaining the aspect ratio (cropping).
aliPlayer.setScaleMode(ScaleMode.SCALE_ASPECT_FILL);
// Stretch to fill the view. The aspect ratio is not maintained. Image distortion may occur.
aliPlayer.setScaleMode(ScaleMode.SCALE_TO_FILL);
Rotação
Chame setRotateMode para rotacionar o vídeo. Consulte o ângulo atual com getRotateMode.
// No rotation.
aliPlayer.setRotateMode(RotateMode.ROTATE_0);
// 90° clockwise.
aliPlayer.setRotateMode(RotateMode.ROTATE_90);
// 180° clockwise.
aliPlayer.setRotateMode(RotateMode.ROTATE_180);
// 270° clockwise.
aliPlayer.setRotateMode(RotateMode.ROTATE_270);
// Query the current rotation angle.
aliPlayer.getRotateMode();
Espelhamento
Chame setMirrorMode para espelhar o vídeo. O sdk suporta espelhamento horizontal e vertical:
// No mirroring.
aliPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_NONE);
// Horizontal mirroring.
aliPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_HORIZONTAL);
// Vertical mirroring.
aliPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_VERTICAL);
Obter informações de reprodução
Durante a reprodução, obtenha o progresso, a duração total e o progresso do buffer.
Progresso da reprodução
No callback onInfo, chame getExtraValue para recuperar a posição atual da reprodução em milissegundos.
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentPosition){
// The current playback position in milliseconds.
long extraValue = infoBean.getExtraValue();
}
}
});
Duração total
A duração do vídeo só fica disponível após o carregamento da mídia. Chame getDuration após o disparo do callback onPrepared.
long duration = aliPlayer.getDuration();
Duração real da reprodução
Recupere a duração efetiva da reprodução em tempo real. Este valor exclui o tempo em que a reprodução esteve pausada ou em buffering.
long playedDuration = aliPlayer.getPlayedDuration();
Progresso do buffer
No callback onInfo, verifique InfoCode.BufferedPosition para obter o progresso atual do buffer.
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.BufferedPosition){
// The current buffering progress in milliseconds.
long extraValue = infoBean.getExtraValue();
}
}
});
Métricas de renderização e bitrate em tempo real
Obtenha a taxa de quadros de renderização, bitrate de áudio e vídeo e bitrate de download da rede em tempo real.
// Video rendering frame rate. Returns a float value.
aliPlayer.getOption(IPlayer.Option.RenderFPS);
// Video bitrate. Returns a float value in bit/s.
aliPlayer.getOption(IPlayer.Option.VideoBitrate);
// Audio bitrate. Returns a float value in bit/s.
aliPlayer.getOption(IPlayer.Option.AudioBitrate);
// Network downstream bitrate. Returns a float value in bit/s.
aliPlayer.getOption(IPlayer.Option.DownloadBitrate);
Lidar com eventos de dessincronização de A/V
Em condições extremas, como decodificação de software durante reprodução 4K ou reprodução acelerada de streams HD H.265 em dispositivos de baixo desempenho, o desempenho da decodificação pode ficar abaixo da velocidade de reprodução. O sdk dispara um callback para notificar esse evento.
aliPlayer.setOnAVNotSyncStatusListener(new IPlayer.OnAVNotSyncStatusListener() {
@Override
public void onAVNotSyncStart(int type) {
if (type == 0) {
//Reduce the playback speed to recover.
if (aliPlayer.getSpeed() > 1) {
aliPlayer.setSpeed(1);
}
}
Toast.makeText(getContext(), "Out-of-sync detected" , Toast.LENGTH_SHORT).show();
}
@Override
public void onAVNotSyncEnd() {
Toast.makeText(getContext(), "Out-of-sync resolved" , Toast.LENGTH_SHORT).show();
}
});
Controlar o volume
Alterar o volume
Chame setVolume para alterar o volume. Os valores válidos variam de 0 a 2, onde 1 representa o volume original. Valores acima de 1 amplificam o áudio e podem introduzir ruído. Recomendamos não defina o volume acima de 1.
// Set the volume. Valid values: 0 to 2.
aliPlayer.setVolume(1f);
// Get the current volume.
aliPlayer.getVolume();
Silenciar o player
Chame setMute para silenciar ou reativar o som do player.
aliPlayer.setMute(true);
Defina a velocidade de reprodução
Chame setSpeed para alterar a velocidade de reprodução. Os valores válidos variam de 0.5 a 5. O tom do áudio permanece inalterado em diferentes velocidades.
// Common speeds: 0.5x, 1x, 1.5x, 2x.
aliPlayer.setSpeed(1.0f);
Alternar resoluções
Para exemplos detalhados de código, consulte o módulo MultiResolution no projeto API-Example.
Streaming ao vivo baseado em UrlSource
Para mais informações, consulte Standard live streaming playback.
Reprodução baseada em VidAuth ou VidSts
Ao usar VidAuth ou VidSts para reprodução VOD, o sdk recupera automaticamente as definições de vídeo do ApsaraVideo VOD. Nenhuma configuração adicional é necessária.
Consultar definições disponíveis
Após o carregamento do vídeo, recupere as definições disponíveis.
// Retrieve all available track.
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();
//Retrieve the available definitions.
for (TrackInfo trackInfo : trackInfos) {
if(trackInfo.getType() == TrackInfo.Type.TYPE_VOD){
// Get video definition.
String vodDefinition = trackInfo.getVodDefinition();
}
}
Alternar a definição
Chame selectTrack com o índice da faixa para alternar definições. Obtenha o índice do objeto TrackInfo.
aliPlayer.selectTrack(index);
Escutar eventos de troca de definição
Defina um listener para receber notificações quando a troca de definição for bem-sucedida ou falhar.
aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) { }
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { }
});
Ativar troca rápida
Ao ative o modo de troca rápida, as chamadas para selectTrack respondem imediatamente sem aguardar buffering.
PlayerConfig config = aliPlayer.getConfig();
config.mSelectTrackBufferMode = 1;
aliPlayer.setConfig(config)
Ativar reprodução em loop
Chame setLoop para ative a reprodução em loop. Ao atingir o fim, a reprodução reinicia automaticamente do começo.
aliPlayer.setLoop(true);
O callback onInfo é disparado quando a reprodução em loop reinicia.
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.LoopingStart){
//Loop playback restarted.
}
}
});
Alternar faixas de áudio
O ApsaraVideo Player SDK para Android suporta a troca de faixas de áudio, permitindo alternar entre idiomas diferentes durante a reprodução.
Tipos de stream suportados
Alterne faixas de áudio nos seguintes tipos de stream. O comportamento da troca varia conforme o tipo.
|
Tipo de stream |
Extensão |
Contagem de bitrate |
Tipo de substream |
Comportamento da troca |
|
Stream sem lista (MP4) |
.mp4 |
1 |
Uma faixa de vídeo, múltiplas faixas de áudio e legenda |
Permite alternar entre faixas de áudio. |
|
HLS misto de bitrate único |
.m3u8 |
1 |
Uma faixa de vídeo, múltiplas faixas de áudio e legenda |
Permite alternar entre faixas de áudio. |
|
HLS de bitrate único |
.m3u8 |
1 |
Substreams separados de vídeo, áudio e legenda |
Permite alternar entre faixas de áudio. |
|
HLS misto de multi-bitrate |
.m3u8 |
n |
Substreams com bitrates diferentes, cada um com um vídeo e múltiplas faixas de áudio |
Permite alternar apenas entre substreams, não entre faixas de áudio dentro de um substream. |
Exemplo de uso
-
Defina o callback
onSubTrackReady. Geralmente, este callback é disparado antes do callbackonPrepared.aliPlayer.setOnSubTrackReadyListener(new IPlayer.OnSubTrackReadyListener() { @Override //onSubTrackReady. Typically triggered before the onPrepared callback. public void onSubTrackReady(MediaInfo mediaInfo) { if (mPlayerTrackFragment != null) { //mPlayerTrackFragment.showMediaInfo(); // Call getSubMediaInfo after this callback is triggered. Calling it before this callback returns an empty result. MediaInfo subMediaInfo = aliPlayer.getSubMediaInfo(); TrackInfos = subMediaInfo.getTrackInfos(); // Find the target audio track from the track list. myTrack = myfunc(TrackInfos) } } }); -
Alterne para a faixa de áudio desejada.
index = myTrack.getIndex(); aliPlayer.selectTrack(index);
Usar thumbnails
Para exemplos detalhados de código, consulte o módulo Thumbnail no projeto API-Example.
Antes de usar thumbnails, configure snapshots sprite para o seu vídeo. No console do ApsaraVideo VOD, crie um modelo de snapshot com Image Sprite como tipo de snapshot e, em seguida, crie um workflow para processar o vídeo. Para mais informações, consulte Video snapshots.
mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
// 1. Create a ThumbnailHelper instance with the sprite snapshot URL.
ThumbnailHelper mThumbnailHelper = new ThumbnailHelper(URL);
// 2. Set listeners.
mThumbnailHelper.setOnPrepareListener(new ThumbnailHelper.OnPrepareListener() {
@Override
public void onPrepareSuccess() {
// 4. After the thumbnail is loaded, request thumbnails at specific positions.
}
@Override
public void onPrepareFail() {}
});
mThumbnailHelper.setOnThumbnailGetListener(new ThumbnailHelper.OnThumbnailGetListener() {
@Override
public void onThumbnailGetSuccess(long positionMs, ThumbnailBitmapInfo thumbnailBitmapInfo) {
// 5. Get the thumbnail bitmap at the specified position.
Bitmap thumbnailBitmap = thumbnailBitmapInfo.getThumbnailBitmap();
}
@Override
public void onThumbnailGetFail(long positionMs, String errorMsg) {}
});
// 3. Load the thumbnail.
mThumbnailHelper.prepare();
}
});
Obter logs do sdk
Os logs do sdk contêm informações detalhadas como status de requisições, resultados de invocações e solicitações de permissão. Use esses logs para depurar problemas durante o desenvolvimento. O sdk oferece dois métodos para obter logs.
Método 1: visualize logs no console da ferramenta de desenvolvimento
Use este método quando conseguir reproduzir o problema de forma confiável no dispositivo.
-
ative o log e defina o nível de log.
// Logs are stored under com.cicada.player.utils. Logger.getInstance(context).enableConsoleLog(true); // Default: AF_LOG_LEVEL_INFO. Use AF_LOG_LEVEL_TRACE for troubleshooting. Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_INFO); -
(Opcional) ative o log nível de quadro para solução de problemas.
// 0: disabled, 1: enabled. Logger.getInstance(this).setLogOption(Logger.LogOption.FRAME_LEVEL_LOGGING_ENABLED, value); Reproduza o problema e recupere o log de erro no Logcat ou no console da sua ferramenta de desenvolvimento.
Método 2: Defina LogCallback para receber logs programaticamente
Use este método quando não for possível reproduzir o problema de forma confiável no dispositivo. O callback exporta logs para o canal de log da sua aplicação.
-
ative o log e defina o nível de log.
// Logs are stored under com.cicada.player.utils. // Default: AF_LOG_LEVEL_INFO. Use AF_LOG_LEVEL_TRACE for troubleshooting. Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_INFO); Logger.getInstance(mContext).setLogCallback(newLogger.OnLogCallback(){ @Override public void onLog(Logger.LogLevel logLevel,Strings){ // Process the log entry. } }); Após a ocorrência de um erro, o sdk exporta automaticamente o log de erro para o canal de log da sua aplicação.
Referências
Para saber mais sobre APIs, consulte API reference.
Para usar recursos avançados do player, consulte Advanced features.
Para solucionar problemas de reprodução, consulte Troubleshoot video playback issues, Android player FAQ e Mobile error codes.