Processador de mídia (iOS)

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

Você pode usar o OTPublisherKit.audioTransformers e OTPublisherKit.videoTransformers propriedades para aplicar transformadores de áudio e vídeo a um fluxo.

Importante: As transformações de mídia não são compatíveis com todos os dispositivos. Consulte requisitos do cliente.

O SDK do Vonage Video para iOS inclui duas maneiras de implementar transformadores:

Requisitos do cliente

Os transformadores da Biblioteca de Mídia da Vonage são compatíveis com o chipset Apple A11 Bionic e versões posteriores, nas seguintes combinações de dispositivos e sistemas operacionais:

Dispositivo Sistema operacional compatível
iPhone 11 e modelos posteriores iOS 13 e versões posteriores
iPad Air 4 e versões posteriores iPadOS 14.1 e versões posteriores
iPad mini de 5ª geração e versões posteriores iPadOS 14 e versões posteriores
iPad Pro de 5ª geração ou superior iPadOS 14.5 ou superior
iPhone SE de 2ª geração e versões posteriores iOS 13.4 ou superior

Teste em outros dispositivos para verificar se há compatibilidade.

Os transformadores exigem suporte adequado do processador. Mesmo em dispositivos compatíveis, os transformadores podem não funcionar de maneira estável quando processos em segundo plano limitam os recursos de processamento disponíveis. As mesmas limitações podem se aplicar a transformadores de mídia personalizados, além dos transformadores da Biblioteca de Mídia da Vonage.

O iOS pode limitar o desempenho da CPU para economizar energia (por exemplo, para prolongar a duração da bateria). Isso pode resultar em um desempenho abaixo do ideal do transformador e causar artefatos indesejados de áudio ou vídeo. Recomendamos desativar o modo de baixo consumo de energia nesses casos.

Muitas transformações de vídeo (como o desfoque do fundo) utilizam a segmentação para separar o locutor do fundo. Para obter melhores resultados, use iluminação adequada e um fundo liso. Iluminação insuficiente ou fundos complexos podem causar artefatos no vídeo (por exemplo, o locutor ou um chapéu que ele esteja usando podem ficar desfocados junto com o fundo).

Você deve realizar testes de desempenho no maior número possível de dispositivos compatíveis, independentemente da transformação.

Integração com a Biblioteca de Mídia da Vonage

Devido ao aumento significativo no tamanho ao integrar a Biblioteca de Mídia da Vonage ao SDK, a partir da versão 2.27.4 do SDK da OpenTok, os Transformadores de Mídia estão disponíveis por meio da Biblioteca de Mídia da Vonage, cuja ativação é opcional. Essa biblioteca precisa ser explicitamente adicionada ao projeto.

A Biblioteca de Mídia da Vonage foi inicialmente integrada ao SDK do OpenTok. Se a versão do seu SDK do OpenTok for anterior à 2.27.4, vá diretamente para Aplicando um transformador de vídeo da Biblioteca de Mídia da Vonage e Como aplicar um transformador de áudio da Biblioteca de Mídia da Vonage.

A Biblioteca de Mídia da Vonage pode ser integrada usando o Swift Package Manager ou o CocoaPods:

Gerenciador de Pacotes Swift

Você pode adicionar os transformadores de vídeo do VonageClientSDK incluindo o Transformadores de vídeo do Vonage Client SDK repositório como uma dependência de pacote Swift.

Para adicionar uma dependência de pacote ao seu projeto do Xcode, selecione Arquivo > Pacotes Swift > Adicionar dependência de pacote e insira a URL do repositório.

Cocoapods

A Biblioteca de Mídia da Vonage está disponível como o Pod “VonageClientSDKVideoTransformers”, para uso com CocoaPods.

ℹ️ Se uma chamada para [OTVideoTransformer initWithName:properties:] ou [OTAudioTransformer initWithName:properties:] Se a chamada for feita sem carregar a biblioteca, o transformador retornado será nulo. Será lançada uma exceção com o seguinte código de erro 0x0A000006 - OTC_MEDIA_TRANSFORMER_OPENTOK_TRANSFORMERS_LIBRARY_NOT_LOADED.

