Gerenciar a gravação de chamadas no cliente

Importante

A funcionalidade descrita neste artigo está atualmente em visualização pública. Esta versão de pré-visualização é fornecida sem um contrato de nível de serviço e não a recomendamos para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

A gravação de chamadas permite que seus usuários gravem chamadas que eles fazem com os Serviços de Comunicação do Azure. Neste artigo, você aprenderá a gerenciar a gravação no lado do cliente. Antes de começar, você precisa configurar a gravação no lado do servidor.

Pré-requisitos

Instale o SDK

Use o npm install comando para instalar os SDKs de Chamada e Comum dos Serviços de Comunicação do Azure para JavaScript:

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

Inicializar objetos necessários

Uma CallClient instância é necessária para a maioria das operações de chamada. Aqui, você cria uma nova CallClient instância. Você pode configurá-lo com opções personalizadas, como uma Logger instância.

Quando você tem uma CallClient instância, você pode criar uma CallAgent instância chamando o createCallAgent método na CallClient instância. Esse método retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método usa CommunicationTokenCredential como argumento. Ele aceita um token de acesso de usuário.

Você pode usar o getDeviceManager método na CallClient instância para acessar deviceManagero .

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Nota

Esta API é fornecida como uma pré-visualização para programadores e pode mudar com base nos comentários que recebemos. Não use essa API em um ambiente de produção. Para usar essa API, use a versão beta do SDK da Web de Chamada dos Serviços de Comunicação do Azure.

Gravação na nuvem

A gravação de chamadas é um recurso estendido da API de chamada principal. Primeiro, você precisa importar recursos de chamada do SDK de chamada:

import { Features} from "@azure/communication-calling";

Em seguida, você pode obter o objeto API dos recursos de gravação da instância de chamada:

const callRecordingApi = call.feature(Features.Recording);

Para verificar se a chamada está sendo gravada, inspecione a isRecordingActive propriedade de callRecordingApi. Ele retorna Boolean.

const isRecordingActive = callRecordingApi.isRecordingActive;

Também pode subscrever alterações de gravação:

const isRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

Você pode obter uma lista de gravações usando a recordings propriedade de callRecordingApi. Ele retorna RecordingInfo[], que tem o estado atual da gravação na nuvem.

const recordings = callRecordingApi.recordings;

