Gespreksopname op de client beheren
Belangrijk
De functionaliteit die in dit artikel wordt beschreven, is momenteel beschikbaar als openbare preview. Deze preview-versie wordt geleverd zonder een service level agreement en we raden deze niet aan voor productieworkloads. Misschien worden bepaalde functies niet ondersteund of zijn de mogelijkheden ervan beperkt. Zie Aanvullende gebruiksvoorwaarden voor Microsoft Azure-previews voor meer informatie.
Met het opnemen van gesprekken kunnen uw gebruikers gesprekken opnemen die ze maken met Azure Communication Services. In dit artikel leert u hoe u opname aan de clientzijde beheert. Voordat u begint, moet u de opname aan de serverzijde instellen.
Vereisten
- Een Azure-account met een actief abonnement. Gratis een account maken
- Een geïmplementeerde Communication Services-resource. Een Communication Services-resource maken.
- Een gebruikerstoegangstoken om de aanroepende client in te schakelen. Zie Toegangstokens maken en beheren voor meer informatie.
- Optioneel: Voltooiing van de quickstart om spraakgesprekken toe te voegen aan uw toepassing.
Ondersteuning
In de volgende tabellen wordt ondersteuning voor opname in Azure Communication Services gedefinieerd.
Identiteiten en oproeptypen
In de volgende tabellen ziet u de ondersteuning van opname voor een specifiek gesprekstype en een specifieke identiteit.
Identiteiten | Teams-vergadering | Ruimte | 1:1 oproep | Groepsgesprek | 1:1 Teams-interopgesprek | Gesprek tussen Teams groeperen |
---|---|---|---|---|---|---|
Communication Services-gebruiker | ✔️ [1][2] | ✔️ [3] | ✔️ [3] | ✔️ [2][3] | ||
Microsoft 365-gebruiker | ✔️ [1][2] | ✔️ [2][3] |
[1] Deze oproeptypen ondersteunen Teams-cloud.
[2] Deze gesprekstypen ondersteunen opname van Teams-naleving.
[3] Deze gesprekstypen ondersteunen het opnemen van Azure Communication Services.
Operations
In de volgende tabellen ziet u de ondersteuning van afzonderlijke API's bij het aanroepen van SDK naar afzonderlijke identiteitstypen.
Operations | Communication Services-gebruiker | Microsoft 365-gebruiker |
---|---|---|
Melding ontvangen dat de opname is gestart of gestopt | ✔️ | ✔️ |
Status van opname ophalen | ✔️ | ✔️ |
Melding ontvangen dat opname beschikbaar is | ✔️ [1] | ✔️ [1] |
Meer informatie over of expliciete toestemming is vereist | ✔️ [2] | ✔️ [2] |
Expliciete toestemming geven voor opname | ✔️ [2] | ✔️ [2] |
[1] Een gebruiker krijgt geen melding dat de opname beschikbaar is. U kunt zich abonneren op de wijzigingsmeldingen van Microsoft Graph voor meldingen over de beschikbaarheid van Teams-cloudopnamen of u kunt zich abonneren op Microsoft.Communication.RecordingFileStatusUpdated
gebeurtenissen in Azure Communication Services om op de hoogte te worden gesteld wanneer azure Communication Services-opname beschikbaar is.
[2] Deze functionaliteit is alleen beschikbaar in Teams-vergaderingen en teams-interoperabiliteitsgesprekken.
SDK's
In de volgende tabellen ziet u ondersteuning voor opname in afzonderlijke Azure Communication Services-SDK's.
Platformen | Web | Webgebruikersinterface | iOS | iOS-gebruikersinterface | Android | Android-gebruikersinterface | Windows |
---|---|---|---|---|---|---|---|
Wordt ondersteund | ✔️ | ✔️ [1] | ✔️ [1] | ✔️ [1] | ✔️ [1] | ✔️ [1] | ✔️ [1] |
[1] Deze SDK's bieden geen ondersteuning voor expliciete toestemming.
Installeer de SDK
Gebruik de npm install
opdracht om de Common and Calling SDK voor Azure Communication Services voor JavaScript te installeren:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Vereiste objecten initialiseren
Een CallClient
exemplaar is vereist voor de meeste aanroepbewerkingen. Wanneer u een nieuw CallClient
exemplaar maakt, kunt u deze configureren met aangepaste opties, zoals een Logger
exemplaar.
Met het CallClient
exemplaar kunt u een CallAgent
exemplaar maken door het createCallAgent
aan te roepen. Deze methode retourneert asynchroon een CallAgent
exemplaarobject.
De createCallAgent
methode gebruikt CommunicationTokenCredential
als argument. Het accepteert een toegangstoken van een gebruiker.
U kunt de getDeviceManager
methode op het CallClient
exemplaar gebruiken om toegang te krijgen tot deviceManager
.
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()
Sdk-connectiviteit met Microsoft-infrastructuur het beste beheren
Het Call Agent
exemplaar helpt u bij het beheren van gesprekken (om aanroepen deel te nemen of te starten). Als u wilt werken met uw aanroepende SDK, moet u verbinding maken met de Microsoft-infrastructuur om meldingen van binnenkomende oproepen te ontvangen en andere gespreksgegevens te coördineren. Uw Call Agent
heeft twee mogelijke statussen:
Verbonden : een Call Agent
connectionStatue-waarde van Connected
het middel dat de client-SDK is verbonden en meldingen van de Microsoft-infrastructuur kan ontvangen.
Verbinding verbroken - Een Call Agent
connectionStatue-waarde van Disconnected
statussen is er een probleem dat verhindert dat de SDK verbinding maakt. Call Agent
moet opnieuw worden gemaakt.
invalidToken
: Als een token is verlopen of een ongeldig exemplaarCall Agent
wordt verbroken met deze fout.connectionIssue
: Als er een probleem is met de client die verbinding maakt met Microsoft infrascture, wordt deconnectionIssue
fout na veel nieuwe pogingenCall Agent
weergegeven.
U kunt controleren of uw lokale Call Agent
verbinding heeft met de Microsoft-infrastructuur door de huidige waarde van connectionState
de eigenschap te controleren. Tijdens een actieve oproep kunt u naar de connectionStateChanged
gebeurtenis luisteren om te bepalen of Call Agent
de status Verbonden naar Verbroken is gewijzigd.
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);
Notitie
Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Web-SDK voor aanroepen van Azure Communication Services.
Opname van cloud- en naleving
Gespreksopname is een uitgebreide functie van de kernaanroep-API. U moet eerst aanroepende functies importeren uit de Calling SDK:
import { Features} from "@azure/communication-calling";
Vervolgens kunt u het API-object van de opnamefuncties ophalen uit het aanroepexemplaren:
const callRecordingApi = call.feature(Features.Recording);
Als u wilt controleren of de oproep wordt geregistreerd, inspecteert u de isRecordingActive
eigenschap van callRecordingApi
. Het retourneert Boolean
.
const isRecordingActive = callRecordingApi.isRecordingActive;
U kunt zich ook abonneren op opnamewijzigingen:
const isRecordingActiveChangedHandler = () => {
console.log(callRecordingApi.isRecordingActive);
};
callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);
U kunt een lijst met opnamen ophalen met behulp van de recordings
eigenschap van callRecordingApi
. Het retourneert RecordingInfo[]
, die de huidige status van de cloudopname heeft.
const recordings = callRecordingApi.recordings;
recordings.forEach(r => {
console.log("State: ${r.state}");
U kunt zich ook abonneren en recordingsUpdated
een verzameling bijgewerkte opnamen ophalen. Deze gebeurtenis wordt geactiveerd wanneer er een opname-update is.
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 );
Expliciete toestemming
Wanneer uw Teams-vergadering of -oproep zodanig is geconfigureerd dat expliciete toestemming voor opname en transcriptie is vereist, moet u toestemming verzamelen van alle deelnemers aan het gesprek voordat u ze kunt opnemen. U kunt proactief toestemming geven wanneer u deelneemt aan de vergadering of reactief wanneer de opname wordt gestart. Totdat expliciete toestemming wordt gegeven, worden de audio, video en het delen van het scherm uitgeschakeld tijdens de opname.
U kunt controleren of de opname van de vergadering expliciete toestemming per eigenschap isTeamsConsentRequired
vereist. Als de waarde is ingesteld op true
, is expliciete toestemming vereist voor de call
.
const isConsentRequired = callRecordingApi.isTeamsConsentRequired;
Als u de toestemming van de gebruiker voor opname al hebt verkregen, kunt u de methode aanroepen grantTeamsConsent()
om expliciete toestemming voor de service aan te geven. Deze toestemming is alleen geldig voor één call
sessie en gebruikers moeten opnieuw toestemming geven als ze opnieuw deelnemen aan de vergadering.
callRecordingApi.grantTeamsConsent();
Pogingen om audio, video of scherm delen in te schakelen mislukken wanneer de opname actief is, is expliciete toestemming vereist, maar wordt nog niet gegeven. U kunt deze situatie herkennen door de eigenschap reason
van klasse ParticipantCapabilities
te controleren op mogelijkheden unmuteMic
turnVideoOn
en shareScreen
. U vindt deze mogelijkheden in de functie call.feature(Features.Capabilities)
. Deze mogelijkheden retourneren reden ExplicitConsentRequired
omdat gebruikers expliciete toestemming moeten geven.
Installeer de SDK
Zoek het bestand op projectniveau build.gradle
en voeg deze toe aan mavenCentral()
de lijst met opslagplaatsen onder buildscript
en allprojects
:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Voeg vervolgens in het bestand op moduleniveau build.gradle
de volgende regels toe aan de dependencies
sectie:
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
De vereiste objecten initialiseren
Als u een CallAgent
exemplaar wilt maken, moet u de createCallAgent
methode voor een CallClient
exemplaar aanroepen. Hiermee wordt asynchroon een CallAgent
exemplaarobject geretourneerd.
De createCallAgent
methode wordt CommunicationUserCredential
gebruikt als een argument, dat een toegangstoken inkapselt.
Als u toegang DeviceManager
wilt krijgen, moet u eerst een callAgent
exemplaar maken. Vervolgens kunt u de CallClient.getDeviceManager
methode gebruiken om op te halen 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();
Als u een weergavenaam voor de aanroeper wilt instellen, gebruikt u deze alternatieve methode:
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();
Oproepen opnemen
Notitie
Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Azure Communication Services-aanroepende Android SDK.
Gespreksopname is een uitgebreide functie van het kernobject Call
.
Waarschuwing
Tot versie 1.1.0 en bètaversie 1.1.0-beta.1 van de Azure Communication Services Calling Android SDK isRecordingActive
en addOnIsRecordingActiveChangedListener
deel uitmaakten van het Call
object. Voor nieuwe bètaversies zijn deze API's verplaatst als een uitgebreide functie van Call
.
U moet eerst het object voor de opnamefunctie verkrijgen:
RecordingCallFeature callRecordingFeature = call.feature(Features.RECORDING);
Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de isRecordingActive
eigenschap van callRecordingFeature
. Het retourneert boolean
.
boolean isRecordingActive = callRecordingFeature.isRecordingActive();
U kunt zich ook abonneren op opnamewijzigingen:
private void handleCallOnIsRecordingChanged(PropertyChangedEvent args) {
boolean isRecordingActive = callRecordingFeature.isRecordingActive();
}
callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);
Als u de opname vanuit uw toepassing wilt starten, volgt u eerst het overzicht van gespreksopnamen voor de stappen voor het instellen van gespreksopname.
Nadat u de oproepopname op uw server hebt ingesteld, moet u vanuit uw Android-toepassing de ServerCallId
waarde van het gesprek verkrijgen en deze vervolgens naar uw server verzenden om het opnameproces te starten. U kunt de ServerCallId
waarde vinden met behulp getServerCallId()
van de CallInfo
klasse. U vindt de CallInfo
klasse in het klasseobject met behulp van 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) {
}
Wanneer u begint met opnemen vanaf de server, wordt de gebeurtenis handleCallOnIsRecordingChanged
geactiveerd en de waarde is callRecordingFeature.isRecordingActive()
true
.
Net zoals bij het starten van de oproepopname, moet u de opname ophalen ServerCallId
en verzenden naar de opnameserver, zodat de opname kan worden gestopt:
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) {
}
Wanneer u stopt met opnemen vanaf de server, wordt de gebeurtenis handleCallOnIsRecordingChanged
geactiveerd en de waarde is callRecordingFeature.isRecordingActive()
false
.
Uw systeem instellen
Volg deze stappen om uw systeem in te stellen.
Het Xcode-project maken
Maak in Xcode een nieuw iOS-project en selecteer de sjabloon Single View-app (Toepassing met één weergave). In dit artikel wordt het SwiftUI-framework gebruikt, dus u moet taal instellen op Swift en interface instellen op SwiftUI.
U gaat geen tests maken in dit artikel. Schakel het selectievakje Inclusief tests uit.
Het pakket en afhankelijkheden installeren met CocoaPods
Maak een Podfile voor uw toepassing, zoals in dit voorbeeld:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Voer
pod install
uit.Open
.xcworkspace
met behulp van Xcode.
Toegang tot de microfoon aanvragen
Voor toegang tot de microfoon van het apparaat moet u de lijst met gegevenseigenschappen van uw app bijwerken met behulp van NSMicrophoneUsageDescription
. Stel de gekoppelde waarde in op een tekenreeks die is opgenomen in het dialoogvenster dat het systeem gebruikt om toegang van de gebruiker aan te vragen.
Klik met de rechtermuisknop op de vermelding Info.plist van de projectstructuur en selecteer Open As>Source Code. Voeg de volgende regels toe in de sectie op het hoogste niveau <dict>
en sla het bestand op.
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
Stel het app-framework in
Open het projectbestand ContentView.swift
. Voeg een import
declaratie toe aan het begin van het bestand om de AzureCommunicationCalling
bibliotheek te importeren. Daarnaast importeert u AVFoundation
. U hebt deze nodig voor audiomachtigingsaanvragen in de code.
import AzureCommunicationCalling
import AVFoundation
CallAgent initialiseren
Als u een CallAgent
exemplaar CallClient
wilt maken, moet u een callClient.createCallAgent
methode gebruiken die asynchroon een CallAgent
object retourneert nadat het is geïnitialiseerd.
Als u een aanroepclient wilt maken, geeft u een CommunicationTokenCredential
object door:
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)
}
Geef het CommunicationTokenCredential
object door waarnaar u hebt gemaakt CallClient
en stel de weergavenaam in:
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")
}
})
Oproepen opnemen
Notitie
Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Azure Communication Services-sdk die iOS aanroept.
Gespreksopname is een uitgebreide functie van het kernobject Call
.
Waarschuwing
Tot versie 1.1.0 en bètaversie 1.1.0-beta.1 van de Azure Communication Services-aanroepende iOS SDK, isRecordingActive
maakte deel uit van het Call
object en didChangeRecordingState
maakte deel uit van de CallDelegate
gemachtigde. Voor nieuwe bètaversies zijn deze API's verplaatst als een uitgebreide functie van Call
.
U moet eerst het object voor de opnamefunctie verkrijgen:
let callRecordingFeature = call.feature(Features.recording)
Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de isRecordingActive
eigenschap van callRecordingFeature
. Het retourneert Bool
.
let isRecordingActive = callRecordingFeature.isRecordingActive;
U kunt zich ook abonneren op het vastleggen van wijzigingen door de RecordingCallFeatureDelegate
gemachtigde in uw klas te implementeren met de gebeurtenis didChangeRecordingState
:
callRecordingFeature.delegate = self
// didChangeRecordingState is a member of RecordingCallFeatureDelegate
public func recordingCallFeature(_ recordingCallFeature: RecordingCallFeature, didChangeRecordingState args: PropertyChangedEventArgs) {
let isRecordingActive = recordingFeature.isRecordingActive
}
Als u de opname vanuit uw toepassing wilt starten, volgt u eerst het overzicht van gespreksopnamen voor de stappen voor het instellen van gespreksopname.
Nadat u de oproepopname op uw server hebt ingesteld, moet u vanuit uw iOS-toepassing de ServerCallId
waarde van het gesprek verkrijgen en deze vervolgens naar uw server verzenden om het opnameproces te starten. U kunt de ServerCallId
waarde vinden met behulp getServerCallId()
van de CallInfo
klasse. U vindt de CallInfo
klasse in het klasseobject met behulp van getInfo()
.
// Send serverCallId to your recording server to start the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }
Wanneer u begint met opnemen vanaf de server, wordt de gebeurtenis didChangeRecordingState
geactiveerd en de waarde is recordingFeature.isRecordingActive
true
.
Net zoals bij het starten van de oproepopname, moet u de opname ophalen ServerCallId
en verzenden naar de opnameserver, zodat de opname kan worden gestopt:
// Send serverCallId to your recording server to stop the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }
Wanneer u stopt met opnemen vanaf de server, wordt de gebeurtenis didChangeRecordingState
geactiveerd en de waarde is recordingFeature.isRecordingActive
false
.
Uw systeem instellen
Volg deze stappen om uw systeem in te stellen.
Het Visual Studio-project maken
Voor een Universeel Windows-platform-app maakt u in Visual Studio 2022 een nieuw leeg app-project (Universal Windows). Nadat u de projectnaam hebt ingevoerd, kunt u een Windows SDK kiezen die hoger is dan 10.0.17763.0.
Maak voor een WinUI 3-app een nieuw project met de sjabloon Blank App, Packaged (WinUI 3 in Desktop) om een WinUI 3-app met één pagina in te stellen. Windows-app SDK versie 1.3 of hoger is vereist.
Installeer het pakket en afhankelijkheden met behulp van NuGet Pakketbeheer
De Aanroepende SDK-API's en -bibliotheken zijn openbaar beschikbaar via een NuGet-pakket.
Het NuGet-pakket voor aanroepende SDK zoeken, downloaden en installeren:
- Open NuGet Pakketbeheer door Tools>NuGet Pakketbeheer> Manage NuGet Packages for Solution te selecteren.
- Selecteer Bladeren en voer vervolgens Azure.Communication.Calling.WindowsClient in het zoekvak in.
- Zorg ervoor dat het selectievakje Voorlopige versie opnemen is ingeschakeld.
- Selecteer het pakket Azure.Communication.Calling.WindowsClient en selecteer vervolgens Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 of een nieuwere versie.
- Schakel het selectievakje in dat overeenkomt met het Azure Communication Services-project in het rechterdeelvenster.
- Selecteer Installeren.
Oproepen opnemen
Gespreksopname is een uitgebreide functie van het kernobject Call
. U moet eerst het object voor de opnamefunctie verkrijgen:
RecordingCallFeature recordingFeature = call.Features.Recording;
Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de IsRecordingActive
eigenschap van recordingFeature
. Het retourneert boolean
.
boolean isRecordingActive = recordingFeature.IsRecordingActive;
U kunt zich ook abonneren op opnamewijzigingen:
private async void Call__OnIsRecordingActiveChanged(object sender, PropertyChangedEventArgs args)
boolean isRecordingActive = recordingFeature.IsRecordingActive;
}
recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;