Todos os produtos
Search
Central de documentação

ApsaraVideo Live:Use o Push SDK for Android

Última atualização: Sep 20, 2026

Saiba como registrar, configurar e usar o Push SDK for Android para ingestão de streams ao vivo, com exemplos para captura de câmera, compartilhamento de tela, retoque e muito mais.

Recursos

  • Suporta ingestão de stream por meio do Real-Time Messaging Protocol (RTMP).

  • Suporta ingestão e pull de stream RTS com base em Real-Time Communication (RTC).

  • Suporta co-streaming e batalhas.

  • Utiliza H.264 para codificação de vídeo e AAC para codificação de áudio.

  • Suporta configurações personalizadas para recursos como controle de taxa de bits, resolução e modo de exibição.

  • Suporta diversas operações de câmera.

  • Suporta retoque em tempo real e efeitos de retoque personalizados.

  • Permite adicionar e remover adesivos animados como marcas d'água.

  • Permite transmitir gravações de tela.

  • Suporta entradas externas de áudio e vídeo em diferentes formatos, como YUV e modulação por código de pulso (PCM).

  • Suporta a mixagem de múltiplos streams.

  • Suporta a ingestão de streams apenas de áudio e apenas de vídeo, além da ingestão de stream em segundo plano.

  • Suporta música de fundo.

  • Suporta a captura de snapshot de vídeo.

  • Suporta reconexão automática e tratamento de erros.

  • Suporta os algoritmos de Controle Automático de Ganho (AGC), Redução Automática de Ruído (ANR) e Cancelamento de Eco Acústico (AEC).

  • Permite alternar entre os modos de codificação por software e hardware para arquivos de vídeo. Isso melhora a estabilidade do módulo de codificação.

Limitações

Observe os seguintes limites antes de usar o Push SDK for Android:

  • Configure a orientação da tela antes da ingestão de stream. Você não pode girar a tela durante a transmissão ao vivo.

  • Desative a rotação automática de tela para a ingestão de stream no modo paisagem.

  • No modo de codificação por hardware, o valor da resolução de saída deve ser um múltiplo de 16 para ser compatível com o codificador. Por exemplo, ao definir a resolução como 540p, a resolução de saída será 544 × 960. Dimensione o tamanho da tela do player com base na resolução de saída para evitar a exibição de barras pretas.

Referência da API

Referência da API (Basic Edition)

Procedimento

  1. Register the SDK

  2. Configure stream ingest parameters

  3. Start stream ingest

Uso de recursos

Registre o SDK

Para obter e configurar uma licença, integrate a Push SDK license.

Nota

Registre o SDK antes de usar seus recursos de ingestão de stream.

Chame a API de registro de licença no início do ciclo de vida do seu aplicativo, antes de usar o Push SDK for Android.

AlivcLiveBase.setListener(new AlivcLiveBaseListener() {
  @Override
  public void onLicenceCheck(AlivcLivePushConstants.AlivcLiveLicenseCheckResultCode result, String reason) {
    Log.e(TAG, "onLicenceCheck: " + result + ", " + reason);
  }
});
AlivcLiveBase.registerSDK();
  • Use a classe AlivcLiveBase para definir níveis de log, especificar caminhos locais de log e obter a versão do SDK.

  • Chame o método registerSDK em AlivcLiveBase para registrar a licença do SDK.

  • Implemente o callback onLicenceCheck na interface AlivcLiveBase#setListener para verificar de forma assíncrona a configuração da licença.

    Nota

    Este callback é acionado somente após a inicialização da instância do pusher.

Configure os parâmetros de ingestão de stream

Os parâmetros de ingestão de stream possuem valores padrão que não exigem configuração adicional.

