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 SurfaceattachDevice(...)
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
-
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 aSurfaceSource
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 aSurface
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 CMSampleBuffers
manualmente. 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
-
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 utilizaAVCaptureSession
para capturar uma imagem da câmera do dispositivo, processa a imagem usando uma implementação CIFilter e enviaCMSampleBuffers
paracustomSource
para transmissão ao vivo.