Ajustando o áudio e o vídeo — Android

Você pode fazer ajustes de áudio e vídeo em publicado e inscrito fluxos:

Publicação apenas de áudio ou vídeo

Você pode ativar ou desativar o áudio e o vídeo chamando a função setPublishAudio() e setPublishVideo() métodos do objeto Publisher (passando um valor booleano). Por exemplo, o código a seguir desativa o áudio:

mPublisher.setPublishAudio(false);

Publicação em uma sessão apenas de voz

Para configurar um somente voz sessão, chame o videoTrack() método do objeto Publisher.Builder, passando false, quando você instanciar cada objeto Publisher na sessão. Por exemplo, o código a seguir cria um emissor para uma sessão apenas de voz:

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .videoTrack(false)
  .build();

Seleção da câmera utilizada por um editor

É possível alternar entre as câmeras usadas para publicar uma transmissão chamando a função cycleCamera() método do objeto Publisher:

mPublisher.cycleCamera();

Se você estiver usando um capturador de vídeo personalizado, utilize o BaseVideoCapturer.CaptureSwitch interface para definir o comportamento do Publisher.cycleCamera() método.

Espelhar a exibição local do vídeo de um editor

Você pode definir o mirrorInLocalRender propriedade do objeto CaptureSettings retornada pela chamada à função getCaptureSettings() método do capturer propriedade de um objeto PublisherKit. Defina-a como true para que o vídeo gerado localmente pela editora seja espelhado ou para false para que a imagem não seja espelhada. Talvez você queira espelhar o vídeo ao usar a câmera frontal.

Você também pode definir o mirrorInLocalRender propriedade do objeto CaptureSettings ao criar um capturador de vídeo personalizado.

Essa configuração afeta apenas o vídeo renderizado no aplicativo cliente do editor. Ela não tem efeito sobre o vídeo nos clientes assinantes.

O capturador integrado do Publisher exibe o vídeo renderizado localmente invertido quando se usa a câmera frontal, mas não quando se usa a câmera traseira.

Detectar quando a câmera do editor muda

Quando a câmera utilizada pelo Editor muda, o changedCamera(Publisher publisher, int newCameraId)) é chamado o método do objeto Publisher.CameraListener.

@Override
public void changedCamera(publisher, newCameraId) {
    //The publisher's camera changed.
}

Como definir a resolução e a taxa de quadros de um vídeo

É possível definir a resolução e a taxa de quadros da transmissão de um editor chamando a função resolution() e frameRate() métodos do objeto Publisher.Builder quando você instanciar o objeto Publisher:

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .resolution(CameraCaptureResolution.HIGH)
  .frameRate(CameraCaptureFrameRate.FPS_30)
  .build();