// Initialize the stream ingest configuration class.
AlivcLivePushConfig mAlivcLivePushConfig = new AlivcLivePushConfig();
// Set the stream ingest mode. The default is the basic mode.
mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveBasicMode);
// Set the resolution. The default is 540p.
mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
// Set the frame rate. The default is 25 fps.
mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
// Set the video encoding GOP size in seconds. The default is 2 seconds.
mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
// Enable bitrate control. This is enabled by default.
mAlivcLivePushConfig.setEnableBitrateControl(true);
// Set the screen orientation. The default is portrait. You can also set it to landscape with the home button on the left or right.
mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
// Set the audio encoding profile. The default is AAC-LC.
mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
// Set the video encoding mode. The default is hardware encoding.
mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
// Set the audio encoding mode. The default is software encoding.
mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
// Set the camera type. The default is the front camera.
mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
// Set the image to display when the app is in the background or stream ingest is paused.
mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
// Set the image to display in poor network conditions.
mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
Importante
  • Defina a resolução como 540p para um equilíbrio ideal entre o desempenho do dispositivo e a largura de banda.

  • Desativar o controle de taxa de bits fixa a taxa de bits no valor inicial sem adaptação às condições de rede, o que pode causar travamentos na reprodução.

Ingestão de stream da câmera

  1. Inicialize.

    Chame o método init após configurar os parâmetros de ingestão de stream:

    AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
    mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
    Nota

    O AlivcLivePusher não suporta múltiplas instâncias. Cada chamada de init deve ser pareada com uma chamada de destroy.

  2. Registre os callbacks de visualização.

    Chame o método setLivePushInfoListener para registrar os callbacks de visualização:

    /**
     * Set a listener for stream ingest event notifications.
     *
     * @param infoListener The notification listener.
     */
    mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
        @Override
        public void onPreviewStarted(AlivcLivePusher pusher) {
            // Notification that the preview has started.
        }
        // Other override methods
        //....
        //....
    });
  3. Inicie a visualização.

    Inicie a visualização passando o SurfaceView para a visualização da câmera:

    mAlivcLivePusher.startPreview(mSurfaceView); // Starts the preview. You can also call the asynchronous startPreviewAsync method based on your needs.
  4. Inicie a ingestão de stream.

    Adicione o seguinte código dentro do método de callback onPreviewStarted.

    mAlivcLivePusher.startPush(mPushUrl);
    Nota
    • URLs de ingestão para RTMP e RTS (artc://) são suportadas. Para obter as URLs, consulte Generate ingest and streaming URLs.

    • O ApsaraVideo Live rejeita solicitações simultâneas de ingestão de stream para a mesma URL.

Métodos comuns de ingestão de stream

O SDK fornece métodos para controlar o ciclo de vida do stream: iniciar, parar, pausar, retomar, reiniciar, reconectar e descartar.

/* Call to pause a stream that is being ingested. After pausing, the video preview and video stream ingest are held on the last frame, while audio stream ingest continues. */
mAlivcLivePusher.pause();
/* Call to resume a paused stream. After resuming, the audio and video preview and stream ingest return to normal. */
mAlivcLivePusher.resume();
/* Call to stop a stream that is being ingested. After completion, stream ingest stops. */
mAlivcLivePusher.stopPush();
/* Call to stop the preview only when in the previewing state. Calling this while ingesting a stream has no effect. After the preview stops, the preview frame freezes on the last frame. */
mAlivcLivePusher.stopPreview();
/* Call to restart stream ingest when a stream is being ingested or after receiving any error-related callback. In an error state, you can only call this API, reconnectPushAsync, or destroy. Restarting reinitializes all internal resources of AlivcLivePusher, including preview and stream ingest. */
mAlivcLivePusher.restartPush();
/* Call to reconnect a stream when it is being ingested or after receiving an error callback related to AlivcLivePusherNetworkDelegate. In an error state, you can only call this API, restartPush, or destroy. Reconnecting re-establishes the RTMP connection for stream ingest. */
mAlivcLivePusher.reconnectPushAsync();
/* Call to dispose of the stream ingest instance. After disposal, stream ingest and preview stop, and the preview surface is removed. All resources related to AlivcLivePusher are released. */
mAlivcLivePusher.destroy();

Operações de câmera

Alterne entre câmeras, ative ou desative o flash e ajuste o foco, o zoom e o espelhamento durante a ingestão de stream, pausa ou reconexão:

/* Switch between the front and rear cameras. */
mAlivcLivePusher.switchCamera();
/* Turn the flash on or off. Turning on the flash has no effect when the front camera is active. */
mAlivcLivePusher.setFlash(true); 
/* Adjust the focal length to zoom the captured image. The zoom range is [0, getMaxZoom()]. */
mAlivcLivePusher.setZoom(5);
/* Manually focus the camera. This requires two parameters: 1. `point` (the coordinates of the point to focus on) and 2. `autoFocus` (whether to enable autofocus for this specific operation). Subsequent autofocus behavior follows the value set by the setAutoFocus API. */
mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true);
/* Set whether to enable autofocus. */
mAlivcLivePusher.setAutoFocus(true);
/* Configure mirroring. There are two mirroring APIs: PushMirror for the ingested stream and PreviewMirror for the local preview. PushMirror affects only the playback display, while PreviewMirror affects only the preview display. They do not affect each other. */
mAlivcLivePusher.setPreviewMirror(false);
mAlivcLivePusher.setPushMirror(false);
Importante

