Delen via


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

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 createCallAgentaan 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 exemplaar Call Agent wordt verbroken met deze fout.
  • connectionIssue: Als er een probleem is met de client die verbinding maakt met Microsoft infrascture, wordt de connectionIssue fout na veel nieuwe pogingen Call 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 );

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 isTeamsConsentRequiredvereist. 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 turnVideoOnen 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 DeviceManagerwilt 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.

Schermopname van het venster voor het maken van een project in Xcode.

Het pakket en afhankelijkheden installeren met CocoaPods

  1. 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
    
  2. Voer pod install uit.

  3. 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 CallClientwilt 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 CallClienten 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:

  1. Open NuGet Pakketbeheer door Tools>NuGet Pakketbeheer> Manage NuGet Packages for Solution te selecteren.
  2. Selecteer Bladeren en voer vervolgens Azure.Communication.Calling.WindowsClient in het zoekvak in.
  3. Zorg ervoor dat het selectievakje Voorlopige versie opnemen is ingeschakeld.
  4. Selecteer het pakket Azure.Communication.Calling.WindowsClient en selecteer vervolgens Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 of een nieuwere versie.
  5. Schakel het selectievakje in dat overeenkomt met het Azure Communication Services-project in het rechterdeelvenster.
  6. 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;

Volgende stappen