recordings.forEach(r => {
    console.log("State: ${r.state}");

Você também pode se inscrever recordingsUpdated e obter uma coleção de gravações atualizadas. Esse evento é acionado sempre que há uma atualização de gravação.

const cloudRecordingsUpdatedHandler = (args: { added: SDK.RecordingInfo[], removed: SDK.RecordingInfo[]}) => {
                        console.log('Recording started by: ');
                        args.added?.forEach(a => {
                            console.log('State: ${a.state}');
                        });

                        console.log('Recording stopped by: ');
                        args.removed?.forEach(r => {
                            console.log('State: ${r.state}');
                        });
                    };
callRecordingApi.on('recordingsUpdated', cloudRecordingsUpdatedHandler );

Instale o SDK

Localize seu arquivo build.gradle no nível do projeto e adicione mavenCentral() à lista de repositórios em buildscript e allprojects:

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

Em seguida, no arquivo build.gradle no nível do módulo, adicione as seguintes linhas à dependencies seção :

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Inicializar os objetos necessários

Para criar uma CallAgent instância, você precisa chamar o createCallAgent método em uma CallClient instância. Essa chamada retorna de forma assíncrona um objeto de CallAgent instância.

O createCallAgent método toma CommunicationUserCredential como um argumento, que encapsula um token de acesso.

Para acessar DeviceManagero , você deve criar uma callAgent instância primeiro. Então você pode usar o CallClient.getDeviceManager método para obter DeviceManager.

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

Para definir um nome de exibição para o chamador, use este método alternativo:

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

Gravar chamadas

Nota

Esta API é fornecida como uma pré-visualização para programadores e pode mudar com base nos comentários que recebemos. Não use essa API em um ambiente de produção. Para usar essa API, use a versão beta do SDK do Azure Communication Services Calling Android.

A gravação de chamadas é um recurso estendido do objeto principal Call .

Aviso

Até a versão 1.1.0 e a versão beta 1.1.0-beta.1 do SDK do Azure Communication Services Calling Android faziam isRecordingActiveaddOnIsRecordingActiveChangedListener parte do Call objeto. Para novas versões beta, essas APIs foram movidas como um recurso estendido do Call.

Primeiro, você precisa obter o objeto de recurso de gravação:

RecordingCallFeature callRecordingFeature = call.feature(Features.RECORDING);

Em seguida, para verificar se a chamada está sendo gravada, inspecione a isRecordingActive propriedade de callRecordingFeature. Ele retorna boolean.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

Também pode subscrever alterações de gravação:

private void handleCallOnIsRecordingChanged(PropertyChangedEvent args) {
  boolean isRecordingActive = callRecordingFeature.isRecordingActive();
}

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

Se você quiser começar a gravar a partir do seu aplicativo, primeiro siga a visão geral da gravação de chamadas para as etapas para configurar a gravação de chamadas.

Depois de configurar a gravação de chamadas no seu servidor, a partir do seu aplicativo Android, você precisa obter o ServerCallId valor da chamada e, em seguida, enviá-lo para o seu servidor para iniciar o processo de gravação. Você pode encontrar o ServerCallId valor usando getServerCallId() a CallInfo classe . Você pode encontrar a CallInfo classe no objeto de classe usando getInfo().

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to start the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

Quando você inicia a gravação a partir do servidor, o evento handleCallOnIsRecordingChanged é acionado e o valor de callRecordingFeature.isRecordingActive() é true.

Assim como iniciar a gravação da chamada, se você quiser parar a gravação da chamada, você precisa obter ServerCallId e enviá-lo para o seu servidor de gravação para que ele possa parar a gravação:

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to stop the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

Quando você para de gravar a partir do servidor, o evento handleCallOnIsRecordingChanged é acionado e o valor de callRecordingFeature.isRecordingActive() é false.

Configure o seu sistema

Criar o projeto Xcode

No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este início rápido usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interfacecomo SwiftUI.

Você não vai criar testes durante este início rápido. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .

Screenshot that shows the window for creating a project within Xcode.

Instale o pacote e as dependências usando o CocoaPods

  1. Crie um Podfile para seu aplicativo, como este exemplo:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Execute o pod install.

  3. Abra .xcworkspace usando o Xcode.

Solicitar acesso ao microfone

Para acessar o microfone do dispositivo, você precisa atualizar a lista de propriedades de informações do seu aplicativo usando NSMicrophoneUsageDescription. Você define o valor associado para uma cadeia de caracteres que será incluída na caixa de diálogo que o sistema usa para solicitar acesso do usuário.

Clique com o botão direito do mouse na entrada Info.plist da árvore do projeto e selecione Abrir como>código-fonte. Adicione as seguintes linhas na secção de nível <dict> superior e, em seguida, guarde o ficheiro.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Configurar a estrutura do aplicativo

Abra o arquivo ContentView.swift do seu projeto. Adicione uma import declaração à parte superior do arquivo para importar a AzureCommunicationCalling biblioteca. Além disso, importe AVFoundation. Você precisará dele para solicitações de permissão de áudio no código.

import AzureCommunicationCalling
import AVFoundation

Inicializar o CallAgent

Para criar uma CallAgent instância a partir do CallClient, você precisa usar um callClient.createCallAgent método que retorna de forma assíncrona um CallAgent objeto depois que ele é inicializado.

Para criar um cliente de chamada, passe um CommunicationTokenCredential objeto:

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

Passe o CommunicationTokenCredential objeto que você criou para CallCliente defina o nome para exibição:

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

Gravar chamadas

Nota

Esta API é fornecida como uma pré-visualização para programadores e pode mudar com base nos comentários que recebemos. Não use essa API em um ambiente de produção. Para usar essa API, use a versão beta do SDK do iOS de Chamada dos Serviços de Comunicação do Azure.

A gravação de chamadas é um recurso estendido do objeto principal Call .

Aviso

Até a versão 1.1.0 e a versão beta 1.1.0-beta.1 do SDK do Azure Communication Services Calling iOS, isRecordingActive fazia parte do Call objeto e didChangeRecordingState fazia parte do CallDelegate delegado. Para novas versões beta, essas APIs foram movidas como um recurso estendido do Call.

Primeiro, você precisa obter o objeto de recurso de gravação:

let callRecordingFeature = call.feature(Features.recording)

Em seguida, para verificar se a chamada está sendo gravada, inspecione a isRecordingActive propriedade de callRecordingFeature. Ele retorna Bool.

let isRecordingActive = callRecordingFeature.isRecordingActive;

Você também pode se inscrever para gravar alterações implementando o RecordingCallFeatureDelegate delegado em sua classe com o evento didChangeRecordingState:

callRecordingFeature.delegate = self

// didChangeRecordingState is a member of RecordingCallFeatureDelegate
public func recordingCallFeature(_ recordingCallFeature: RecordingCallFeature, didChangeRecordingState args: PropertyChangedEventArgs) {
    let isRecordingActive = recordingFeature.isRecordingActive
}

Se você quiser começar a gravar a partir do seu aplicativo, primeiro siga a visão geral da gravação de chamadas para as etapas para configurar a gravação de chamadas.

Depois de configurar a gravação de chamadas no seu servidor, a partir do seu aplicativo iOS, você precisa obter o ServerCallId valor da chamada e, em seguida, enviá-lo para o seu servidor para iniciar o processo de gravação. Você pode encontrar o ServerCallId valor usando getServerCallId() a CallInfo classe . Você pode encontrar a CallInfo classe no objeto de classe usando getInfo().

// Send serverCallId to your recording server to start the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

Quando você inicia a gravação a partir do servidor, o evento didChangeRecordingState é acionado e o valor de recordingFeature.isRecordingActive é true.

Assim como iniciar a gravação da chamada, se você quiser parar a gravação da chamada, você precisa obter ServerCallId e enviá-lo para o seu servidor de gravação para que ele possa parar a gravação:

// Send serverCallId to your recording server to stop the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

Quando você para de gravar a partir do servidor, o evento didChangeRecordingState é acionado e o valor de recordingFeature.isRecordingActive é false.

Configure o seu sistema

Criar o projeto do Visual Studio

Para um aplicativo UWP, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal Windows ). Depois de inserir o nome do projeto, sinta-se à vontade para escolher qualquer SDK do Windows posterior a 10.0.17763.0.

Para um aplicativo WinUI 3, crie um novo projeto com o modelo Aplicativo em branco, empacotado (WinUI 3 na área de trabalho) para configurar um aplicativo WinUI 3 de página única. É necessário o SDK de Aplicativos Windows versão 1.3 ou posterior.

Instalar o pacote e as dependências usando o Gerenciador de Pacotes NuGet

As APIs e bibliotecas do SDK de chamada estão disponíveis publicamente por meio de um pacote NuGet.

As etapas a seguir exemplificam como localizar, baixar e instalar o pacote NuGet do SDK de chamada:

  1. Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
  2. Selecione Procurar e, em seguida, introduza Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
  3. Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
  4. Selecione o Azure.Communication.Calling.WindowsClient pacote e, em seguida, selecione Azure.Communication.Calling.WindowsClient1.4.0-beta.1 ou uma versão mais recente.
  5. Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação na guia do lado direito.
  6. Selecione o botão Instalar .

Gravar chamadas

A gravação de chamadas é um recurso estendido do objeto principal Call . Primeiro, você precisa obter o objeto de recurso de gravação:

RecordingCallFeature recordingFeature = call.Features.Recording;

Em seguida, para verificar se a chamada está sendo gravada, inspecione a IsRecordingActive propriedade de recordingFeature. Ele retorna boolean.

boolean isRecordingActive = recordingFeature.IsRecordingActive;

Também pode subscrever alterações de gravação:

private async void Call__OnIsRecordingActiveChanged(object sender, PropertyChangedEventArgs args)
  boolean isRecordingActive = recordingFeature.IsRecordingActive;
}

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

Registo da conformidade

A gravação de conformidade é uma gravação baseada na política do Microsoft Teams. Você pode habilitá-lo usando este tutorial: Introdução à gravação baseada em políticas do Teams para chamadas.

A gravação baseada em políticas é iniciada automaticamente quando um usuário que tem a política ingressa em uma chamada. Para obter uma notificação dos Serviços de Comunicação do Azure sobre a gravação, use o seguinte código:

const callRecordingApi = call.feature(Features.Recording);

const isComplianceRecordingActive = callRecordingApi.isRecordingActive;

const isComplianceRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isComplianceRecordingActiveChangedHandler);

Você também pode implementar a gravação de conformidade usando um bot de gravação personalizado. Veja o exemplo do GitHub.

Próximos passos