As APIs de câmera estão disponíveis somente após o início da visualização.

Ingestão de stream de compartilhamento de tela

O compartilhamento de tela usa MediaProjection e requer permissão do usuário. Passe os dados do resultado da permissão para o SDK. A câmera é desativada por padrão durante o compartilhamento de tela.

Configure o compartilhamento de tela

// resultData is the screen sharing system intent.
mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData);

Configure a rotação de tela

Defina o ângulo de rotação da tela para suportar a gravação nos modos paisagem e retrato durante o compartilhamento de tela:

mAlivcLivePusher.setScreenOrientation(0);
Nota

Escute o evento OrientationEventListener na camada do aplicativo e defina o ângulo de rotação por meio desta API quando a orientação da tela mudar.

Configure a proteção de privacidade

Ative a proteção de privacidade durante o compartilhamento de tela para ocultar entradas confidenciais, como senhas:

mAlivcLivePusher.pauseScreenCapture(); // Enable privacy protection.
mAlivcLivePusher.resumeScreenCapture(); // Disable privacy protection.
Nota

Isso pausa o compartilhamento de tela. Se setPausePushImage estiver definido na configuração, os espectadores verão a imagem especificada. Caso contrário, os espectadores verão o último quadro antes da pausa.

Ingestão de streams de câmera e compartilhamento de tela

Você pode ativar a ingestão da câmera durante o compartilhamento de tela. Há duas abordagens disponíveis:

  1. O streamer tem uma visualização da câmera.

    Tanto o streamer quanto os espectadores podem ver o feed da câmera.

  2. O streamer não tem uma visualização da câmera.

    Por exemplo, durante uma transmissão de jogos, o streamer pode não querer que a visualização da câmera obstrua o jogo. No entanto, os espectadores ainda podem ver o feed da câmera do streamer no stream final.

O streamer pode ver a visualização da câmera

Após o início do compartilhamento de tela, chame a API para iniciar ou parar a visualização da câmera.

mAlivcLivePusher.startCamera(surfaceView); // Start the camera preview.
mAlivcLivePusher.stopCamera(); // Stop the camera preview.
Nota
  • Defina a proporção da surfaceView de visualização da câmera como 1:1 para evitar ajustes na rotação da tela.

  • Se a proporção não for 1:1, ajuste a proporção da surfaceView quando a tela girar e, em seguida, chame stopCamera seguido de startCamera.

  • Se o streamer não precisar de uma visualização, defina surfaceview como nulo.

O streamer não pode ver a visualização da câmera

