Todos os produtos
Search
Central de documentação

ApsaraVideo Live:Batalha ao vivo

Última atualização: Jul 08, 2026

O ApsaraVideo Live oferece suporte ao recurso de batalha ao vivo, que permite a vários streamers em salas diferentes iniciarem uma competição em tempo real. Este tópico descreve como iniciar uma batalha e fornece exemplos de código relevantes.

Fluxo de trabalho

O Push SDK implementa batalhas ao vivo com base no ApsaraVideo Real-time Communication (ARTC). Ele auxilia os usuários a iniciar transmissões interativas que engajam mais pessoas com latência ultrabaixa. A figura a seguir explica o fluxo de trabalho da batalha ao vivo:

image

Conforme mostrado na figura, o Espectador C assiste à transmissão do Streamer A e o Espectador D assiste à transmissão do Streamer B. Se o Streamer A e o Streamer B desejarem iniciar uma batalha entre si, devem executar as seguintes operações:

  • Streamer A: O Streamer A usa a URL de streaming do Streamer B para reproduzir a transmissão dele com latência ultrabaixa. Simultaneamente, o Streamer A realiza a mixagem de streams para combinar sua própria transmissão com a do Streamer B em um único stream, que o Espectador C pode obter via CDN para reprodução.

  • Streamer B: O Streamer B usa a URL de streaming do Streamer A para reproduzir a transmissão dele com latência ultrabaixa. Ao mesmo tempo, o Streamer B realiza a mixagem de streams para unir sua transmissão com a do Streamer A em um único stream, disponível para o Espectador D via CDN.

  • Espectador C e Espectador D: Nenhuma ação é necessária por parte dos espectadores. O stream mixado é exibido automaticamente para eles.

Observações de uso

Utilize a edição interativa do Push SDK para criar a capacidade de batalha ao vivo. Para obter informações sobre a integração do SDK, consulte os seguintes tópicos:

Etapa 2: Gerar URLs de ingestão e streaming para uma batalha

Utilize as regras de concatenação para construir as URLs de ingestão e streaming dos streamers em uma batalha, bem como a URL de streaming via CDN para os espectadores. Para mais detalhes, consulte URLs de ingestão e streaming para cenários de desafio entre streamers e URLs de reprodução via CDN para espectadores regulares.

