SDK de Transmissão do IVS: fontes de imagens personalizadas | Streaming de baixa latência - Amazon IVS

SDK de Transmissão do IVS: fontes de imagens personalizadas | Streaming de baixa latência

Este guia presume que você já esteja familiarizado com a operação de configuração de uma sessão de transmissão (Android, iOS) e saiba como usar a API do mixer.

As fontes de entrada de imagem personalizada permitem que uma aplicação forneça a própria entrada de imagem para o SDK de Transmissão, em vez de ficar limitada a câmeras predefinidas ou ao compartilhamento de tela. Uma fonte de imagem personalizada pode ser algo tão simples quanto uma marca d'água semitransparente ou cena estática de “volto logo”, ou pode permitir que a aplicação realize um processamento personalizado adicional, como a adição de filtros de beleza à câmera.

Você pode ter várias fontes de imagem personalizada, como uma marca d'água e uma câmera com filtros de beleza. Quando você usa uma fonte de entrada de imagem personalizada para o controle personalizado da câmera (p. ex., o uso de bibliotecas de filtro de beleza que exigem acesso à câmera), o SDK de Transmissão deixa de ser o responsável pelo gerenciamento da câmera. Em vez disso, a aplicação fica responsável por processar corretamente o ciclo de vida da câmera. Consulte a documentação oficial da plataforma sobre como sua aplicação deve gerenciar a câmera.

Android

Após criar uma sessão de transmissão, crie uma fonte de entrada de imagem:

SurfaceSource surfaceSource = broadcastSession.createImageInputSource();

Esse método retorna uma SurfaceSource, que é uma fonte de imagem corroborada por uma classe padrão Surface do Android. Ela é automaticamente anexada à sessão de transmissão, logo, não é necessário usar o método attachDevice(...) posteriormente. No entanto, a SurfaceSource precisa estar vinculada a um slot; isso é abordado mais abaixo. É possível redimensionar e girar SurfaceSource. Você também pode criar uma ImagePreviewView para exibir uma prévia de seu conteúdo.

Para recuperar a Surface subjacente:

Surface surface = surfaceSource.getInputSurface();

Essa Surface pode ser usada como o buffer de saída para produtores de imagens como Camera2, OpenGL ES e outras bibliotecas. O caso de uso mais simples é desenhar diretamente um bitmap estático ou uma cor na tela da Surface. No entanto, muitas bibliotecas (como bibliotecas de filtro de beleza) fornecem um método que permite que uma aplicação especifique uma Surface externa para renderização. Você pode usar tal método a fim de passar essa Surface para a biblioteca de filtros, permitindo que a biblioteca produza quadros processados para a sessão de transmissão transmitir.

Por fim, a SurfaceSource deve estar vinculada a um Mixer.Slot para ser transmitido pela sessão de transmissão:

broadcastSession.getMixer().bind(surfaceSource, "customSlot");

O código de exemplo do Android tem vários exemplos que usam uma fonte de imagem personalizada de maneiras diferentes:

  • Uma marca d'água semitransparente é adicionada a MixerActivity.

  • Um arquivo MP4 é colocado em loop na MixerActivity.

  • A classe de utilitário CameraNager faz o gerenciamento personalizado da câmera do dispositivo usando o método Camera2 em CustomActivity, que aplica um filtro sépia simples. Esse exemplo é especialmente útil, pois mostra como gerenciar a câmera e passar a SurfaceSource personalizada da sessão de transmissão para a solicitação de captura da câmera. Se você usar outras bibliotecas externas, confira na documentação delas como configurar a biblioteca de modo a direcionar a saída para a Surface do Android fornecida pela sessão de transmissão.

iOS

Após criar a sessão de transmissão, crie uma fonte de entrada de imagem:

let customSource = broadcastSession.createImageSource(withName: "customSourceName")

Esse método retorna uma IVSCustomImageSource, que é uma fonte de imagem que permite que a aplicação envie CMSampleBuffersmanualmente. Para obter os formatos de pixel compatíveis, consulte a Referência do iOS Broadcast SDK; um link para a versão mais atual está disponível nas Notas de lançamento do Amazon IVS para a versão mais recente do Broadcast SDK. A fonte não é anexada automaticamente à sessão de transmissão, portanto, você deve anexar a fonte da imagem à sessão e vinculá-la a um slot antes que a fonte seja transmitida:

broadcastSession.attach(customSource, toSlotWithName: "customSourceSlot", onComplete: nil)

Após anexar e vincular a fonte personalizada, a aplicação poderá enviar CMSampleBuffers diretamente para a fonte personalizada. Você pode optar por usar o retorno de chamada onComplete para começar a fazer isso.

As amostras enviadas para a fonte personalizada serão transmitidas na sessão de transmissão:

customSource.onSampleBuffer(sampleBuffer)

Para transmissão de vídeo, use esse método em um retorno de chamada. Por exemplo, se estiver usando a câmera, sempre que um novo buffer de amostra for recebido de uma AVCaptureSession, a aplicação pode encaminhar o buffer de amostra para a fonte de imagem personalizada. Se desejar, a aplicação pode aplicar processamento adicional (como um filtro de beleza) antes de enviar a amostra para a fonte de imagem personalizada.

Para uma imagem estática, após a primeira amostra, a aplicação precisará reenviar a amostra se a vinculação de slot da fonte de imagem personalizada for alterada ou se a fonte for desvinculada e reanexada à sessão de transmissão. Por exemplo, se você remover o slot e depois adicionar o slot ao mixer, será necessário reenviar a amostra.

O código de exemplo do iOS tem vários exemplos que usam uma fonte de imagem personalizada de maneiras diferentes:

  • Uma marca d'água semitransparente é adicionada em MixerViewController.

  • Um arquivo MP4 é colocado em loop em MixerViewController.

  • Uma implementação CIFilter com uma câmera de dispositivo foi adicionada em CustomSourcesViewController. Isso permite que uma aplicação gerencie uma câmera de dispositivo independentemente do SDK do Amazon IVS Broadcast. Ela utiliza AVCaptureSession para capturar uma imagem da câmera do dispositivo, processa a imagem usando uma implementação CIFilter e envia CMSampleBuffers para customSource para transmissão ao vivo.