Ative a mixagem de stream da câmera para incluir o feed da câmera no stream sem uma visualização local.

mAlivcLivePusher.startCameraMix(x, y, w, h); // Enable camera stream mixing and set the x, y, w, and h layout for the mixed stream.
mAlivcLivePusher.stopCameraMix(); // Stop camera stream mixing.

Modo de exibição da visualização

Três modos de exibição de visualização estão disponíveis. O modo de exibição não afeta a ingestão de stream.

  • ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL: O vídeo preenche a janela de visualização. Se as proporções do vídeo e da janela forem diferentes, a visualização aparecerá distorcida.

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT: A proporção do vídeo é preservada. Se as proporções do vídeo e da janela forem diferentes, barras pretas aparecerão na visualização.

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL: O vídeo é cortado para caber na proporção da janela. Se as proporções forem diferentes, o vídeo será cortado.

O código a seguir fornece um exemplo:

mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);

Ingestão de stream de imagem

O SDK pode ingerir uma imagem de espaço reservado quando o aplicativo está em segundo plano ou a rede está ruim.

Quando o aplicativo entra em segundo plano, a ingestão de vídeo pausa enquanto o áudio continua. Exiba uma imagem de espaço reservado para informar os espectadores:

mAlivcLivePushConfig.setPausePushImage("path/to/background.png"); // Set the image for background stream ingest.

O SDK ingere esta imagem ao detectar uma taxa de bits baixa, reduzindo os travamentos do vídeo:

mAlivcLivePushConfig.setNetworkPoorPushImage("path/to/network_poor.png"); // Set the image to ingest in poor network conditions.

Ingestão de stream apenas de áudio

mAlivcLivePushConfig.setAudioOnly(true);

Ingestão de streams externos de áudio e vídeo

O SDK suporta a ingestão de áudio e vídeo de fontes externas, como arquivos de vídeo.

Ative primeiro a entrada personalizada de áudio e vídeo:

/**
* Other parameters such as output resolution, audio sample rate, and number of channels are set in the config object
* using setResolution, setAudioSampleRate, and setAudioChannels.
*/
mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,AlivcSoundFormat.SOUND_FORMAT_S16);

Após ativar a entrada personalizada de áudio e vídeo, você pode ingerir streams externos.

Ingerir stream de áudio externo

/**
* This API does not control timing. The caller must control the timing of the input audio frames.
*/
mAlivcLivePusher.inputStreamAudioData(byte[] data, int size, int sampleRate, int channels, long pts);

Ingerir stream de vídeo externo

/**
* This API does not control timing. The caller must control the timing of the input video frames.
*/
mAlivcLivePusher.inputStreamVideoData(byte[] data, int width, int height, int stride, int size, long pts, int rotation);

Configure marcas d'água

Adicione uma ou mais marcas d'água no formato PNG:

mAlivcLivePushConfig.addWaterMark(waterPath,0.1,0.2,0.3); // Add a watermark.
Nota
  • Os parâmetros x, y e width são valores relativos. Por exemplo, x=0.1 significa que a coordenada x da marca d'água está em 10% da largura do stream. Se a resolução do stream for 540x960, a coordenada x da marca d'água será 54.

  • A altura da imagem da marca d'água é dimensionada proporcionalmente com base em sua proporção original e no valor de largura fornecido.

  • Para implementar uma marca d'água de texto, primeiro converta o texto em uma imagem e, em seguida, use esta API para adicioná-la como marca d'água.

Configure a qualidade do vídeo

Três modos de qualidade de vídeo são suportados: modo Prioridade de Resolução, modo Prioridade de Fluidez e modo Personalizado.

Importante

Para definir a qualidade do vídeo, ative o controle de taxa de bits: mAlivcLivePushConfig.setEnableBitrateControl(true);

Modo Prioridade de Resolução (padrão)

O SDK prioriza a clareza do vídeo configurando automaticamente os parâmetros de taxa de bits.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST); // Prioritize resolution.