Etapa 3: Iniciar a ingestão de stream para o Streamer A

  1. Criar um objeto AlivcLivePushConfig

    Crie um objeto AlivcLivePushConfig para configurar a ingestão de stream. Defina livePushMode como AlivcLivePushInteractiveMode e configure parâmetros como resolução, taxa de quadros e bitrate.

    Importante

    Exemplo de código para Android:

    // Initialize the class for stream ingest configurations.
    mAlivcLivePushConfig = new AlivcLivePushConfig();
    // Specify the stream ingest mode. By default, the regular stream ingest mode is used.
    mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveInteractiveMode);
    // Specify the resolution. The default resolution is 540p.
    mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
    // Specify the frame rate. The default frame rate is 20 frames per second (FPS).
    mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
    // Specify the group of pictures (GOP) size. Unit: seconds. The default GOP size is 2 seconds.
    mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
    // Specify whether to enable adaptive bitrate streaming. The default value is true.
    mAlivcLivePushConfig.setEnableBitrateControl(true);
    // Specify the screen orientation. The default screen orientation is portrait. You can configure the settings that allow you to press the Home key to change the orientation to landscape left or landscape right.
    mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
    // Specify the audio encoding format. The default format is AAC-LC.
    mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
    // Specify the video encoding mode. By default, hardware encoding is used.
    mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
    // Specify the audio encoding mode. By default, software encoding is used.
    mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
    // Specify whether to use the front camera or the rear camera. By default, the front camera is used.
    mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
    // Specify the image that is ingested when your app is switched to the background or video stream ingest is paused.
    mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
    // Specify the image that is ingested in poor network conditions.
    mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");

    Exemplo de código para iOS:

    AlivcLivePushConfig *rtcPushConfig = [[AlivcLivePushConfig alloc] init];
    rtcPushConfig.livePushMode = AlivcLivePushInteractiveMode;
    rtcPushConfig.resolution = AlivcLivePushResolution540P;
    rtcPushConfig.fps = AlivcLivePushFPS20;
    rtcPushConfig.enableAutoBitrate = true;
    rtcPushConfig.orientation = AlivcLivePushOrientationPortrait;
    rtcPushConfig.enableAutoResolution = YES;

    Exemplo de código para Windows

    AlivcLivePushConfig rtcPushConfig;
    rtcPushConfig.mLivePushMode = AlivcLivePushInteractiveMode;
    rtcPushConfig.mResolution = AlivcLivePushResolution540P;
    rtcPushConfig.frameRate = AlivcLivePushFPS20;
    rtcPushConfig.mPreviewOrientation = AlivcLivePushOrientationPortrait;
  2. Criar um objeto AlivcLivePusher

    Crie um objeto AlivcLivePusher como instância de ingestão de stream. Passe o objeto AlivcLivePushConfig criado anteriormente e configure os callbacks relevantes.

    Exemplo de código para Android:

    AlivcLivePusher alivcLivePusher = new AlivcLivePusher();
    alivcLivePusher.init(context, alivcLivePushConfig);
    alivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {});
    alivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {});
    alivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {});

    Exemplo de código para iOS:

    AlivcLivePusher *rtcPusher = [[AlivcLivePusher alloc] initWithConfig:rtcPushConfig];
    [rtcPusher setInfoDelegate:self];
    [rtcPusher setErrorDelegate:self];
    [rtcPusher setNetworkDelegate:self];

    Exemplo de código para Windows

    	if (!pusher_) {
    		pusher_ = AlivcLivePusher::Create("");
    	}
    	pusher_->init(config_);
    
    	pusher_->setLivePushErrorListener(this);
    	pusher_->setLivePushInfoListener(this);
    	pusher_->setLivePushNetworkListener(this);
  3. Iniciar a ingestão de stream no modo de batalha

    Use a URL de ingestão da batalha para enviar o stream. Para saber como obter uma URL de ingestão, consulte Etapa 2: Gerar URLs de ingestão e streaming para uma batalha.

    Exemplo de código para Android:

    alivcLivePusher.startPreview(context, frameLayout, isAnchor);
    alivcLivePusher.startPushAysnc("artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX");  // The ingest URL of Streamer A.

    Exemplo de código para iOS:

    [rtcPusher startPushWithURL:@"artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX"]; // The ingest URL of Streamer A.

    Exemplo de código para Windows:

    pusher_->startPush("artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX");