Observe que, nas sessões que utilizam o OpenTok Media Router (sessões com o modo de mídia (configurado como “routed”), reduzir a taxa de quadros diminui proporcionalmente a largura de banda utilizada pela transmissão. No entanto, em sessões em que o modo de mídia está configurado como “relayed”, reduzir a taxa de quadros não diminui a largura de banda da transmissão.

Observação: Veja o Guia para desenvolvedores sobre 1080p para considerações sobre o uso da resolução 1080p.

Ativando a lanterna da câmera

Ligue para o Publisher.setCameraTorch() método para ativar ou desativar o flash da câmera (lanterna) durante a gravação de vídeo:

Publisher publisher = new Publisher.Builder(MainActivity.this).build();
  // ...
  publisher.setCameraTorch(true);

O valor padrão é false (a lanterna não é usada).

Observe que nem todas as câmeras dos dispositivos possuem flash. Se a câmera ativa não for compatível com a funcionalidade de flash (por exemplo, a câmera frontal normalmente não é compatível), a chamada a este método não terá efeito.

Ajustando o zoom da câmera

Ligue para o Publisher.setCameraZoomFactor() método para definir a taxa de zoom (fator) da câmera:

Publisher publisher = new Publisher.Builder(MainActivity.this).build();
  // ...
  publisher.setCameraZoomFactor(0.7);

O valor da relação/fator varia de 0,5 até o fator de zoom máximo. Valores entre 0,5 e 1,0 representam a ultra-grande angular (zoom out), e valores entre 1,0 e o fator de zoom máximo representam o zoom in. O fator de zoom efetivamente aplicado é limitado ao intervalo suportado pela configuração da câmera ativa — se a câmera não suportar a ultra-grande angular, os fatores de zoom definidos abaixo de 1,0 não terão efeito e nenhum zoom será aplicado. Para valores acima do fator de zoom máximo suportado pela câmera, o fator de zoom será definido como o valor máximo suportado.

Utilizando um capturador de vídeo personalizado

As classes Publisher implementam um capturador de vídeo padrão que utiliza o vídeo diretamente da câmera do dispositivo. Você pode usar as classes do PublisherKit para implementar um capturador de vídeo personalizado.

O SDK do OpenTok para Android inclui uma classe chamada `BaseVideoCapturer`. Sobrescreva essa classe para criar um capturador de vídeo personalizado. Chame o capturer() método do objeto Publisher.Builder quando você instanciar o objeto Publisher:

// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .capturer(mCapturer)
  .build();

Ou, se você estiver usando a classe PublisherKit para definir uma implementação personalizada do publisher, pode definir o capturer propriedade de uma classe que estende a classe PublisherKit:

// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher.capturer = mCapturer;

O getCaptureSettings() O método da classe `BaseVideoCapturer` retorna as configurações do capturador de vídeo, incluindo a taxa de quadros, largura, altura, atraso de vídeo e formato de vídeo do capturador. Seu objeto capturador de vídeo pode sobrescrever esse método para definir as configurações personalizadas do seu capturador de vídeo, conforme mostrado a seguir:

@Override
public CaptureSettings getCaptureSettings() {
    // Set the preferred capturing size
    configureCaptureSize(640, 480);

    CaptureSettings settings = new CaptureSettings();
    settings.fps = mCaptureFPS;
    settings.width = mCaptureWidth;
    settings.height = mCaptureHeight;
    settings.format = NV21;
    settings.expectedDelay = 0;
    return settings;
}

Ligue para o startCapture() método do objeto capturador de vídeo para iniciar a captura de vídeo a partir do capturador de vídeo personalizado.

A classe `BaseVideoCapturer` também inclui um provideByteArrayFrame(byte[] data, int format, int width, int height, int rotation, boolean mirrorX) e provideIntArrayFrame(int[] data, int format, int width, int height, int rotation, boolean mirrorX). Você chama esses métodos para fornecer um quadro de vídeo na forma de uma matriz de bytes ou de uma matriz de inteiros.

Como exemplo, consulte a classe OpenTokVideoCapturer no aplicativo de exemplo OpenTokHelloWorld.

Use um capturador de vídeo personalizado para publicar uma transmissão de compartilhamento de tela. Para obter mais informações, consulte Compartilhamento de tela.

Você também pode usar um renderizador de vídeo personalizado para vídeos.

Utilização de um driver de áudio personalizado

Por padrão, o SDK do OpenTok para Android usa o microfone do dispositivo para capturar áudio e transmiti-lo a um stream publicado. Além disso, ele usa os alto-falantes (ou fones de ouvido) para reproduzir o áudio de um stream assinado. Crie uma classe que estenda a BaseAudioDevice, definida no SDK do OpenTok para Android:

public class CustomAudioDevice extends BaseAudioDevice

Em seguida, chame o AudioDeviceManager.setAudioDevice() método para configurar o aplicativo para usar uma instância da classe do dispositivo de áudio para capturar e reproduzir amostras de áudio:

AudioDeviceManager.setAudioDevice(customAudioDevice);

A classe BaseAudioDevice possui um getAudioBus() método que retorna um objeto AudioBus, definido no SDK do OpenTok para Android. O AudioBus possui um readRenderData() método para ler amostras de áudio de fluxos de áudio assinados. E possui um a writeCaputureData() método para fornecer amostras de áudio ao fluxo de áudio do editor.

Para ver exemplos, consulte os exemplos Basic-Audio-Driver e Advanced-Audio-Driver no exemplos-do-SDK-de-vídeo-da-Vonage-para-Android repositório no GitHub).

Aplicação de transformações de áudio e vídeo a fluxos publicados

Você pode usar transformadores pré-criados da biblioteca do Vonage Media Processor ou criar seu próprio transformador personalizado de áudio ou vídeo para aplicar ao vídeo publicado. Consulte esse assunto.

Ajuste da qualidade do áudio

Para ajustar a qualidade do áudio em uma transmissão de um editor, podem ser utilizadas as seguintes abordagens:

Para ajustar a taxa de bits de áudio de uma transmissão de um editor, é preciso chamar a função audioBitrate() método do PublisherKit.Builder objeto que você usa para instanciar um Publisher.
A taxa de bits desejada para o áudio transmitido, em bits por segundo. O intervalo de valores suportado é de 6.000 a 510.000. (Valores inválidos são ignorados.) Defina esse valor para ativar o áudio de alta qualidade (ou para reduzir o uso de largura de banda com áudio de qualidade inferior). Se você não definir essa opção, o OpenTok atribui automaticamente uma taxa de bits de áudio para a transmissão.

A seguir, apresentamos as configurações recomendadas:

  • 8.000 – 12.000 para voz em banda estreita (NB)
  • 16.000 – 20.000 para fala em banda larga (WB)
  • 28.000 – 40.000 para fala em banda completa (FB)
  • 48.000 a 64.000 para música com banda completa (FB)

Como definir o modo de saída de áudio para uma sessão de voz

