Ajustando o áudio e o vídeo — Windows
Você pode fazer ajustes de áudio e vídeo em publicado e inscrito fluxos:
- Publicação apenas de áudio ou vídeo
- Publicação em uma sessão apenas de voz
- Seleção da câmera utilizada por um editor
- Reproduzir a exibição local do vídeo de um editor
- Alteração da fonte de áudio utilizada pelos editores
- Como definir a resolução e a taxa de quadros de um vídeo
- Utilizando um capturador de vídeo personalizado
- Utilização de um driver de áudio personalizado
- Ajuste da qualidade do áudio
- Reduzindo a largura de banda de áudio com o Opus DTX
- Como ajustar o volume do áudio para um assinante
- Inscrever-se apenas para áudio ou vídeo
- Como verificar se um stream contém áudio ou vídeo
- Definição da preferência de redução da qualidade de vídeo do editor
Publicação apenas de áudio ou vídeo
Você pode ativar ou desativar o áudio e o vídeo definindo o PublishAudio e PublishVideo propriedades do objeto Publisher. Por exemplo, o código a seguir desativa o áudio:
publisher.PublishAudio = false;
Publicação em uma sessão apenas de voz
Para configurar um somente voz sessão, defina o hasVideoTrack parâmetro do Publisher() construtor para false e definir o capturer parâmetro para null 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(Context.Instance, renderer: publisherVideoRenderer, capturer: null, hasVideo: false);
Seleção da câmera utilizada por um editor
Ligue para o VideoCapturer.EnumerateDevices para obter uma lista de objetos VideoDevice, que representam os dispositivos de vídeo (geralmente câmeras) disponíveis no sistema. Em seguida, você pode usar um dos CreateVideoCapturer() métodos de um objeto VideoDevice para criar um capturador de vídeo que utilize o dispositivo como fonte de vídeo. Em seguida, você pode usar esse capturador de vídeo ao instanciar um objeto Publisher:
var devices = VideoCapturer.EnumerateDevices();
var selectedDevice = devices[0];
capturer = selectedDevice.CreateVideoCapturer(VideoCapturer.Resolution.High);
publisher = new Publisher(Context.Instance, renderer: publisherVideo, capturer: capturer);
A classe VideoDevice inclui Name e Id propriedades para identificar o dispositivo de vídeo.
Reproduzir a exibição local do vídeo de um editor
Você pode definir o MirrorOnLocalRender propriedade do objeto VideoCaptureSettings para que o vídeo renderizado localmente pelo editor seja espelhado (true) ou não (false). Defina essa propriedade na implementação do GetCaptureSettings() método do capturador de vídeo personalizado para o objeto Publisher. Consulte Utilizando 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.
Alteração da fonte de áudio utilizada pelos editores
Você pode alterar facilmente a fonte de entrada de áudio (microfone) usada pelos editores. Chame a variável estática AudioDevice.EnumerateInputAudioDevices() método para obter uma lista de objetos `AudioDevice.InputAudioDevice`, que representam os dispositivos de entrada disponíveis. Chame o AudioDevice.SetInputAudioDevice(audioInput) método para definir o dispositivo de entrada de áudio utilizado pelos editores.
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 configurando o VideoCapturer objeto que você usa quando você instanciar o objeto Publisher.
Observação: Veja o Guia para desenvolvedores sobre 1080p para considerações sobre o uso da resolução 1080p.
Existem várias maneiras de instanciar um VideoCapturer objeto. Uma delas é chamar o OpenTok.VideoCapturer.EnumerateDevices() método para obter uma lista dos dispositivos de vídeo disponíveis. Em seguida, use um dos CreateVideoCapturer() métodos do dispositivo que você selecionar para instanciar um VideoCapturer objeto. Por exemplo, o código a seguir cria um Publisher que utiliza o capturador de vídeo padrão do sistema com a resolução definida como 720p (VideoCapturer.Resolution.High) e a taxa de quadros definida em 30 quadros por segundo:
var devices = VideoCapturer.EnumerateDevices();
var selectedDevice = devices[0];
capturer = selectedDevice.CreateVideoCapturer(VideoCapturer.Resolution.High,
VideoCapturer.VideoCapturer.FrameRate.Fps30);
publisher = new Publisher(Context.Instance, renderer: publisherVideoRenderer, capturer: capturer);
Se o dispositivo de vídeo selecionado não for compatível com a resolução ou a taxa de quadros selecionada, o capturador de vídeo utilizará as configurações disponíveis mais próximas.
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.
Utilizando um capturador de vídeo personalizado
Use VideoCapturer.EnumerateDevices() para obter uma lista dos dispositivos de vídeo disponíveis (câmeras). Use um dos CreateVideoCapturer() métodos da classe VideoDevice para instanciar um objeto VideoCapturer com base no dispositivo de vídeo.
O SDK do OpenTok para Windows inclui uma interface IVideoCapturer que você pode usar para definir um capturador de vídeo personalizado. Crie classes personalizadas que implementem a interface IVideoCapturer para criar um capturador de vídeo personalizado. Passe uma instância da classe do capturador de vídeo personalizado para o Publisher()instanciar o objeto Publisher.
O SDK do OpenTok para Windows chama a função Start(IVideoFrameConsumer frameConsumer) método do objeto capturador de vídeo para iniciar a captura de vídeo a partir do capturador de vídeo personalizado. O SDK inclui uma interface IVideoFrameConsumer que define o consumidor de quadros de vídeo para um capturador personalizado.
O SDK do OpenTok para Windows chama a função Consume(VideoFrame frame) método do objeto consumidor de quadros de vídeo personalizado quando há um novo quadro de vídeo a ser renderizado. A classe `VideoFrame`, definida no SDK do OpenTok para Windows, representa o quadro de vídeo.
Você pode usar um capturador de vídeo personalizado para publicar uma transmissão de compartilhamento de tela. Para obter mais informações e ver um exemplo de código, 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 Windows utiliza o microfone do dispositivo para capturar áudio a ser transmitido a um stream publicado. Além disso, ele utiliza os alto-falantes (ou fones de ouvido) para reproduzir o áudio de um stream assinado. É possível implementar um driver de áudio personalizado para ler e gravar dados de áudio para assinantes e emissores. Crie uma implementação do IAudioDevice interface e seus métodos. A IAudioDevice.InitAudio(AudioDevice.AudioBus audioBus) O método é chamado quando o AudioDevice é inicializado. Use o AudioBus objeto, passado para esse método, para ler e gravar dados de áudio, com seu ReadRenderData(buffer, numberOfSamples) e WriteCaptureData(buffer, numberOfSamples) métodos.
Além disso, você pode implementar o IAudioDeviceExtension interface. Quando um CustomAudioDevice que implementa essa interface é atribuído por meio de AudioDevice.SetCustomAudioDevice(), a implementação inclui métodos adicionais (para enumerar dispositivos, selecionar um dispositivo específico ou assinar notificações), que devem ser vinculados internamente à implementação personalizada do dispositivo de áudio, em vez da implementação estática padrão.
A classe MMAudioDevice, incluída no SDK, implementa essa interface utilizando a interface mmdeviceapi.h do Windows:
readonly MMAudioDevice audioDevice;
...
audioDevice = new MMAudioDevice(dispatcher);
AudioDevice.SetCustomAudioDevice(context, audioDevice);
/* Subscribe to notifications: */
audioDevice.InputDeviceAdded += AudioInputDeviceAdded;
audioDevice.InputDeviceRemoved += AudioInputDeviceRemoved;
audioDevice.DefaultInputDeviceChanged += AudioDefaultInputDeviceChanged;
/* Alternatively, you can use the following code to subscribe to
notifications and yield the same result: */
AudioDevice.Notifications notifications = new AudioDevice.Notifications(dispatcher);
notifications.InputDeviceAdded += AudioInputDeviceAdded;
notifications.InputDeviceRemoved += AudioInputDeviceRemoved;
notifications.DefaultInputDeviceChanged += AudioDefaultInputDeviceChanged;
/* Call methods */
audioDevice.SetInputAudioDevice(myInputAudioDevice.Id);
/* Alternatively, you can use the static methods in AudioDevice and yield the same result: */
AudioDevice.SetInputAudioDevice(myInputAudioDevice);
Ajuste da qualidade do áudio
O Publisher.Builder Essa classe inclui propriedades para ajustar a qualidade do áudio. Isso permite que você publique transmissões que utilizem áudio de alta qualidade (ou de qualidade inferior):
Taxa de bits de áudio (Número) — A taxa de bits desejada para o áudio publicado, em bits por segundo. O intervalo de valores aceito é 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).
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)
Se você não definir essa opção, o OpenTok definirá automaticamente a taxa de bits de áudio para a transmissão.
Controle Automático de Ganho (Booleano) — Se o controle automático de ganho deve ser ativado para o áudio publicado. Você pode definir esse parâmetro como false ao publicar áudio de alta qualidade (configurando o AutoGainControl propriedade do Publisher.Builder). O valor padrão é true. Essa configuração é ignorada se você definir DisableAudioProcessing para true (o que desativa o cancelamento de eco, o controle automático de ganho e a supressão de ruído para a transmissão publicada).
DesativarProcessamentoDeÁudio (Booleano) — Indica se o cancelamento de eco, o controle automático de ganho e a supressão de ruído devem ser desativados para o áudio transmitido. Você pode definir esse parâmetro como true ao publicar áudio de alta qualidade (configurando o DisableAudioProcessing propriedade do Publisher.Builder). O valor padrão é false.
Cancelamento de eco (Booleano) — Se o cancelamento de eco deve ser ativado para o áudio transmitido. Você pode definir esse parâmetro como false ao publicar áudio de alta qualidade (configurando o EchoCancellation propriedade do Publisher.Builder). O valor padrão é true. Essa configuração é ignorada se você definir DisableAudioProcessing para true (o que desativa o cancelamento de eco, o controle automático de ganho e a supressão de ruído para a transmissão publicada).
Estéreo (Booleano) — Indica se o áudio estéreo deve ser publicado. O valor padrão é false.
Supressão de ruído (Booleano) — Se a supressão de ruído deve ser ativada para o áudio publicado. Você pode definir esse parâmetro como false ao publicar áudio de alta qualidade (configurando o NoiseSuppression propriedade do Publisher.Builder). O valor padrão é true. Essa configuração é ignorada se você definir DisableAudioProcessing para true (o que desativa o cancelamento de eco, o controle automático de ganho e a supressão de ruído para a transmissão publicada).
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 definir o OpusDtx propriedade do Publisher.Builder objeto que você usa quando Criação de um editor) para true.
Para mais informações, consulte isto 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.AudioVolume propriedade.
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 configurando o SubscribeToAudio propriedade do objeto Subscriber:
subscriber.SubscribeToAudio = false; // audio off
subscriber.SubscribeToAudio = true; // audio on
Para ativar ou desativar o vídeo, basta definir o SubscribeToVideo propriedade do objeto Subscriber:
subscriber.SubscribeToVideo = false; // video off
subscriber.SubscribeToVideo = 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 definir SubscribeToVideo para true 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 propriedades de um objeto Stream para verificar se ele contém áudio ou vídeo
if (!stream.HasAudio) {
// You may want to adjust the user interface
}
if (!stream.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
publisher.DegradationPreference = DegradationPreference.NotSet;
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
publisher.DegradationPreference = DegradationPreference.MaintainFrameRateAndResolution;
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
publisher.DegradationPreference = DegradationPreference.MaintainFrameRate;
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
publisher.DegradationPreference = DegradationPreference.MaintainResolution;
O motor de vídeo não reduzirá a resolução, mas poderá reduzir a taxa de quadros, se necessário.
Equilibrado
publisher.DegradationPreference = DegradationPreference.Balanced;
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.