Integre o ApsaraVideo Player SDK ao seu aplicativo Android para receber streams ao vivo via Real-Time Streaming (RTS) com latência ultrabaixa.
Antes de começar
Verifique se você tem:
Uma URL de streaming RTS que use o protocolo
artc://O ApsaraVideo Player SDK V5.4.5.0 ou posterior. Para links de baixe, consulte Baixe do SDK
Limitações do RTS
O RTS apresenta as seguintes limitações:
Sem suporte a pausa. Não é possível chamar
pauseem uma stream RTS ao vivo. Chamestoppara encerrar a reprodução e, em seguida, chamepreparepara retomar.Sem busca. O recurso de busca (arrastar a barra de progresso) não tem suporte.
Integrar o SDK
Adicione o ApsaraVideo Player SDK e as dependências do RTS usando o Maven.
-
Adicione o repositório Maven ao arquivo
build.gradleno diretório raiz do projeto.// Maven repository for Alibaba Cloud SDKs (ApsaraVideo Player) maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' } -
Inclua as seguintes dependências no arquivo
app/build.gradle.def player_sdk_version = "x.x.x" // We recommend using the latest version. def rts_sdk_version = "7.12.0" // Independent version number, currently the latest version. // Player main library implementation "com.aliyun.sdk.android:AliyunPlayer:$player_sdk_version-full" // RTS bridge component (AlivcArtc). The version number must match the player version exactly. // Must be integrated together with the RTS component. implementation "com.aliyun.sdk.android:AlivcArtc:$player_sdk_version" // RTS component implementation "com.aliyun.rts.android:RtsSDK:$rts_sdk_version"
A versão do componente de ponte RTS (AlivcArtc) deve corresponder exatamente à versão do player. Integre-o juntamente com o componente RTS. Para perguntas frequentes, consulte FAQ do Player Android.
Implementar a reprodução RTS
Use os métodos do ApsaraVideo Player SDK para reproduzir uma stream RTS. Para conhecer outros recursos do player, consulte Recursos avançados e Referência da API.
Os exemplos de código a seguir são simplificados. Para o código completo, consulte o módulo Reprodução de Real-Time Streaming RTS no projeto API-Example.
Etapa 1: Carregar a biblioteca RTS
Adicione o seguinte inicializador estático à sua Activity:
static {
System.loadLibrary("RtsSDK");
}
Etapa 2: Crie um player
Crie uma instância do AliPlayer usando a classe AliPlayerFactory.
// Create a player instance
AliPlayer mAliPlayer = AliPlayerFactory.createAliPlayer(context);
// Optional: Set a trace ID for single-point tracing
// Use a unique identifier for the user or device, such as a user ID, IMEI, or IDFA.
mAliPlayer.setTraceId("traceId");
O player oferece suporte ao Monitoramento de Qualidade de Reprodução, à Solução de Problemas de Ponto Único e às Estatísticas de Reprodução de Vídeo. Todos os três recursos dependem do relatório de logs de instrumentação. O parâmetro setTraceId controla quais funcionalidades estão disponíveis:
|
**Valor de |
Relatório de log |
Monitoramento de qualidade |
Rastreamento de ponto único |
Estatísticas de reprodução |
|
Não defina (padrão) |
Ativado |
Disponível |
Indisponível |
Disponível |
|
Valor personalizado (ex.: id de usuário) |
Ativado |
Disponível |
Disponível |
Disponível |
|
|
Desativado |
Indisponível |
Indisponível |
Indisponível |
Etapa 3: Defina a visualize de exibição
O player aceita três tipos de visualize: AliDisplayView (recomendado), SurfaceView e TextureView. Escolha uma das opções abaixo.
Opção A: AliDisplayView (recomendado)
Declare a visualize no layout XML:
<!-- Player rendering view -->
<com.aliyun.player.videoview.AliDisplayView
android:id="@+id/ali_display_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
Vincule a visualize ao player:
AliDisplayView mAliDisplayView = findViewById(R.id.display_view);
// Set the playback view type using setPreferDisplayView()
mAliDisplayView.setPreferDisplayView(AliDisplayView.DisplayViewType.SurfaceView);
mAliPlayer.setDisplayView(mAliDisplayView);
Opção B: SurfaceView
Declare a visualize no layout XML:
<!-- Player rendering view -->
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
Vincule a surface ao player:
SurfaceView mSurfaceView = findViewById(R.id.surface_view);
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
mAliPlayer.setSurface(holder.getSurface());
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
mAliPlayer.surfaceChanged();
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
mAliPlayer.setSurface(null)
}
});
Opção C: TextureView
Declare a visualize no layout XML:
<!-- Player rendering view -->
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
Vincule a surface ao player:
TextureView mTextureView = findViewById(R.id.texture_view);
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
mAliPlayer.setSurface(new Surface(surface));
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
mAliPlayer.surfaceChanged();
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
mAliPlayer.setSurface(null);
return true;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
}
});
Etapa 4: Defina a source de reprodução
O player aceita quatro tipos de source de reprodução: VidSts, VidAuth, VidMps e UrlSource. Para reprodução RTS, use UrlSource com uma url artc://:
UrlSource urlSource = new UrlSource();
urlSource.setUri("artc://<Streaming URL>");
mAliPlayer.setDataSource(urlSource);
Para obter detalhes sobre outros tipos de source de reprodução, consulte Recursos Básicos.
Etapa 5: Configure parâmetros de baixa latência
O ApsaraVideo Player SDK V6.3.0 e versões posteriores aplicam automaticamente as configurações ideais de baixa latência quando a url de reprodução começa com artc:// e os parâmetros mMaxDelayTime, mHighBufferDuration e mStartBufferDuration em PlayerConfig não foram modifique manualmente. Os valores automáticos são:
|
Parâmetro |
Valor |
Descrição |
|
|
1000 ms |
Atraso máximo |
|
|
10 ms |
Duração do buffer para início da reprodução |
|
|
10 ms |
Duração do buffer para recuperação de travamentos |
Para substituir esses padrões, configure-os manualmente:
// 1. Get and modify the configurations
PlayerConfig config = mAliPlayer.getConfig();
if (playUrl.startWith("artc://")) {
// Maximum delay: 1000 milliseconds
config.mMaxDelayTime = 1000;
// Buffer duration for playback startup: 10 milliseconds
config.mStartBufferDuration = 10;
// Buffer duration for stuttering recovery: 10 milliseconds
config.mHighBufferDuration = 10;
} else {
// Use default configurations or customize to other configurations
}
// 2. Apply the configurations
mAliPlayer.setConfig(config);
Etapa 6: Iniciar a reprodução
// Prepare for playback
mAliPlayer.prepare();
// Start playback
mAliPlayer.start();
Controlar a reprodução
Iniciar
mAliPlayer.start();
Parar
mAliPlayer.stop();
Destruir o player
Destrua a instância do player usando destruição síncrona ou assíncrona.
// Synchronous destruction. The system automatically calls the stop interface.
mAliPlayer.release();
// Asynchronous destruction. The system automatically calls the stop interface.
mAliPlayer.releaseAsync();
O método síncrono release() bloqueia a execução até que todos os recursos do player sejam liberados. Para uma resposta mais rápida da UI, use releaseAsync(). Ao utilizar a destruição assíncrona:
Não execute nenhuma outra operação no objeto do player durante a destruição.
Chamar
stopantes dereleaseAsync()é desnecessário, pois o processo já inclui internamente um fluxo de parada assíncrono.
Degradação de RTS
Quando a recepção da stream RTS falha devido a timeout, o player pode degradar automaticamente para um protocolo alternativo. A degradação aplica-se apenas a cenários de timeout. Outros erros, como 404, 403 ou desconexão do streamer, acionam o callback onError.
A degradação automática usa o mesmo nome de domínio para a troca de RTS para FLV. Se seus nomes de domínio RTS e FLV forem diferentes, configure a degradação personalizada para especifique o domínio FLV de destino.
Degradação automática (ative por padrão)
Se a recepção da stream RTS falhar e nenhuma degradação personalizada estiver configurada, o player mudará automaticamente para o endereço FLV padrão derivado da url RTS:
// 1 means enabled, 0 means disabled. Enabled by default.
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);
Degradação personalizada
Especifique uma url de degradação (como um endereço HLS ou FLV) para quando a recepção da stream RTS falhar:
PlayerConfig config = mAliPlayer.getConfig();
// Optional: Configure other items in config
UrlSource urlSource = new UrlSource();
urlSource.setUri(downgradeUrl);
// Set the degradation URL
mAliPlayer.enableDowngrade(urlSource, config);
Recuperar o TraceID
Cada sessão de reprodução RTS gera um TraceID para solução de problemas. Recupere-o por meio do callback de eventos do player:
// Listen for the player's onInfo callback and parse the DemuxerTraceID message
mAliPlayer.setOnInfoListener(infoBean -> {
if (infoBean.getCode() == InfoCode.DemuxerTraceID) {
String traceId = infoBean.getExtraMsg();
}
});
Logging
Ative ou desative o logging no console para depuração:
// Enable logging
Logger.getInstance(context).enableConsoleLog(true);
Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE);
// Disable logging
Logger.getInstance(context).enableConsoleLog(false);
Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);