Etapa 4: Iniciar a ingestão de stream para o Streamer B

  1. Criar um objeto AlivcLivePushConfig

    Crie um objeto AlivcLivePushConfig para configurar a ingestão de stream. Defina livePushMode como AlivcLivePushInteractiveMode e configure parâmetros como resolução, taxa de quadros e bitrate.

    Importante

    Exemplo de código para Android:

    // Initialize the class for stream ingest configurations.
    mAlivcLivePushConfig = new AlivcLivePushConfig();
    // Specify the stream ingest mode. By default, the regular stream ingest mode is used.
    mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveInteractiveMode);
    // Specify the resolution. The default resolution is 540p.
    mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
    // Specify the frame rate. The default frame rate is 20 frames per second (FPS).
    mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
    // Specify the group of pictures (GOP) size. Unit: seconds. The default GOP size is 2 seconds.
    mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
    // Specify whether to enable adaptive bitrate streaming. The default value is true.
    mAlivcLivePushConfig.setEnableBitrateControl(true);
    // Specify the screen orientation. The default screen orientation is portrait. You can configure the settings that allow you to press the Home key to change the orientation to landscape left or landscape right.
    mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
    // Specify the audio encoding format. The default format is AAC-LC.
    mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
    // Specify the video encoding mode. By default, hardware encoding is used.
    mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
    // Specify the audio encoding mode. By default, software encoding is used.
    mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
    // Specify whether to use the front camera or the rear camera. By default, the front camera is used.
    mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
    // Specify the image that is ingested when your app is switched to the background or video stream ingest is paused.
    mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
    // Specify the image that is ingested in poor network conditions.
    mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");

    Exemplo de código para iOS:

    AlivcLivePushConfig *rtcPushConfig = [[AlivcLivePushConfig alloc] init];
    rtcPushConfig.livePushMode = AlivcLivePushInteractiveMode;
    rtcPushConfig.resolution = AlivcLivePushResolution540P;
    rtcPushConfig.fps = AlivcLivePushFPS20;
    rtcPushConfig.enableAutoBitrate = true;
    rtcPushConfig.orientation = AlivcLivePushOrientationPortrait;
    rtcPushConfig.enableAutoResolution = YES;

    Exemplo de código para Windows

    AlivcLivePushConfig rtcPushConfig;
    rtcPushConfig.mLivePushMode = AlivcLivePushInteractiveMode;
    rtcPushConfig.mResolution = AlivcLivePushResolution540P;
    rtcPushConfig.frameRate = AlivcLivePushFPS20;
    rtcPushConfig.mPreviewOrientation = AlivcLivePushOrientationPortrait;
  2. Criar um objeto AlivcLivePusher

    Crie um objeto AlivcLivePusher como instância de ingestão de stream. Passe o objeto AlivcLivePushConfig criado anteriormente e configure os callbacks relevantes.

    Exemplo de código para Android:

    AlivcLivePusher alivcLivePusher = new AlivcLivePusher();
    alivcLivePusher.init(context, alivcLivePushConfig);
    alivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {});
    alivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {});
    alivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {});

    Exemplo de código para iOS:

    AlivcLivePusher *rtcPusher = [[AlivcLivePusher alloc] initWithConfig:rtcPushConfig];
    [rtcPusher setInfoDelegate:self];
    [rtcPusher setErrorDelegate:self];
    [rtcPusher setNetworkDelegate:self];

    Exemplo de código para Windows

    	if (!pusher_) {
    		pusher_ = AlivcLivePusher::Create("");
    	}
    	pusher_->init(config_);
    
    	pusher_->setLivePushErrorListener(this);
    	pusher_->setLivePushInfoListener(this);
    	pusher_->setLivePushNetworkListener(this);
  3. Iniciar a ingestão de stream no modo de batalha

    Use a URL de ingestão da batalha para enviar o stream. Para saber como obter uma URL de ingestão, consulte Etapa 2: Gerar URLs de ingestão e streaming para uma batalha.

    Exemplo de código para Android:

    alivcLivePusher.startPreview(context, frameLayout, isAnchor);
    alivcLivePusher.startPushAysnc("artc://live.aliyun.com/push/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX");  // The ingest URL of Streamer B.

    Exemplo de código para iOS:

    [rtcPusher startPushWithURL:@"artc://live.aliyun.com/push/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX"]; // The ingest URL of Streamer B.

    Exemplo de código para Windows:

    pusher_->startPush("artc://live.aliyun.com/push/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX");