Modo Prioridade de Fluidez

O SDK prioriza a fluidez do vídeo configurando automaticamente os parâmetros de taxa de bits.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_FLUENCY_FIRST); // Prioritize fluency.

Modo Personalizado

O SDK usa suas configurações de taxa de bits. Defina os valores de taxa de bits inicial, mínima e alvo.

  • Taxa de bits alvo: Em boas condições de rede, a taxa de bits aumenta gradualmente até a taxa de bits alvo para melhorar a clareza do vídeo.

  • Taxa de bits mínima: Em condições ruins de rede, a taxa de bits diminui gradualmente até a taxa de bits mínima para reduzir os travamentos do vídeo.

  • Taxa de bits inicial: A taxa de bits quando a transmissão ao vivo começa.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM); // Custom mode
mAlivcLivePushConfig.setTargetVideoBitrate(1000); // Target bitrate: 1,000 kbit/s
mAlivcLivePushConfig.setMinVideoBitrate(300); // Minimum bitrate: 300 kbit/s
mAlivcLivePushConfig.setInitialVideoBitrate(800); // Initial bitrate: 800 kbit/s

Consulte as seguintes configurações recomendadas de taxa de bits:

Tabela 1. Configurações recomendadas para o modo Prioridade de Resolução

Resolução

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

600

300

1000

480p

800

300

1200

540p

1000

600

1400

720p

1500

600

2000

1080p

1800

1200

2500

Tabela 1. Configurações recomendadas para o modo Prioridade de Resolução

Resolução

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

400

200

600

480p

600

300

800

540p

800

300

1000

720p

1000

300

1200

1080p

1500

1200

2200

Resolução adaptativa

A resolução adaptativa reduz automaticamente a resolução em condições ruins de rede para melhorar a fluidez:

mAlivcLivePushConfig.setEnableAutoResolution(true); // Enable adaptive resolution. Default is false.
Importante
  • A resolução adaptativa funciona apenas no modo Resolution Priority or Fluency Priority, não no modo Personalizado.

  • Alguns players não suportam alterações dinâmicas de resolução. Use um player do Alibaba Cloud para garantir compatibilidade.

Música de fundo

O SDK suporta reprodução de música de fundo, mixagem, remoção de ruído, monitoramento in-ear e silenciamento:

/* Start playing background music. */
mAlivcLivePusher.startBGMAsync(mPath);
/* Stop playing background music. If BGM is already playing and you need to switch songs, just call the start background music API again. You do not need to stop the current BGM. */
mAlivcLivePusher.stopBGMAsync();
/* Pause background music. This can only be called after BGM has started playing. */
mAlivcLivePusher.pauseBGM();
/* Resume background music. This can only be called when BGM is paused. */
mAlivcLivePusher.resumeBGM();
/* Enable looping for background music. */
mAlivcLivePusher.setBGMLoop(true);
/* Set the denoise switch. When enabled, non-human sounds in the captured audio are filtered. This may slightly suppress human voices. We recommend letting users choose whether to enable this feature. It is disabled by default. */
mAlivcLivePusher.setAudioDenoise(true);
/* Set the in-ear monitoring switch. This feature is mainly used in karaoke scenarios. When enabled with headphones plugged in, the streamer will hear their own voice. When disabled, they will not. This has no effect if headphones are not plugged in. */
mAlivcLivePusher.setBGMEarsBack(true);
/* Configure mixing to adjust the volume of background music and captured voice. */
mAlivcLivePusher.setBGMVolume(50); // Set background music volume.
mAlivcLivePusher.setCaptureVolume(50); // Set captured voice volume.
/* Mute the audio. This mutes both music and voice input. To mute only music or voice, use the mixing volume adjustment APIs. */
mAlivcLivePusher.setMute(true);
Importante

As APIs de música de fundo estão disponíveis somente após o início da visualização.

Snapshot de stream

