Multipart: Inscreva-se em todas as transmissões remotas
Cada cliente remoto aparece como um Stream. Implementar onStreamReceived / onStreamDropped:
- Para cada novo fluxo, crie um
Subscriber, ligue parasession.subscribe(subscriber), em seguida, anexesubscriber.viewpara um célula dedicada no seu layout.
Este exemplo utiliza um número fixo de vagas (maxSubscribers): matrizes paralelas para Subscriber?, IDs de stream opcionais e FrameLayout? células. O próximo índice livre recebe o novo participante; se todas as vagas estiverem ocupadas, ignore ou substitua de acordo com as regras do seu produto.
private val maxSubscribers = 4
private val subscribers = arrayOfNulls<Subscriber>(maxSubscribers)
private val subscriberContainers = arrayOfNulls<FrameLayout>(maxSubscribers)
private val subscriberStreamIds = arrayOfNulls<String>(maxSubscribers)
override fun onStreamReceived(session: Session, stream: Stream) {
val subscriber = Subscriber.Builder(this@MainActivity, stream).build()
session.subscribe(subscriber)
addSubscriber(subscriber)
}
private fun addSubscriber(subscriber: Subscriber) {
val index = subscribers.indexOfFirst { it == null }
if (index == -1) {
Toast.makeText(
this,
"New subscriber ignored, maxSubscribers limit reached",
Toast.LENGTH_LONG
).show()
return
}
subscribers[index] = subscriber
subscriberStreamIds[index] = subscriber.stream.streamId
subscriber.setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL)
subscriber.subscribeToAudio = true
runOnUiThread {
subscriberContainers[index]?.removeAllViews()
subscriberContainers[index]?.addView(subscriber.view)
}
subscriberAudioEnabled[index] = true
subscriberVisible[index] = true
}
- Quando um stream terminar, remova a exibição desse assinante e libere o espaço.
override fun onStreamDropped(session: Session, stream: Stream) {
val index = subscriberStreamIds.indexOfFirst { it == stream.streamId }
if (index == -1) return
val subscriber = subscribers[index] ?: return
runOnUiThread {
subscriberContainers[index]?.removeView(subscriber.view)
}
subscribers[index] = null
subscriberStreamIds[index] = null
subscriberVisible[index] = false
subscriberAudioEnabled[index] = true
}
Alternar o áudio do controle remoto com subscriber.subscribeToAudio = enabled. Alterne sua saída de áudio e vídeo com publisher.publishAudio / publisher.publishVideo.
Demolir de forma organizada
Ao sair, cancelar inscrição cada assinante, retirar do ar a editora, então session.disconnect(). Isso evita o vazamento de sessões e o bloqueio de câmeras e microfones em alguns dispositivos.
Multipartidário simples
Aprenda a usar o SDK do Vonage para Android em chamadas com vários participantes. O aplicativo transmite áudio e vídeo a partir de um dispositivo e pode se conectar a vários assinantes.