Este tópico descreve como usar os recursos básicos do ApsaraVideo Player SDK para Android. Configure as sources de reprodução, ajuste o volume e a velocidade de reprodução, alternar resoluções e faixas de áudio, entre outros recursos.
Execute e teste a demo: acesse Baixe o ApsaraVideo Player SDK e siga as instruções em Explore the demo para compilar e execute a demo.
Configure uma source de vídeo
O ApsaraVideo Player SDK para Android suporta reprodução de vídeo sob demanda (VOD) e transmissão 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 transmissão ao vivo: UrlSource e reprodução criptografada.
O UrlSource reproduz mídia a partir de uma URL. O VidSts e o VidAuth reproduzem mídia pelo ID da mídia (Vid).
Para obter informações sobre as regiões compatíveis, consulte ApsaraVideo VOD region IDs.
Reprodução VOD
VidAuth (Recomendado)
Para reproduzir um vídeo VOD usando o VidAuth, defina a propriedade vid como o ID da mídia e a propriedade playAuth como a credencial de reprodução.
ID da mídia: Obtenha o ID da mídia após o upload de um arquivo de mídia. No console do ApsaraVideo VOD, escolha 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 de reprodução. Recomendamos a integração do SDK de servidor do ApsaraVideo VOD para evitar a geração manual de assinaturas. Para obter exemplos, consulte o OpenAPI Explorer.
Recomendamos o VidAuth em vez do VidSts para usuários do ApsaraVideo VOD, pois o VidAuth oferece melhor usabilidade e segurança. Para obter mais informações, consulte Credential method vs. STS method.
Ative o repasse de parâmetros de criptografia HLS no console do ApsaraVideo VOD, e o nome padrão do parâmetro será MtsHlsUriToken. Para obter 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 com VidSts usa credenciais temporárias do STS em vez de credenciais de reprodução VOD. Antes de reproduzir vídeos VOD usando o VidSts, obtenha um token STS e um par AccessKey (AccessKeyID e AccessKeySecret). Para obter mais informações, consulte Obtain an STS token.
Ative o repasse de parâmetros de criptografia HLS no console do ApsaraVideo VOD, e o nome padrão do parâmetro será MtsHlsUriToken. Para obter mais informações, consulte Parameter pass-through for HLS encryption.
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 usando o UrlSource, passe a URL de reprodução diretamente.
Chame a operação GetPlayInfo para obter URLs de reprodução do ApsaraVideo VOD. Recomendamos a integração do SDK de servidor do ApsaraVideo VOD. Para obter exemplos, consulte o OpenAPI Explorer.
Para arquivos locais, certifique-se de ter permissão para acessar o arquivo. 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
Os vídeos VOD suportam criptografia HLS, criptografia proprietária da Alibaba Cloud e criptografia DRM. Para a reprodução, consulte Play an encrypted video.
Reprodução de transmissão ao vivo
Para reproduzir transmissões 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 iniciar ou retomar a reprodução.
aliPlayer.start();
Buscar uma posição
Chame seekTo para saltar para uma posição específica. Esse método é útil quando o usuário arrasta a barra de progresso ou retoma a reprodução de uma posição salva.
// Specify the target time in milliseconds.
aliPlayer.seekTo(long position);
Especifique a posição inicial de reprodução antes de chamar prepare, use setStartTime. Essa configuração entra em vigor 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 parar 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 do player para liberar recursos de renderização e evitar vazamentos de memória. Escolha o método de desvinculação de acordo com o tipo de visualização do player em uso.
SurfaceView / TextureView
Chame setSurface com null para desvincular.
// Unbind the player view
aliPlayer.setSurface(null);
AliDisplayView
Chame setDisplayView com null para desvincular.
// Unbind the player view
aliPlayer.setDisplayView(null);
Desvincule a visualização do player após chamar stop e antes de chamar release ou releaseAsync. A sequência completa de fim de 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 tiver requisitos rigorosos quanto à velocidade de resposta da interface do usuário, use releaseAsync. Observe o seguinte:
Não execute nenhuma operação no objeto do player durante a destruição assíncrona.
A destruição assíncrona inclui um processo de parada assíncrona. Não é necessário parar o player manualmente antes de chamar
releaseAsync.
Monitorar o status do player
O ApsaraVideo Player SDK para Android fornece listeners para monitorar eventos de reprodução e alterações de status.
Defina listeners
Defina vários listeners para o player. Recomendamos definir os listeners 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 alterações no estado de reprodução
Use o callback onStateChanged para monitorar as 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 de vídeo
Configure o dimensionamento, a rotação e o espelhamento do vídeo 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 girar o vídeo. Consulte o ângulo de rotação 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
Obtenha o progresso da reprodução, a duração e o progresso do buffer durante a reprodução.
Progresso da reprodução
No callback onInfo, chame getExtraValue para recuperar a posição atual de 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 acionamento do callback onPrepared.
long duration = aliPlayer.getDuration();
Duração real da reprodução
Recupere a duração real da reprodução em tempo real. Esse valor exclui o tempo em que a reprodução estiver pausada ou em buffer.
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 taxa de bits em tempo real
Obtenha a taxa de quadros de renderização, a taxa de bits de áudio e vídeo e a taxa de bits de downstream 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 por software durante a reprodução 4K ou reprodução em alta velocidade de fluxos HD H.265 em dispositivos de baixo desempenho, o desempenho da decodificação pode não acompanhar a velocidade de reprodução. O SDK aciona um callback para notificá-lo sobre 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 é o volume original. Valores maiores que 1 amplificam o áudio e podem introduzir ruído. Recomendamos não definir o volume com valor maior que 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 ativar 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 de código detalhados, consulte o módulo MultiResolution no projeto API-Example.
Transmissão ao vivo baseada em UrlSource
Para obter mais informações, consulte Standard live streaming playback.
Reprodução baseada em VidAuth ou VidSts
Se usar VidAuth ou VidSts para reprodução VOD, o SDK recupera automaticamente as definições de vídeo do ApsaraVideo VOD. Não é necessária nenhuma configuração adicional.
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 as definições. Obtenha o índice do objeto TrackInfo.
aliPlayer.selectTrack(index);
Monitorar eventos de alternância de definição
Defina um listener para receber notificações quando a alternância de definição tiver êxito ou falhar.
aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) { }
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { }
});
Ative a alternância rápida
Ative o modo de alternância rápida, e as chamadas para selectTrack responderão imediatamente sem aguardar o buffer.
PlayerConfig config = aliPlayer.getConfig();
config.mSelectTrackBufferMode = 1;
aliPlayer.setConfig(config)
Ative a reprodução em loop
Chame setLoop para ativar a reprodução em loop. Quando a reprodução chegar ao fim, ela reiniciará automaticamente do início.
aliPlayer.setLoop(true);
O SDK aciona o callback onInfo 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 alternância de faixas de áudio, permitindo alternar entre faixas de áudio em diferentes idiomas durante a reprodução.
Tipos de fluxo suportados
É possível alternar faixas de áudio nos seguintes tipos de fluxo. O comportamento de alternância varia de acordo com o tipo de fluxo.
|
Tipo de fluxo |
Extensão |
Número de taxas de bits |
Tipo de subfluxo |
Comportamento de alternância |
|
Fluxo não-lista (MP4) |
.mp4 |
1 |
Uma faixa de vídeo, várias faixas de áudio e de legendas |
Você pode alternar entre faixas de áudio. |
|
HLS misto de taxa de bits única |
.m3u8 |
1 |
Uma faixa de vídeo, várias faixas de áudio e de legendas |
Você pode alternar entre faixas de áudio. |
|
HLS de taxa de bits única |
.m3u8 |
1 |
Subfluxos separados de vídeo, áudio e legendas |
Você pode alternar entre faixas de áudio. |
|
HLS misto de múltiplas taxas de bits |
.m3u8 |
n |
Subfluxos com diferentes taxas de bits, cada um com uma faixa de vídeo e várias faixas de áudio |
É possível alternar apenas entre subfluxos, e não entre faixas de áudio dentro de um subfluxo. |
Exemplo de uso
-
Defina o callback
onSubTrackReady. Esse callback geralmente é acionado 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 de destino.
index = myTrack.getIndex(); aliPlayer.selectTrack(index);
Usar miniaturas
Para exemplos de código detalhados, consulte o módulo Thumbnail no projeto API-Example.
Antes de usar miniaturas, configure snapshots de sprite para o seu vídeo. No console do ApsaraVideo VOD, crie um modelo de snapshot com Image Sprite como o tipo de snapshot e, em seguida, crie um fluxo de trabalho para processar o vídeo. Para obter 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 solicitação, resultados de invocação e solicitações de permissão. Use esses logs para depurar problemas durante o desenvolvimento. O SDK fornece dois métodos para obter logs.
Método 1: Visualize logs no console da ferramenta de desenvolvimento
Use este método quando for possível reproduzir o problema de forma confiável no seu 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 no nível de frame 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 erros do Logcat ou do 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 seu dispositivo. O callback exporta logs para o canal de log do seu aplicativo.
-
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 erros para o canal de log do seu aplicativo.
Referências
Para obter mais informações sobre as APIs, consulte API reference.
Para utilizar os 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.