Etapa 5: Iniciar a batalha

  1. O Streamer A chama AlivcLivePlayer para reproduzir o stream do Streamer B, e o Streamer B chama AlivcLivePlayer para reproduzir o stream do Streamer A.

    O Streamer A e o Streamer B reproduzem as transmissões um do outro e iniciam a batalha.

    Streamer A:

    • Exemplo de código para Android:

      AlivcLivePlayConfig config = new AlivcLivePlayConfig();
      config.isFullScreen = isAnchor;
      
      AlivcLivePlayer alivcLivePlayer = new AlivcLivePlayerImpl(context, AlivcLiveMode.AlivcLiveInteractiveMode);
      alivcLivePlayer.setPlayInfoListener(new AlivcLivePlayInfoListener() {});
      
      mAlivcLivePlayer.setupWithConfig(config);
      mAlivcLivePlayer.setPlayView(frameLayout);
      
      alivcLivePlayer.startPlay("artc://live.aliyun.com/play/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX");  // The streaming URL of Streamer B.
    • Exemplo de código para iOS:

      AlivcLivePlayer *rtcPlayer = [[AlivcLivePlayer alloc] init];
      [rtcPlayer setLivePlayerDelegate:self];
      [rtcPlayer setPlayView:self.playerView  playCofig:self.rtcPlayConfig];
      [rtcPlayer startPlayWithURL:@"artc://live.aliyun.com/play/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX"];  // The streaming URL of Streamer B.
    • Exemplo de código para Windows:

      player_ = AlivcLivePlayer::Create("");
      if (player_) {
          AlivcLivePlayConfig config;
          player_->setupWithConfig(config);
          player_->startPlay("artc://live.aliyun.com/play/456?timestamp=1661596947&token=XXX&userId=456&sdkAppId=XXX");
          player_->setPlayView(hwnd, width, height);
      }

    Streamer B:

    • Exemplo de código para Android:

      AlivcLivePlayConfig config = new AlivcLivePlayConfig();
      config.isFullScreen = isAnchor;
      
      AlivcLivePlayer alivcLivePlayer = new AlivcLivePlayerImpl(context, AlivcLiveMode.AlivcLiveInteractiveMode);
      alivcLivePlayer.setPlayInfoListener(new AlivcLivePlayInfoListener() {});
      
      mAlivcLivePlayer.setupWithConfig(config);
      mAlivcLivePlayer.setPlayView(frameLayout);
      
      alivcLivePlayer.startPlay("artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX"); // The streaming URL of Streamer A.
    • Exemplo de código para iOS:

      AlivcLivePlayer *rtcPlayer = [[AlivcLivePlayer alloc] init];
      [rtcPlayer setLivePlayerDelegate:self];
      [rtcPlayer setPlayView:self.playerView  playCofig:self.rtcPlayConfig];
      [rtcPlayer startPlayWithURL:@"artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX"];  // The streaming URL of Streamer A.
    • Exemplo de código para Windows:

      player_ = AlivcLivePlayer::Create("");
      if (player_) {
          AlivcLivePlayConfig config;
          player_->setupWithConfig(config);
          player_->startPlay("artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=123&sdkAppId=XXX");
          player_->setPlayView(hwnd, width, height);
      }
  2. O Streamer A e o Streamer B atualizam o stream mixado, respectivamente.

    Para garantir que o Espectador C e o Espectador D possam assistir à batalha entre o Streamer A e o Streamer B, ambos os streamers devem realizar a mixagem de streams individualmente. Assim, as transmissões do Streamer A e do Streamer B são combinadas em um único stream, que os espectadores podem obter via CDN para reprodução.

    Especificamente, o Streamer A e o Streamer B chamam o método setLiveMixTranscodingConfig para iniciar uma tarefa de transcodificação de stream mixado e especificar os streams a serem misturados, respectivamente. Parâmetros como resolução e taxa de quadros do stream mixado correspondem aos valores configurados pelos streamers em AlivcLivePushConfig durante a criação do objeto AlivcLivePusher. Por exemplo, se o Streamer A definiu a resolução como 720p em AlivcLivePushConfig ao criar o objeto AlivcLivePusher, a resolução do stream mixado para o Streamer A será 720p.

    Exemplo de código para Android:

    AlivcLiveTranscodingConfig transcodingConfig = new AlivcLiveTranscodingConfig();
    
    AlivcLiveMixStream anchorMixStream = new AlivcLiveMixStream();
    anchorMixStream.setUserId(123);
    anchorMixStream.setX(0);
    anchorMixStream.setY(0);
    anchorMixStream.setWidth(mAlivcLivePushConfig.getWidth());
    anchorMixStream.setHeight(mAlivcLivePushConfig.getHeight());
    anchorMixStream.setZOrder(1);
    
    AlivcLiveMixStream audienceMixStream = new AlivcLiveMixStream();
    audienceMixStream.setUserId(456);
    audienceMixStream.setX((int) mAudienceFrameLayout.getX() / 3);
    audienceMixStream.setY((int) mAudienceFrameLayout.getY() / 3);
    audienceMixStream.setWidth(mAudienceFrameLayout.getWidth() / 2);
    audienceMixStream.setHeight(mAudienceFrameLayout.getHeight() / 2);
    audienceMixStream.setZOrder(2);
    
    ArrayList<AlivcLiveMixStream> mixStreams = new ArrayList<>();
    mixStreams.add(anchorMixStream);
    mixStreams.add(audienceMixStream);
    transcodingConfig.setMixStreams(mixStreams);
    
    alivcLivePusher.setLiveMixTranscodingConfig(transcodingConfig);

    Exemplo de código para iOS:

     AlivcLiveTranscodingConfig *liveTranscodingConfig = [[AlivcLiveTranscodingConfig alloc] init];
    
    AlivcLiveMixStream *anchorMixStream = [[AlivcLiveMixStream alloc] init];
    anchorMixStream.userId = 123;
    anchorMixStream.x = 0;
    anchorMixStream.y = 0;
    anchorMixStream.width = [self.rtcPushConfig getPushResolution].width;
    anchorMixStream.height = [self.rtcPushConfig getPushResolution].height;
    anchorMixStream.zOrder = 1;
    
    AlivcLiveMixStream *audienceMixStream = [[AlivcLiveMixStream alloc] init];
    audienceMixStream.userId = 456;
    audienceMixStream.x = 100;
    audienceMixStream.y = 200;
    audienceMixStream.width = 200;
    audienceMixStream.height = 300;
    audienceMixStream.zOrder = 2;
    
    liveTranscodingConfig.mixStreams = [NSArray arrayWithObjects:anchorMixStream, audienceMixStream, nil];
    [self.rtcPusher setLiveMixTranscodingConfig:liveTranscodingConfig];

    Exemplo de código para Windows:

    AlivcLiveTranscodingConfig liveTranscodingConfig;
    
    AlivcLiveMixStream anchorMixStream ;
    anchorMixStream.userId = userA;
    anchorMixStream.x = 0;
    anchorMixStream.y = 0;
    anchorMixStream.width = width;
    anchorMixStream.height = height;
    anchorMixStream.zOrder = 1;
    
    AlivcLiveMixStream audienceMixStream;
    audienceMixStream.userId = userD;
    audienceMixStream.x = 100;
    audienceMixStream.y = 200;
    audienceMixStream.width = 200;
    audienceMixStream.height = 300;
    audienceMixStream.zOrder = 2;
    
    liveTranscodingConfig.mixStreams.Add(anchorMixStream);
    liveTranscodingConfig.mixStreams.Add(audienceMixStream);
    pusher_->setLiveMixTranscodingConfig(&liveTranscodingConfig);