Aplicando um transformador de vídeo da Biblioteca de Mídia da Vonage

Use o [OTVideoTransformer initWithName:properties:] método para criar um transformador de vídeo que utilize um transformador nomeado da Biblioteca de Mídia da Vonage.

São suportados dois transformadores:

  • Desfoque de fundo. Para este filtro, defina o name parâmetro para "BackgroundBlur". E definir um properties parâmetro em uma string JSON. O formato do JSON é "{"radius":"None"}". Valores válidos para o radius As propriedades são “Nenhuma”, “Alta” e “Baixa”. Se você definir a radius propriedade para “Personalizado”, adicione um custom_radius propriedade na string JSON: "{"radius":"Custom","custom_radius":"value"}" (onde custom_radius é um número inteiro positivo que define o raio de desfoque).

    NSMutableArray * myVideoTransformers = [[NSMutableArray alloc] init];
    OTVideoTransformer *backgroundBlur = [[OTVideoTransformer alloc] initWithName:@"BackgroundBlur"
                                                                       properties:@"{\"radius\":\"High\"}"];
    [myVideoTransformers addObject:backgroundBlur];
    _publisher.videoTransformers = [[NSArray alloc] initWithArray:myVideoTransformers];
    
  • Substituição do plano de fundo. Para este filtro, defina o name parâmetro para "BackgroundReplacement". E definir um properties parâmetro em uma string JSON. O formato do JSON é "{"image_file_path":"caminho/para/a/imagem"}", onde image_file_path é o caminho absoluto do arquivo de uma imagem local a ser usada como plano de fundo virtual. Os formatos de imagem compatíveis são PNG e JPEG.

    NSMutableArray * myVideoTransformers = [[NSMutableArray alloc] init];
    OTVideoTransformer *backgroundReplacement = [[OTVideoTransformer alloc] initWithName:@"BackgroundReplacement"
                                                                       properties:@"{\"image_file_path\":\"path-to-image\"}];
    [myVideoTransformers addObject:backgroundReplacement];
    _publisher.videoTransformers = [[NSArray alloc] initWithArray:myVideoTransformers];
    

Como aplicar um transformador de áudio da Biblioteca de Mídia da Vonage

Use o OTAudioTransformer initWithName:properties: método para criar um transformador de vídeo que utilize um transformador nomeado da Biblioteca de Mídia da Vonage.

É compatível com um transformador:

  • Supressão de ruído. Para este filtro, defina o name parâmetro para "NoiseSuppression". Defina o properties parâmetro para uma string JSON que define as propriedades do transformador. No caso do transformador de supressão de ruído, esse JSON não inclui nenhuma propriedade no momento. Defina-o como uma string vazia "".
NSMutableArray * myAudioTransformers = [[NSMutableArray alloc] init];
OTAudioTransformer *noiseSuppression = [[OTAudioTransformer alloc] initWithName:@"NoiseSuppression"
                                                                    properties:@""];
[myAudioTransformers addObject:noiseSuppression];
_publisher.audioTransformers = [[NSArray alloc] initWithArray:myAudioTransformers];

Criação de um transformador de vídeo personalizado

Crie uma classe que implemente a OTCustomVideoTransformer protocolo. Implemente o método `[OTCustomVideoTransformer transform:]`, aplicando uma transformação ao objeto `OTVideoFrame` passado ao método. O método `[OTCustomVideoTransformer transform:]` é acionado para cada quadro de vídeo:

@interface CustomTransformer : NSObject <OTCustomVideoTransformer>

@end


@implementation CustomTransformer
- (void)transform:(nonnull OTVideoFrame *)videoFrame {
    OTPixelFormat pixelFormat = videoFrame.format.pixelFormat;
    int strides[] =
    {
        [videoFrame getPlaneStride:0],
        [videoFrame getPlaneStride:2],
        [videoFrame getPlaneStride:1]
    };
    uint8_t* planes[] =
    {
        [videoFrame getPlaneBinaryData:0],
        [videoFrame getPlaneBinaryData:2],
        [videoFrame getPlaneBinaryData:1]
    };
    [videoFrame convertInPlace:pixelFormat planes:planes strides:strides];
}
@end

Em seguida, defina o OTPublisherKit.videoTransformers propriedade a um array que inclua o objeto que implementa a interface OTCustomVideoTransformer:

CustomTransformer* myCustomTransformer;
myCustomTransformer = [CustomTransformer alloc];
OTVideoTransformer *invertColors = [[OTVideoTransformer alloc] initWithName:@"invertColors" transformer:border];

NSMutableArray * myVideoTransformers = [[NSMutableArray alloc] init];

[myVideoTransformers addObject:invertColors];

_publisher.videoTransformers = [[NSArray alloc] initWithArray:myVideoTransformers];

É possível combinar o transformador da biblioteca de mídia da Vonage (consulte a seção anterior) com transformadores personalizados ou aplicar vários transformadores personalizados, adicionando vários objetos PublisherKit.VideoTransformer à ArrayList usada para o OTPublisherKit.videoTransformers propriedade.

Criação de um transformador de áudio personalizado

Crie uma classe que implemente a OTCustomAudioTransformer protocolo. Implementar o [OTCustomAudioTransformer transform:] método, aplicando uma transformação ao OTAudioData objeto passado para o método. O [OTCustomAudioTransformer transform:] O método é acionado a cada quadro de áudio. O exemplo a seguir aplica um limitador de amplitude simples ao áudio:

@interface CustomAudioTransformer : NSObject <OTCustomAudioTransformer>

@end

@implementation CustomAudioTransformer

- (void)transform:(nonnull OTAudioData *)audioData {
    int CROP_LIMIT = 32767 * 0.05;

    int samplesPerChannel = (int)audioData.numberOfSamples * (int)audioData.numberOfChannels;
    int16_t* buffer = audioData.sampleBuffer;

    for (int s = 0; s < samplesPerChannel; ++s) {
        int sample = buffer[s];
        NSLog(@"CustomAudioTransformer. Samples %d", sample);
        if (sample > CROP_LIMIT)
            buffer[s] = CROP_LIMIT;
        else if (sample < -CROP_LIMIT)
            buffer[s] = -CROP_LIMIT;
    }
}

@end

Em seguida, defina o OTPublisherKit.audioTransformers propriedade a um array que inclua o objeto que implementa a interface CustomAudioTransformer:

CustomAudioTransformer* customAudioTransformer;
ArrayList<PublisherKit.AudioTransformer> audioTransformers = new ArrayList<>();
customAudioTransformer = [CustomAudioTransformer alloc];
OTAudioTransformer *audiotrans = [[OTAudioTransformer alloc] initWithName:@"audio"
                                                              transformer:customAudioTransformer];

NSMutableArray * myAudioTransformers = [[NSMutableArray alloc] init];
[myAudioTransformers addObject:audiotrans];
_publisher.audioTransformers = [[NSArray alloc] initWithArray:myAudioTransformers];

É possível aplicar vários transformadores personalizados adicionando vários objetos OTPublisherKit.AudioTransformer à ArrayList usada para o OTPublisherKit.audioTransformers propriedade.

Autorização de transformadores de vídeo para uma editora

Para limpar os transformadores de vídeo de um editor, defina o OTPublisherKit.videoTransformers propriedade para um array vazio.

_publisher.videoTransformers = [[NSArray alloc] init];

Autorização de transformadores de áudio para uma editora

Para limpar os transformadores de áudio de uma editora, defina o OTPublisherKit.audioTransformers propriedade para um array vazio.

_publisher.audioTransformers = [[NSArray alloc] init];

Aplicativo de exemplo

Veja esta amostra no opentok-ios-sdk-samples repositório no GitHub.