Problemas comuns e soluções para o ApsaraVideo Player SDK for Android.
Problemas relacionados à licença
Para resolver problemas de licença inválida ou expirada, consulte as Perguntas frequentes sobre licença.
Problemas comuns entre plataformas
Para questões independentes de plataforma, consulte as Perguntas frequentes do player multiplataforma.
Desenvolvedores experientes também podem solucionar erros de reprodução de forma independente.
Problemas de desenvolvimento
Obter o progresso atual da reprodução
Por padrão, o SDK do player relata o progresso da reprodução a cada 500 ms. Ajuste o intervalo de callback conforme necessário:
// Modify the callback interval.
PlayerConfig config = mAliyunLivePlayer.getConfig();
config.mPositionTimerIntervalMs = 100;// The callback interval in ms.
mAliyunLivePlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentPosition){
// The current playback progress.
long currentPosition = infoBean.getExtraValue();
}
}
});
Obter dados brutos de áudio e vídeo
Para obter dados brutos de áudio e vídeo, alterne para decodificação via software e reproduza um vídeo não criptografado:
// Switch to software decoding.
mAliPlayer.enableHardwareDecoder(false);
IPlayer.RenderFrameCallbackConfig renderFrameCallbackConfig = new IPlayer.RenderFrameCallbackConfig();
// Specifies whether to return only the underlying video data address. Default value: true.
renderFrameCallbackConfig.mVideoDataAddr = false;
// Specifies whether to return only the underlying audio data address. Default value: false.
renderFrameCallbackConfig.mAudioDataAddr = false;
mAliPlayer.setRenderFrameCallbackConfig(renderFrameCallbackConfig);
mAliPlayer.setOnRenderFrameCallback(new IPlayer.OnRenderFrameCallback() {
@Override
public boolean onRenderFrame(FrameInfo frameInfo) {
return false;
}
});
Obter a largura e altura do vídeo
Obtenha a largura e a altura do vídeo usando um destes métodos:
-
Após a instância AliPlayer entrar no estado
prepared:mAliyunPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { mAliyunPlayer.getVideoWidth(); mAliyunPlayer.getVideoHeight(); } }); -
Escute o callback de alteração de tamanho do vídeo:
mAliyunPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { } }); -
Use as informações da faixa:
mAliyunPlayer.setOnTrackReadyListener(new IPlayer.OnTrackReadyListener() { @Override public void onTrackReady(MediaInfo mediaInfo) { List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); for (TrackInfo trackInfo : trackInfos) { if(trackInfo.getType() == TrackInfo.Type.TYPE_VIDEO){ trackInfo.getVideoWidth(); trackInfo.getVideoHeight(); } } } });
Obter dados de pixels de cada quadro de vídeo
Obtenha os dados de pixels escutando o callback OnRenderFrameCallback:
player.setOnRenderFrameCallback(frameInfo -> {
if (frameInfo.frameType == FrameInfo.FrameType_video) {
// Video data
} else {
// Audio data
}
return false;
});
Lógica de troca automática de taxa de bits
Ao chamar mAliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX) para ativar a troca automática de taxa de bits, o SDK do player calcula a velocidade da rede. Se a velocidade sustentar o próximo nível de taxa de bits por 10 segundos, o player faz a troca. Caso contrário, permanece na taxa de bits atual.
De alta para baixa: se a velocidade da rede atingir o próximo nível de taxa de bits em até 10 segundos, o player termina o conteúdo em cache de alta taxa de bits antes de trocar.
De baixa para alta: o player troca imediatamente assim que a velocidade sustenta a taxa de bits mais alta por 10 segundos.
Para usar a troca automática de taxa de bits, transcodifique o vídeo em um fluxo de taxa de bits adaptável no console e configure o player para recuperá-lo. Exemplo com VidAuth:
VidAuth vidAuth = new VidAuth();
List<Definition> list = new ArrayList<>();
list.add(Definition.DEFINITION_AUTO);
vidAuth.setDefinition(list);
Lógica de nova tentativa personalizada
Por padrão, o SDK do player tenta novamente duas vezes com um tempo limite de rede de 15 segundos por tentativa. Se ambas falharem, um callback Error será acionado.
Para personalizar a lógica de nova tentativa, defina a contagem de tentativas como 0 e trate os eventos externamente:
PlayerConfig config = mAliPlayer.getConfig();
// 1. Set the number of retries. In this example, it is set to 0.
config.mNetworkRetryCount = 0;
mAliPlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
// 2. Listen for the retry event.
if(infoBean.getCode() == InfoCode.NetworkRetry){
// TODO: Process the logic as needed.
}
}
});
Ocorre um erro unsupported protocol durante a reprodução de fluxo ARTC
Causa 1: O SDK do player está integrado, mas a camada de ponte (AlivcArtc) e o componente Real-Time Streaming (RTS) (RtsSDK) não estão.
Solução: Integre os componentes necessários. Implementar pull de fluxo RTS no Android.
Causa 2: A versão da camada de ponte (AlivcArtc) não corresponde à versão do player.
Solução: Garanta que a camada de ponte (AlivcArtc) e o player usem a mesma versão. Implementar pull de fluxo RTS no Android.
Causa 3: O componente RTS (RtsSDK) não foi carregado.
Solução: Carregue o componente RTS (RtsSDK) no arquivo Application ou na Activity de destino, conforme necessário.
static {
System.loadLibrary("RtsSDK");
}
Causa 4: A versão minSDK é muito alta e a camada de ponte (AlivcArtc) não foi carregada corretamente.
// 1. Modify minSdk
Downgrade minSdk to 21
// 2. Manually load the ARTC library
static {
System.loadLibrary("RtsSDK");
System.loadLibrary("cicada_plugin_artcSource");
}
A barra de progresso volta após uma operação de busca
Causa: O player usa busca imprecisa por padrão e inicia a reprodução a partir do keyframe mais próximo.
Solução: Alterne para o modo de busca precisa.
Como alternar entre os modos de busca precisa e imprecisa
Alterne entre os modos de busca:
// Inaccurate seek.
mAliPlayer.seekTo(1000);
mAliPlayer.seekTo(1000, IPlayer.SeekMode.Inaccurate);
// Accurate seek.
mAliPlayer.seekTo(1000,IPlayer.SeekMode.Accurate);
A barra de progresso ainda volta após alternar para o modo de busca precisa
Causa: Se a distância do ponto de busca até o keyframe mais próximo exceder o intervalo máximo de busca precisa, o SDK do player reverte para busca imprecisa, fazendo com que a barra de progresso salte.
Solução: Aumente o intervalo máximo de busca precisa para reduzir a reversão para busca imprecisa. Um intervalo maior melhora a precisão, mas pode aumentar o tempo de busca:
// Unit: ms.
mAliPlayer.setMaxAccurateSeekDelta(10000);
Cache local: É possível definir o diretório de cache para o armazenamento interno?
Sim. Defina o diretório de cache para o armazenamento interno, mas garanta que o aplicativo tenha as permissões de acesso necessárias.
Ocorre um erro encrypt check fail durante o cache de vídeo
Se o download seguro estiver ativado, o arquivo de verificação de criptografia deve corresponder às informações do seu aplicativo. Baixe o arquivo em Download offline e salve-o no SDK do player. Download de vídeo. Arquivos incompatíveis causam falhas no cache ou no download.
Problemas de reprodução
Ocorre um crash ao criar o player
Solucione o problema da seguinte forma:
-
Verifique se a arquitetura da CPU é x86.
O SDK do player suporta apenas as arquiteturas arm64-v8a e armeabi-v7a. Ele não suporta a arquitetura x86.
-
Confira se tanto os arquivos .so quanto as dependências Maven do SDK do player estão integrados no projeto.
Por exemplo, você pode ter integrado o SDK do player usando uma dependência Maven no
build.gradlee também integrado as bibliotecas dinâmicas relacionadas ao player no diretóriolibsdo módulo do projeto.Recomendação: Remova as bibliotecas dinâmicas e use apenas a dependência Maven. Se for obrigatório usar bibliotecas dinâmicas, garanta que todos os arquivos .so sejam da mesma versão. Integrar o SDK. Os seguintes arquivos de biblioteca dinâmica estão relacionados ao player:
libalivcffmpeg.so,libsaasCorePlayer.soelibsaasDownloader.so. -
Se você integrou um pacote parcial, confirme se a dependência de versão do AlivcFFmpeg está correta.
Para obter informações sobre as dependências de versão do AlivcFFmpeg, consulte Dependências de versão do AlivcFFmpeg.
Ocorre um crash enquanto o player está em execução
Solucione o problema da seguinte forma:
-
Confirme se o crash ocorreu no SDK do player.
Procure por uma pilha de crash com o prefixo
AliyunPlayer. Se existir uma pilha com esse prefixo, o problema está no SDK do player. Atualize para a versão mais recente do SDK do player e verifique se o problema foi corrigido.
Se o problema persistir, colete arquivos de crash (incluindo todas as threads), logs de crash e detalhes do cenário. Como recuperar logs de problemas.
Barras pretas aparecem durante a reprodução de vídeo
Solucione o problema da seguinte forma:
Verifique se o próprio vídeo de origem possui barras pretas.
-
Ajuste o modo de dimensionamento do player usando a seguinte interface:
/* SCALE_ASPECT_FILL: Fills the screen proportionally. The video is cropped. SCALE_ASPECT_FIT: Scales the video proportionally. Black bars may appear. SCALE_TO_FILL: Fills the screen without maintaining proportions. The video is distorted. */ mAliPlayer.setScaleMode(); Caso o modo de dimensionamento não atenda às suas necessidades, ajuste o tamanho do SurfaceView ou TextureView na camada de aplicação.
O áudio toca, mas nenhum vídeo aparece
Solucione o problema da seguinte forma:
Reproduza o vídeo com outro player para verificar se é um arquivo apenas de áudio.
Verifique se a visualização de exibição está configurada corretamente e não foi removida da interface de reprodução. Configure a visualização de exibição conforme descrito na Etapa 4 de Recursos básicos.
Ocorre um erro Invalid argument ao reproduzir um vídeo local com permissões de leitura
Verifique o nome do arquivo e o caminho absoluto. Evite combinar caracteres chineses e espaços no caminho.
Ocorre um erro Permission denied ao reproduzir um vídeo local com permissões de leitura
No Android 10 (Android Q) ou posterior, adicione android:requestLegacyExternalStorage="true" à tag application no AndroidManifest.xml para lidar com o recurso de armazenamento com escopo.
Um erro Redirect to a url ocorre ocasionalmente durante a reprodução de vídeo
Esse erro pode ocorrer devido a sequestro de DNS. Ative o HTTPDNS para resolvê-lo. Configurar HTTPDNS para Android.
Uma barra de notificação preta pisca em telas com notch durante a reprodução em tela cheia
Resolva isso definindo uma barra de status imersiva.
Falha ao reproduzir um vídeo MOV
O SDK do player suporta vídeos MOV. A reprodução pode falhar se o átomo moov estiver localizado após o átomo mdat no arquivo de origem. Transcodifique o vídeo para mover o átomo moov antes do átomo mdat. Etapa 2: Solucionar problemas do fluxo.
Ocorre um erro durante a inicialização ou reprodução, indicando que a biblioteca dinâmica .so do SDK do player não foi encontrada
Solucione o problema da seguinte forma:
-
Verifique se a arquitetura da CPU atende aos requisitos.
O SDK do player suporta bibliotecas dinâmicas apenas para as arquiteturas arm64-v8a e armeabi-v7a.
-
Verifique se a versão do SDK do player é muito antiga.
Se você estiver usando o SDK do player V5.4.6.0-full ou anterior, atualize para V5.4.6.0-full-15467853 ou posterior. Notas de lançamento do SDK para Android.
Ocorre um erro ao usar AliListPlayer para reproduzir vídeos HLS (m3u8)
O player de lista AliListPlayer suporta vídeos HLS (m3u8) a partir da versão V5.4.5.0, mas o cache local deve estar ativado. Cache local.
O SDK do player Android suporta a reprodução de vídeos das pastas assets e raw em um projeto Android?
Não. Copie o vídeo para o armazenamento do dispositivo e use o caminho absoluto para reprodução.
Ocorre um erro 403 e a reprodução falha após configurar o cache local para um fluxo de vídeo HLS
Sintoma: Ao reproduzir um fluxo de vídeo HLS (M3U8) usando o método de reprodução VidAuth com cache local ativado, a reprodução falha e um erro 403 é relatado.
Causa: Com o cache local ativado, se você sair da reprodução antes que o vídeo seja totalmente armazenado em cache, a parte não armazenada será solicitada usando as informações VidAuth expiradas da sessão anterior na próxima vez que você iniciar a reprodução. Isso causa uma falha de autenticação e um erro 403.
Solução: Para o SDK do player V5.5.4.0 e posterior, se a URL de reprodução do vídeo contiver parâmetros de autenticação e o protocolo de reprodução for HLS, você pode definir o campo PlayerConfig.mEnableStrictAuthMode para selecionar um modo de autenticação diferente. O valor padrão é false.
Autenticação não estrita (false): A autenticação é armazenada em cache. Se apenas parte da mídia foi armazenada anteriormente, o player usa a autenticação em cache para solicitações subsequentes. Se a autenticação da 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 fontes de reprodução com atualização automática 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.
O SDK do player Android suporta reprodução durante o download?
Não. O SDK do player armazena em cache e baixa arquivos de vídeo durante a reprodução quando o cache local está ativado. Arquivos em cache são reproduzidos diretamente nas reproduções subsequentes. Não há suporte para mover arquivos em cache de seu diretório original.
O SDK do player Android suporta obter a velocidade de buffer de um vídeo?
Sim. O SDK do player fornece velocidade de buffer, taxa de quadros de renderização em tempo real, taxas de bits de áudio e vídeo e taxa de bits de download de rede. Obter informações de reprodução.
Reprodução anormal de vídeo HDR
Atualmente, o SDK do player não suporta vídeos HDR com ângulos de rotação. Podem ocorrer erros de reprodução para esses vídeos.
Se um vídeo for transcodificado em múltiplas definições, qual definição o SDK do player reproduz por padrão?
A ordem de reprodução padrão é FD, LD, SD, HD, 2K, 4K, OD. Definição. O SDK do player reproduz a primeira definição disponível nesta ordem.
Como especificar a definição de reprodução padrão
Exemplo:
// The VidSts playback method is used as an example.
VidSts vidSts = new VidSts();
// The code for setting parameters such as vid, AccessKeyId, AccessKeySecret, and token is omitted. For more information, see the player creation settings in the Basic Features topic.
/*
Parameter 1: The desired playback definition. Valid values: FD, LD, SD, HD, 2K, 4K, and OD.
Parameter 2: Specifies whether to enforce playback of the desired definition. false: Does not enforce playback of the desired definition. The player SDK searches for a definition to play based on the default order. true: Enforces playback of the desired definition. If the desired definition is not found, the video is not played.
*/
vidSts.setQuality("",false);
Se uma definição tiver múltiplos fluxos, qual fluxo o SDK do player reproduz?
Se uma definição tiver múltiplos fluxos, o SDK do player reproduz o fluxo mais recente.
Outros problemas
Como reproduzir um vídeo sem marca d'água, mas baixá-lo com marca d'água
Transcodifique o vídeo em múltiplas definições. Reproduza a definição sem marca d'água e baixe a definição com marca d'água.
Como obter logs de problemas
Envie logs de problemas para ajudar o suporte técnico da Alibaba Cloud a resolver seu problema mais rapidamente.
-
Recupere os logs de problemas.
Defina o nível de log como
AF_LOG_LEVEL_TRACEantes de coletar os logs. Obter logs do SDK. Forneça os logs gerados ao suporte técnico da Alibaba Cloud.