Etapa 6: Encerrar a batalha

  1. O Streamer A e o Streamer B param de reproduzir as transmissões um do outro.

    A batalha é interrompida. O Streamer A e o Streamer B voltam a ingerir seus próprios streams separadamente.

    Exemplo de código para Android:

    alivcLivePlayer.stopPlay();
    alivcLivePlayer.destroy();
    alivcLivePlayer = null;

    Exemplo de código para iOS:

    [self.rtcPlayer stopPlay];
    self.rtcPlayer = nil;

    Exemplo de código para Windows:

    	if (player_) {
    		player_->stopPlay();
    		player_->destroy();
    		player_ = nullptr;
    	}
  2. O Streamer A e o Streamer B atualizam o stream mixado, respectivamente.

    Após o término da batalha, o Streamer A e o Streamer B precisam chamar o método setLiveMixTranscodingConfig e passar um valor vazio, respectivamente. Isso interrompe a mixagem de streams.

    Observe que, se o Espectador C ou D quiser assistir apenas à transmissão do Streamer A ou B, o respectivo streamer também pode chamar o método setLiveMixTranscodingConfig e passar um valor vazio para parar a mixagem de streams.

    Aviso

    Se o streamer ainda estiver na sala, mas não precisar de mixagem de streams, certifique-se de interromper esse processo. Caso contrário, o módulo de mixagem continuará em execução e gerará cobranças desnecessárias.

    Exemplo de código para Android:

    alivcLivePusher.setLiveMixTranscodingConfig(null);

    Exemplo de código para iOS:

    [self.rtcPusher setLiveMixTranscodingConfig:nil];

    Exemplo de código para Windows:

    pusher_->setLiveMixTranscodingConfig(nullptr);