Todos os produtos
Search
Central de documentação

ApsaraVideo Live:Implement RTS stream pulling on Android

Última atualização: Jun 30, 2026

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 pause em uma stream RTS ao vivo. Chame stop para encerrar a reprodução e, em seguida, chame prepare para 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.

  1. Adicione o repositório Maven ao arquivo build.gradle no diretório raiz do projeto.

    // Maven repository for Alibaba Cloud SDKs (ApsaraVideo Player)
    maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
  2. 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"
Nota

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.

Nota

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");
Nota

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 setTraceId**

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

DisableAnalytics

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

mMaxDelayTime

1000 ms

Atraso máximo

mStartBufferDuration

10 ms

Duração do buffer para início da reprodução

mHighBufferDuration

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();
Nota

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:

  1. Não execute nenhuma outra operação no objeto do player durante a destruição.

  2. Chamar stop antes de releaseAsync() é 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.

Nota

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);