Partilhar via


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

Suporte

As tabelas a seguir definem o suporte à gravação nos Serviços de Comunicação do Azure.

Identidades e tipos de chamada

As tabelas a seguir mostram o suporte de gravação para tipo de chamada e identidade específicos.

Identidades Reunião de equipas Sala Chamada 1:1 Chamada em grupo Chamada de interoperabilidade 1:1 das equipes Chamada de interoperabilidade de equipes de grupo
Utilizador dos Serviços de Comunicação ✔️ [1] ✔️ [2] ✔️ [2] ✔️ [2] ✔️ [1] ✔️ [1][2]
Utilizador do Microsoft 365 ✔️ [1] ✔️ [2] ✔️ [1] ✔️ [1][2]

[1] Estes tipos de chamada suportam a nuvem do Teams e o registo de conformidade.
[2] Estes tipos de chamada suportam a gravação dos Serviços de Comunicação do Azure.

Operações

As tabelas a seguir mostram o suporte de APIs individuais na chamada do SDK para tipos de identidade individuais.

Operações Utilizador dos Serviços de Comunicação Utilizador do Microsoft 365
Receber notificação de que a gravação começou ou parou ✔️ ✔️
Obter estado de gravação ✔️ ✔️
Receber notificação de que a gravação está disponível ✔️ [1] ✔️ [1]
Saiba se é necessário consentimento explícito ✔️ [2] ✔️ [2]
Dar consentimento explícito para ser gravado ✔️ [2] ✔️ [2]

[1] O utilizador não é notificado de que a gravação está disponível. Você pode obter a gravação na nuvem do Teams por meio da API do Microsoft Graph. Você pode assinar a notificação nos Serviços de Comunicação do Azure quando a gravação estiver disponível.

[2] Esta funcionalidade está disponível apenas em reuniões do Teams e chamadas de interoperabilidade do Teams em grupo.

SDKs

As tabelas a seguir mostram o suporte à gravação em SDKs individuais dos Serviços de Comunicação do Azure.

Plataformas Web IU da Web iOS Interface do usuário do iOS Android Interface do usuário do Android Windows
É suportado ✔️ ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1]

[1] Estes SDKs não suportam consentimento explícito.

Instale o SDK

Use o npm install comando para instalar o SDK 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. Ao criar uma nova CallClient instância, você pode configurá-la com opções personalizadas, como uma Logger instância.

Com a CallClient instância, você pode criar uma CallAgent instância chamando o createCallAgentarquivo . 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()

Como gerenciar melhor a conectividade do SDK com a infraestrutura da Microsoft

A Call Agent instância ajuda você a gerenciar chamadas (para ingressar ou iniciar chamadas). Para funcionar, seu SDK de chamada precisa se conectar à infraestrutura da Microsoft para receber notificações de chamadas recebidas e coordenar outros detalhes da chamada. O seu Call Agent tem dois estados possíveis:

Conectado - Um Call Agent valor connectionStatue significa que o SDK do Connected cliente está conectado e é capaz de receber notificações da infraestrutura da Microsoft.

Desconectado - Um Call Agent valor connectionStatue de Disconnected estados há um problema que está impedindo o SDK de se conectar corretamente. Call Agent devem ser recriados.

  • invalidToken: Se um token expirou ou é inválido Call Agent , a instância se desconecta com esse erro.
  • connectionIssue: Se houver um problema com o cliente se conectando à infrascture da Microsoft, depois de muitas tentativas Call Agent expõe o connectionIssue erro.

Você pode verificar se seu local Call Agent está conectado à infraestrutura da Microsoft inspecionando o valor atual da connectionState propriedade. Durante uma chamada ativa, você pode ouvir o connectionStateChanged evento para determinar se Call Agent muda do estado Conectado para Desconectado.

const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'

const connectionStateCallback = (args) => {
    console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
    // it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);

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 );

Quando sua reunião ou chamada do Teams é configurada para exigir consentimento explícito para gravação e transcrição, é necessário coletar o consentimento de todos os participantes da chamada antes de gravá-los. Você pode fornecer consentimento de forma proativa ao ingressar na reunião ou reativamente quando a gravação for iniciada. Até que o consentimento explícito seja dado, o áudio, o vídeo e o compartilhamento de tela dos participantes serão desativados durante a gravação.

Você pode verificar se a gravação da reunião requer consentimento explícito por propriedade isTeamsConsentRequired. Se o valor for definido como true, é necessário o consentimento explícito para o call.

const isConsentRequired = callRecordingApi.isTeamsConsentRequired;

Se você já obteve o consentimento do usuário para gravação, você pode chamar grantTeamsConsent() o método para indicar consentimento explícito para o serviço. Esse consentimento é válido apenas para uma call sessão e os usuários precisam fornecer consentimento novamente se voltarem a participar da reunião.

callRecordingApi.grantTeamsConsent();

As tentativas de ativar o compartilhamento de áudio, vídeo ou tela falham quando a gravação está ativa, o consentimento explícito é necessário, mas ainda não foi dado. Você pode reconhecer essa situação verificando a propriedade reason da classe ParticipantCapabilities para recursos unmuteMic turnVideoOne shareScreen. Você pode encontrar esses recursos no recurso call.feature(Features.Capabilities). Esses recursos retornariam a razão ExplicitConsentRequired , pois os usuários precisam fornecer consentimento explícito.

Instale o SDK

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

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

Em seguida, no arquivo de nível build.gradle de 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 isRecordingActive addOnIsRecordingActiveChangedListener 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

Siga estes passos para configurar o seu sistema.

Criar o projeto Xcode

No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este artigo usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interface como SwiftUI.

Você não vai criar testes neste artigo. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .

Captura de tela que mostra a janela para criar um projeto no 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. Defina o valor associado para uma cadeia de caracteres 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 do ContentView.swift seu projeto. Adicione uma import declaração à parte superior do arquivo para importar a AzureCommunicationCalling biblioteca. Além disso, importe AVFoundation. Você precisa 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

Siga estes passos para configurar o seu sistema.

Criar o projeto do Visual Studio

Para um aplicativo da Plataforma Universal do Windows, 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.

Para 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 digite 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 pacote Azure.Communication.Calling.WindowsClient e, em seguida, selecione Azure.Communication.Calling.WindowsClient 1.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 do Azure no painel direito.
  6. Selecione 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