Tire um snapshot do stream de vídeo local:

// Take a snapshot of the video stream. Parameters: number of images to capture, interval between each capture in seconds, and a callback listener.
pusher.snapshot(1, 1, new AlivcSnapshotListener() {
    @Override
    public void onSnapshot(Bitmap bmp) {
        // You can save the snapshot to a local PNG file. The following code is an example.
        String dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss-SS").format(new Date());
        File f = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "snapshot-" + dateFormat + ".png");
        if (f.exists()) {
            f.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(f);
            bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
});

Execução em segundo plano e bloqueio de tela

  • Quando seu aplicativo é movido para segundo plano ou a tela é bloqueada, chame os métodos pause() ou resume() do AlivcLivePusher para pausar ou retomar a ingestão de stream.

  • Para chamadas de áudio e vídeo que não sejam do sistema, o SDK captura e ingere o som. Com base nas suas necessidades de negócios, chame a API mAlivcLivePusher.setMute(true or false) para determinar se o áudio deve ser capturado quando o aplicativo está em segundo plano ou a tela está bloqueada.

Callbacks

Tipo de callback

Nome da classe de callback

Método de configuração

Stream ingest callbacks

AlivcLivePushInfoListener

mAlivcLivePusher.setLivePushInfoListener()

Network-related callbacks

AlivcLivePushNetworkListener

mAlivcLivePusher.setLivePushNetworkListener()

Error callbacks

AlivcLivePushErrorListener

mAlivcLivePusher.setLivePushErrorListener()

Background music callbacks

AlivcLivePushBGMListener

mAlivcLivePusher.setLivePushBGMListener()

Callbacks de ingestão de stream

Os callbacks de ingestão de stream notificam o aplicativo sobre alterações de status do SDK: início da visualização, primeiro quadro renderizado, primeiro quadro enviado, início da ingestão e parada da ingestão.

  • onPushStarted: Indica uma conexão bem-sucedida com o servidor.

  • onFirstFramePushed: Indica que o primeiro quadro de áudio ou vídeo foi enviado com sucesso.

  • Os callbacks onPushStarted e onFirstFramePushed indicam que o SDK iniciou a ingestão de stream com sucesso.

Callbacks relacionados à rede

Os callbacks de rede relatam o status da conexão. O SDK reconecta automaticamente em breves flutuações de rede dentro dos limites de tempo limite e tentativas definidos em AlivcLivePushConfig.

  • onConnectFail: A ingestão de stream falhou. Verifique a URL de ingestão quanto à validade, problemas de autenticação, limites de streams simultâneos ou status de lista de bloqueios. Códigos de erro: 0x30020901–0x30020905, 0x30010900–0x30010901.

  • onConnectionLost: Conexão perdida. O SDK reconecta automaticamente, acionando onReconnectStart. Se as tentativas excederem config.connectRetryCount, onReconnectFail será disparado.

  • onNetworkPoor: A rede é insuficiente para uma ingestão estável, mas o stream não é interrompido. Use isso para exibir uma notificação na interface do usuário.

  • onNetworkRecovery: A rede foi recuperada.

  • onReconnectFail: A reconexão automática falhou após exceder os limites de tempo limite e tentativas no AlivcLivePushConfig. Chame mAlivcLivePusher.reconnectPushAsync para reconectar manualmente após a recuperação da rede.

  • onSendDataTimeout: O envio de dados atingiu o tempo limite. Verifique a rede e, em seguida, pare e reinicie a ingestão de stream.

  • onPushURLAuthenticationOverdue: A autenticação da URL de ingestão expirou. Forneça uma nova URL para o SDK.

Callbacks de erro

  • onSystemError: Erro de sistema ou dispositivo. Descarte o mecanismo e tente novamente.

  • onSDKError: Trate com base no código de erro:

    • Erro 805438211: Baixo desempenho do dispositivo com baixa taxa de quadros de codificação. Notifique o streamer e pare operações que consomem muitos recursos, como retoque avançado.

    • Trate erros de permissão ausente: 268455940 (microfone) e 268455939 (câmera).

    • Registre todos os outros erros.

Callbacks de música de fundo

  • onOpenFailed: A música de fundo falhou ao iniciar. Verifique o caminho e o formato do arquivo e, em seguida, chame startBGMAsync novamente.

  • onDownloadTimeout: A reprodução da música atingiu o tempo limite, geralmente ao transmitir de uma URL. Verifique a rede e chame startBGMAsync novamente.

Métodos e APIs comuns

Métodos comuns

/* In Custom mode, you can adjust the minimum and target bitrates in real time. */
mAlivcLivePusher.setTargetVideoBitrate(800);
mAlivcLivePusher.setMinVideoBitrate(400);
/* Check if the camera supports autofocus. */
mAlivcLivePusher.isCameraSupportAutoFocus();
/* Check if the camera supports flash. */
mAlivcLivePusher.isCameraSupportFlash();
/* Get the current stream ingest status. */
mAlivcLivePusher.isPushing(); 
/* Get the ingest URL. */
mAlivcLivePusher.getPushUrl();
/* Get stream ingest performance and debugging information. For details on performance parameters, see the API reference or interface comments. */
mAlivcLivePusher.getLivePushStatsInfo();
/* Get the SDK version number. */
mAlivcLivePusher.getSDKVersion();
/* Set the log level to filter debugging information as needed. */
mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll);
/* Get the current status of the SDK. */
mAlivcLivePusher.getCurrentStatus();
/* Get the last error code. Returns ALIVC_COMMON_RETURN_SUCCESS if there are no errors. */
mAlivcLivePusher.getLastError();

