Ajustando o áudio e o vídeo — iOS

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 configurando o publishAudio e publishVideo propriedades. Por exemplo, o código a seguir desativa o áudio:

publisher.publishAudio = NO;

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

Para configurar um somente voz sessão, defina o videoTrack propriedade do objeto OTPublisherSettings para NO quando você inicializar cada objeto OTPublisher na sessão. Por exemplo, o código a seguir cria um emissor para uma sessão apenas de voz:

OTPublisherSettings *_publisherSettings = [[OTPublisherSettings alloc] init];
_publisherSettings.videoTrack = NO;
_publisher = [[OTPublisher alloc]
              initWithDelegate:self
              settings:_publisherSettings];

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

Você pode especificar (ou alterar) a câmera usada para publicar uma transmissão:

publisher.cameraPosition = AVCaptureDevicePositionFront; // front camera
publisher.cameraPosition = AVCaptureDevicePositionBack; // back camera

Observe que o cameraPosition A propriedade não está disponível na classe OTPublisherKit. Se você estiver usando a classe OTPublisherKit para implementar um capturador de vídeo personalizado, você pode definir a câmera a ser usada no código personalizado de captura de vídeo.

Detectar quando a câmera do editor muda

Quando a câmera usada para publicar uma transmissão é alterada, o delegado do editor envia um [OTPublisher publisher:didChangeCameraPosition:] mensagem:

- (void)publisher:(OTPublisher *)publisher didChangeCameraPosition:(AVCaptureDevicePosition)position
{
    if (position == AVCaptureDevicePositionFront) {
        // front camera
    } else {
        // back camera
    }
}

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 cameraResolution e cameraFrameRate propriedades do objeto OTPublisherSettings que você passa para o [OTPublisher initWithDelegate:settings:] método:

OTPublisherSettings *_publisherSettings = [[OTPublisherSettings alloc] init];
_publisherSettings.cameraResolution = OTCameraCaptureResolutionHigh;
_publisherSettings.cameraFrameRate = OTCameraCaptureFrameRate30FPS;
_publisher = [[OTPublisher alloc]
              initWithDelegate:self
              settings:_publisherSettings];

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

Use o cameraTorch Propriedade “publisher” para ativar ou desativar o flash da câmera (lanterna) durante a gravação de vídeo:

OTPublisherSettings *settings = [[OTPublisherSettings alloc] init];
// ...
_publisher = [[OTPublisher alloc] initWithDelegate:self settings:settings];
// ...
_publisher.cameraTorch = YES;

O valor padrão é NO (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

Use o cameraZoomFactor propriedade “publisher” para definir a taxa de zoom (fator) da câmera:

OTPublisherSettings *settings = [[OTPublisherSettings alloc] init];
// ...
_publisher = [[OTPublisher alloc] initWithDelegate:self settings:settings];
// ...
_publisher.cameraZoomFactor = 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

A classe OTPublisher captura vídeo de uma câmera no dispositivo iOS. Você pode usar a API de fluxo de vídeo personalizado para definir um capturador de vídeo personalizado, utilizando as classes OTPublisherKit e OTVideoCapture. Para ver um exemplo, consulte o exemplo “Projeto 2: Vamos criar o OTPublisher” no diretório de exemplos do SDK do OpenTok para iOS (ou em exemplos-do-opentok-ios-sdk repositório no GitHub).

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 iOS usa o microfone do dispositivo para capturar áudio e transmiti-lo a um stream publicado. E usa os alto-falantes (ou fones de ouvido) para reproduzir o áudio de um stream assinado. Chame a função [OTAudioDeviceManager setAudioDevice:] método para configurar um driver de áudio personalizado para capturar e reproduzir amostras de áudio:

myAudioDevice = [[MyAudioDevice alloc] init];
[OTAudioDeviceManager setAudioDevice:_myAudioDevice];

Ligar [OTAudioDeviceManager setAudioDevice:] antes de inicializar um objeto OTSession. Chame o [OTAudioDevice setAudioBus:] método para definir um objeto de barramento de áudio. Esse objeto, definido pelo protocolo OTAudioBus, possui um [OTAudioBus writeCaptureData:numberOfSamples:] método e um [OTAudioBus readRenderData:numberOfSamples:] método. Esses métodos são chamados quando amostras de áudio são disponibilizadas para gravação no fluxo de áudio do editor ou para leitura dos fluxos assinados.

Como exemplo, consulte o exemplo “Projeto 7: Dispositivo de áudio externo” no diretório de exemplos do SDK do OpenTok para iOS (ou no exemplos-do-opentok-ios-sdk 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:

Taxa de bits de áudio como um configurações do editor

@property (nonatomic) int audioBitrate

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)

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 enableOpusDtx propriedade do OTPublisherKitSettings objeto que você passa para o [OTPublisherKit initWithDelegate:settings:] método (quando Criação de um editor). 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 configurando o OTSubscriberKit.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.

Quando você inscrever-se em um canal, você pode especificar se deseja se inscrever inicialmente no áudio ou no vídeo (se estiverem disponíveis). Por exemplo, o código a seguir se inscreve apenas no fluxo de áudio:

_subscriber = [[OTSubscriber alloc]
                initWithStream:stream delegate:self];
_subscriber.subscribeToAudio = NO;

Depois de criar um objeto Subscriber, você ativa ou desativa o áudio chamando o método subscribeToAudio() método do objeto Subscriber:

_subscriber.subscribeToAudio = NO; // audio off
_subscriber.subscribeToAudio = YES; // audio on

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

subscriber.subscribeToVideo = NO; // video off
subscriber.subscribeToVideo = YES; // 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

Por padrão, um objeto Subscriber reproduz tanto o áudio quanto o vídeo (se estiverem disponíveis). É possível verificar se um stream possui áudio ou vídeo (se o emissor do stream estiver transmitindo áudio ou vídeo) verificando o hasAudio e hasVideo propriedades do objeto Stream:

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 OTDegradationPreference valores:

Não definido

_publisher.degradationPreference = OTDegradationPreferenceNotSet;

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 = OTDegradationPreferenceMaintainFrameRateAndResolution;

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 = OTDegradationPreferenceMaintainFrameRate;

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 = OTDegradationPreferenceMaintainResolution;

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

Equilibrado

_publisher.degradationPreference = OTDegradationPreferenceBalanced;

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.