Por padrão, o SDK do OpenTok para Android utiliza o alto-falante do aparelho (em vez do alto-falante do fone de ouvido) para reproduzir áudio. Isso é preferível para aplicativos que incluem vídeo e áudio. No entanto, em um sessão apenas de voz, é preferível que o áudio seja reproduzido pelo alto-falante do fone de ouvido. Você pode fazer com que o aplicativo faça isso executando a seguinte chamada:

AudioDeviceManager.getAudioDevice().setOutputMode(
    OutputMode.Handset);

Reduzindo a largura de banda de áudio com o Opus DTX

Opus DTX (Transmissão Discontínua) é um codec de áudio capaz de reduzir o uso de largura de banda quando um participante não está falando. Isso pode ser útil em sessões grandes com muitos participantes de áudio. Para ativar o Opus DTX, basta chamar a função enableOpusDtx() método do PublisherKit.Builder objeto que você usa para instanciar um Publisher. Para mais informações, consulte este Artigo da base de conhecimento da Video API da Vonage.

Como ajustar o volume do áudio para um assinante

Você pode ajustar individualmente o volume do áudio para cada assinante ligando para o Subscriber.setAudioVolume() método.

Inscrever-se apenas para áudio ou vídeo

Por padrão, um objeto Subscriber é inicializado para assinar áudio e vídeo, caso estejam disponíveis.

Você pode ativar ou desativar o áudio chamando a função setSubscribeToAudio() método do objeto Subscriber:

mSubscriber.setSubscribeToAudio(false); // audio off
mSubscriber.setSubscribeToAudio(true);  // audio on

Para ativar ou desativar o vídeo, basta chamar a função setSubscribeToVideo() método do objeto Subscriber:

mSubscriber.setSubscribeToVideo(false); // video off
mSubscriber.setSubscribeToVideo(true);  // video on

Observe, no entanto, que só é possível assinar o áudio ou o vídeo se o cliente que está transmitindo a transmissão incluir áudio ou vídeo. Por exemplo, ao chamar subscribeToVideo(false) não terá efeito se o cliente que está transmitindo o stream estiver transmitindo apenas áudio.

Como verificar se um stream contém áudio ou vídeo

Você pode verificar o hasAudio() e hasVideo() métodos de um objeto Stream para verificar se ele contém áudio ou vídeo

if (!mStream.hasAudio()) {
	// You may want to adjust the user interface
}
if (!mStream.hasVideo()) {
	// You may want to adjust the user interface
}

Por exemplo, quando você inscrever-se em um canal, talvez seja interessante ajustar a interface do usuário dependendo se a transmissão contém áudio ou vídeo. Por exemplo, talvez seja interessante indicar ao usuário se uma transmissão contém áudio ou não; ou talvez não seja desejável exibir a visualização do assinante caso a transmissão não contenha vídeo.

Definição da preferência de redução da qualidade de vídeo do editor

Quando a largura de banda ou a CPU estão limitadas, o mecanismo de vídeo pode reduzir a taxa de quadros e/ou a resolução do vídeo do editor para se adaptar a essas limitações.

A preferência de degradação é uma configuração que permite ajustar esse comportamento.

Os desenvolvedores são responsáveis por definir e aplicar as preferências de degradação de acordo com seu caso de uso e requisitos.

Isso funciona como uma preferência, o que significa que o mecanismo de vídeo tentará seguir a preferência selecionada, mas não há garantias quanto ao resultado.

Essa preferência pode se comportar de maneira diferente ao usar vídeo escalável, onde o mecanismo de vídeo pode optar por remover camadas em vez de reduzir a resolução.

Dica de conteúdo e a preferência de degradação têm finalidades diferentes, mas relacionadas: a dica de conteúdo descreve o tipo de conteúdo que está sendo transmitido, enquanto a preferência de degradação controla a estratégia de codificação. Ao definir uma dica de conteúdo, o mecanismo de vídeo determina automaticamente a preferência de degradação adequada (por exemplo, “texto” seleciona automaticamente a manutenção da resolução). Uma preferência de degradação definida explicitamente substituirá essa seleção automática.

Você pode definir esse valor usando qualquer uma das opções fornecidas DegradationPreference valores:

Não definido

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceNotSet);

O valor padrão. O mecanismo de vídeo determinará a preferência ideal de redução de qualidade.

Manter a taxa de quadros e a resolução

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRateAndResolution);

O motor de vídeo tentará manter a taxa de quadros estável e não reduzir a resolução.

Manter a taxa de quadros

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRate);

O motor de vídeo tentará manter a taxa de quadros estável, mas poderá reduzir a resolução, se necessário.

Manter a resolução

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainResolution);

O motor de vídeo não reduzirá a resolução, mas poderá reduzir a taxa de quadros, se necessário.

Equilibrado

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceBalanced);

O motor de vídeo tentará encontrar um equilíbrio entre a redução da resolução e da taxa de quadros, quando necessário.