APIs comuns

Classe

Descrição

AlivcLivePushConfig

Configuração inicial para ingestão de stream.

AlivcLivePusher

Classe para recursos de ingestão de stream.

AlivcLivePusherErrorListener

Callback para erros.

AlivcLivePusherNetworkListener

Callback para notificações relacionadas à rede.

AlivcLivePusherInfoListener

Callback para informações de ingestão de stream.

AlivcLivePusherBGMListener

Callback para música de fundo.

AlivcLivePushCustomFilter

Callback para filtros personalizados.

AlivcLivePushCustomDetect

Callback para reconhecimento facial personalizado.

AlivcSnapshotListener

Callback para snapshots.

Integre o retoque

Importe a biblioteca de retoque e configure os callbacks para ativar o retoque.

Nota

O retoque requer uma licença para o SDK de retoque. Obtain a license for Queen SDK.

  1. Importe a biblioteca de retoque via Maven. Adicione o seguinte ao seu arquivo build.gradle. Consulte o Demo mais recente para a versão do SDK.

    implementation "com.aliyun.maliang.android:queen:2.5.0-official-full"
    implementation("com.aliyun.maliang.android:queen_menu:2.5.0-official-full") {
        exclude group: 'com.aliyun.maliang.android', module: 'queen'
    }

    Você também pode integrar o módulo LiveBeauty da demonstração:

    Arquivo ou pasta

    Descrição

    live_beauty

    A classe abstrata base para retoque.

    queen_beauty

    Controles de interface do usuário base para retoque.

  2. Obtenha a biblioteca do plug-in de retoque LiveBeauty.

    1. Use o comando clone para baixar o código da biblioteca do plug-in relacionado do caminho LiveBeauty para sua máquina local.

      git clone https://github.com/MediaBox-Demos/amdemos-android-live.git
    2. Abra a linha de comando no diretório raiz do seu projeto do Android Studio. Execute o código a seguir e, em seguida, use File > New > Import Module  para importar o módulo LiveBeauty para o seu projeto Android.

      git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***
      Nota

      No código de exemplo, */**** é um espaço reservado para o caminho do módulo LiveBeauty.

    3. No arquivo settings.gradle do projeto, adicione o caminho do módulo:

      include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'
      Nota

      No código de exemplo, "app" é o módulo principal.

    4. Além disso, no arquivo build.gradle do módulo principal do projeto, adicione uma dependência do módulo LiveBeauty:

      dependencies {
          implementation project(':LiveBeauty')
          implementation project(':LiveBeauty:live_queenbeauty')
      }
    5. Clique em File > Sync Project with Gradle Files. Após a conclusão da sincronização do Gradle, você pode usar o módulo LiveBeauty.

  3. Configure o módulo de interface do usuário do plug-in de retoque.

    1. Adicione o controle QueenBeautyMenu ao arquivo XML de layout do seu projeto. Por exemplo:

      <com.aliyunsdk.queen.menu.QueenBeautyMenu
          android:id="@+id/beauty_beauty_menuPanel"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_centerHorizontal="true" />
    2. Inicialize o QueenBeautyMenu na Activity. Por exemplo:

      // Initialize the retouching menu panel.
      QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context);
      beautyMenuPanel.onHideMenu(); 
      beautyMenuPanel.onHideValidFeatures(); 
      beautyMenuPanel.onHideCopyright(); 
      
      // Add the retouching menu to the layout.
      QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel);
      beautyBeautyContainerView.addView(beautyMenuPanel);
  4. Defina os callbacks de reconhecimento facial e retoque.

    Se você precisar integrar uma biblioteca de retoque de terceiros, defina os callbacks setCustomDetect e setCustomFilter.

    • Em customDetectProcess, o parâmetro data é um ponteiro para os dados capturados para processamento de terceiros.

    • Em customFilterProcess, o parâmetro inputTexture é a textura da imagem para processamento. Retorne o ID da textura processada ou o inputTexture original se não houver modificações.

    Código de exemplo

    /**
     * Facial recognition callback.
     */
    mAlivcLivePusher.setCustomDetect(new AlivcLivePushCustomDetect() {
        @Override
        public void customDetectCreate() {
    
        }
    
        @Override
        public long customDetectProcess(long dataPtr, int width, int height, int rotation, int format, long extra) {
            return 0;
        }
    
        @Override
        public void customDetectDestroy() {
    
        }
    });
    
    /**
     * Retouching callback.
     */
     
    /**
     * Initialize BeautyManager.
     */
    mAlivcLivePusher.setCustomFilter(new AlivcLivePushCustomFilter() {
        @Override
        public void customFilterCreate() {
            initBeautyManager();
        }
    
    /**
     * Process the ingested video stream and add retouching effects.
     */
        @Override
        public int customFilterProcess(int inputTexture, int textureWidth, int textureHeight, long extra) {
            if (mBeautyManager == null) {
                return inputTexture;
            }
    
            return mBeautyManager.onTextureInput(inputTexture, textureWidth, textureHeight);
        }
    
        @Override
        public void customFilterDestroy() {
            destroyBeautyManager();
        }
    });

Notas de uso

Item

Descrição

Regras de ofuscação

Adicione o nome do pacote do SDK à sua lista de exclusão do ProGuard para evitar problemas de ofuscação.

-keep class com.alivc.** { *;}

Sequência de chamadas de API

  • Use APIs assíncronas para evitar o bloqueio da thread principal.

  • As APIs do SDK lançam exceções em caso de erros ou ordem de chamada incorreta. Envolva as chamadas em blocos try-catch.

  • Chame as APIs na ordem mostrada no seguinte diagrama:

    image

FAQ

Por que a ingestão de stream falha?

Use o troubleshooting tool para validar sua URL de ingestão.

Como posso obter informações sobre streams ativos?

Visualize e gerencie streams ativos na página de gerenciamento de streams.

Como testo a reprodução do stream?

Teste a reprodução com um player do Alibaba Cloud, FFplay ou VLC após iniciar a ingestão. Generate ingest and streaming URLs.