Esta página descreve como usar a API Co-Watching para dar suporte a uma para assistir em grupo.
Configuração inicial
Para preparar a biblioteca para uso, o aplicativo de compartilhamento ao vivo precisa inicializar um
CoWatchingClient
objeto que representa uma sessão de assistir em grupo.
Para usar o SDK de compartilhamento ao vivo do Meet, chame o método
AddonClientFactory.getClient
. Isso retorna uma
AddonClient
que serve como ponto de entrada para a sessão de assistir em grupo.
Para usar o cliente, chame o método
newSessionBuilder
do AddonClient
para retornar um builder para uma nova
AddonSession
O newSessionBuilder
implementa o
AddonSessionHandler
para lidar com os retornos de chamada fornecidos pelo
para a sessão.
Para iniciar uma sessão, adicione o
withCoWatching
no builder.
O exemplo de código a seguir mostra uma inicialização básica do cliente de "Assistir em grupo" objeto:
Java
class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}
// For sample implementation, see the "Manage remote state" section below.
class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {}
public ListenableFuture<AddonSession> initialSetup() {
AddonClient meetClient = AddonClientFactory.getClient();
return meetClient
.newSessionBuilder(
new AwesomeVideoAddonSessionHandler())
.withCoWatching(new AwesomeVideoCoWatchingHandler())
.begin();
}
Notificar sobre ações do usuário
Quando o usuário local realiza ações, como pausar ou buscar a mídia no dispositivo. A biblioteca deve ser informada para que essas ações possam ser para outros participantes da experiência de assistir em grupo. Para um exemplo de como notificar a biblioteca para vários estados, consulte Receber iniciado.
Use estes métodos para controlar o estado "Assistir em grupo":
CoWatchingClient.notifyBuffering
: Notifica o Meet de que a mídia não está pronta para ser reproduzida devido a em buffer, devido a uma mudança de mídia anterior, busca de mídia ou tráfego congestionamento.CoWatchingClient.notifyEnded
: Notifica o Meet de que o player de mídia chegou ao fim a mídia atual.CoWatchingClient.notifyPauseState
Informar ao Meet que o usuário pausou ou retomou a reprodução de mídia, para que o Meet possa espelhar essa ação para outros usuários.CoWatchingClient.notifyPlayoutRate
: Notifica o Meet que o usuário atualizou a taxa de reprodução de a mídia para um novo valor (por exemplo, 1,25x).CoWatchingClient.notifyQueueUpdate
: Notifica o Meet de que a fila foi alterada. Assim, O Meet pode espelhar essa informação para os outros usuários.CoWatchingClient.notifyReady
: Notifica o Meet de que o armazenamento em buffer foi concluído e a mídia foi está pronto para ser reproduzido, começando no carimbo de data/hora fornecido.CoWatchingClient.notifySeekToTimestamp
: Notifica o Meet que o usuário buscou o ponto de reprodução de a mídia, para que o Meet espelhe essa ação para outros usuários.CoWatchingClient.notifySwitchedToMedia
: Notifica o Meet de que o usuário trocou de mídia. Por isso, O Meet pode repassar essas informações para outros usuários. Também tem uma opção para atualização simultânea da fila.
O exemplo de código a seguir mostra como notificar os usuários:
Java
public void onVideoPaused(Duration currentTimestamp) {
// Use Meet to broadcast the pause state to ensure other participants also pause.
this.session.getCoWatching().notifyPauseState(/* paused= */ true, currentTimestamp);
};
Gerenciar estado remoto
Para aplicar as atualizações recebidas de participantes remotos, você precisa oferecer
Conheça uma forma de gerenciar diretamente o estado de transmissão da mídia local usando
as
CoWatchingHandler.onCoWatchingStateChanged()
o retorno de chamada.
O Meet também precisa recuperar a posição atual da mídia
de repente chamando
CoWatchingHandler.onStateQuery()
o retorno de chamada. Ele é chamado regularmente, por isso precisa ser escrito para ter um bom desempenho.
(por exemplo, <100ms).
O exemplo de código a seguir mostra uma implementação da
CoWatchingHandler
:
Java
class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {
/** Applies incoming playback state to the local video. */
public void onCoWatchingStateChanged(CoWatchingState newState) {
// Handle transition to new video.
if (!newState.mediaId().equals(this.videoPlayer.videoUrl)) {
this.videoPlayer.loadVideo(newState.mediaId());
}
// Only adjust the local video playout if it's sufficiently diverged from the timestamp in the
// applied update.
if (newState
.mediaPlayoutPosition()
.minus(this.videoPlayer.videoTimestamp)
.compareTo(Duration.ofMillis(500))
> 0) {
this.videoPlayer.seek(newState.mediaPlayoutPosition());
}
// Update pause state, if necessary.
if (newState.playbackState().equals(PLAY) && this.videoPlayer.isPaused) {
this.videoPlayer.unpause();
} else if (newState.playbackState().equals(PAUSE) && !this.videoPlayer.isPaused) {
this.videoPlayer.pause();
}
}
/** Returns local video playback state. */
public Optional<QueriedCoWatchingState> onStateQuery() {
return Optional.of(QueriedCoWatchingState.of(
/* mediaPlayoutPosition= */ this.videoPlayer.videoTimestamp));
}
}