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
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- Um recurso de Serviços de Comunicação implantado. Crie um recurso de Serviços de Comunicação.
- Um token de acesso de usuário para habilitar o cliente chamador. Para obter mais informações, consulte Criar e gerenciar tokens de acesso.
- Opcional: conclusão do início rápido para adicionar chamadas de voz ao seu aplicativo.
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 createCallAgent
arquivo . 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 deviceManager
o .
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álidoCall 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 tentativasCall Agent
expõe oconnectionIssue
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 );
Consentimento explícito
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
turnVideoOn
e 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 DeviceManager
o , 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 .
Instale o pacote e as dependências usando o CocoaPods
Crie um Podfile para seu aplicativo, como este exemplo:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Execute o
pod install
.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 CallClient
e 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:
- Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
- Selecione Procurar e digite Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
- Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
- 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.
- Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação do Azure no painel direito.
- 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.