Dela via


Hantera samtalsinspelning på klienten

Viktigt!

Funktioner som beskrivs i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Med samtalsinspelning kan användarna spela in samtal som de gör med Azure Communication Services. I den här artikeln får du lära dig hur du hanterar inspelning på klientsidan. Innan du börjar måste du konfigurera inspelning på serversidan.

Förutsättningar

Support

Följande tabeller definierar stöd för inspelning i Azure Communication Services.

Identiteter och anropstyper

Följande tabeller visar stöd för inspelning för specifik samtalstyp och identitet.

Identiteter Teams-möte Rum 1:1 samtal Gruppsamtal 1:1 Teams interop-samtal Grupp teams-interop-anrop
Communication Services-användare ✔️ [1][2] ✔️ [3] ✔️ [3] ✔️ [2][3]
Microsoft 365-användare ✔️ [1][2] ✔️ [2][3]

[1] Dessa samtalstyper stöder Teams-molnet. [2] Dessa samtalstyper stöder Teams efterlevnadsinspelning.
[3] Dessa samtalstyper stöder Azure Communication Services-inspelning.

Operations

Följande tabeller visar stöd för enskilda API:er vid anrop av SDK till enskilda identitetstyper.

Operations Communication Services-användare Microsoft 365-användare
Få meddelande om att inspelningen har startats eller stoppats ✔️ ✔️
Hämta inspelningstillstånd ✔️ ✔️
Få meddelande om att inspelningen är tillgänglig ✔️ [1] ✔️ [1]
Lär dig om uttryckligt medgivande krävs ✔️ [2] ✔️ [2]
Ge uttryckligt medgivande för att registreras ✔️ [2] ✔️ [2]

[1] En användare meddelas inte om att inspelningen är tillgänglig. Du kan prenumerera på Microsoft Graphs ändringsmeddelanden för meddelanden om tillgänglighet för Teams-molninspelning eller prenumerera på Microsoft.Communication.RecordingFileStatusUpdated händelser i Azure Communication Services för att meddelas när Azure Communication Services-inspelning är tillgänglig.

[2] Den här funktionen är endast tillgänglig i Teams-möten och teamsamverkansanrop.

SDK:er

Följande tabeller visar stöd för inspelning i enskilda Azure Communication Services-SDK:er.

Plattformar Webb Webbgränssnitt iOS iOS-användargränssnitt Android Android-användargränssnitt Windows
Stöds ✔️ ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1] ✔️ [1]

[1] Dessa SDK:er stöder inte uttryckligt medgivande.

Installera SDK:n

npm install Använd kommandot för att installera Azure Communication Services Common och Calling SDK för JavaScript:

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

Initiera nödvändiga objekt

En CallClient instans krävs för de flesta anropsåtgärder. När du skapar en ny CallClient instans kan du konfigurera den med anpassade alternativ som en Logger instans.

Med instansen CallClient kan du skapa en CallAgent instans genom att anropa createCallAgent. Den här metoden returnerar asynkront ett CallAgent instansobjekt.

Metoden createCallAgent använder CommunicationTokenCredential som argument. Den accepterar en användaråtkomsttoken.

Du kan använda getDeviceManager metoden på instansen CallClient för att få åtkomst deviceManagertill .

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

Så här hanterar du SDK-anslutning till Microsoft-infrastruktur på bästa sätt

Instansen Call Agent hjälper dig att hantera anrop (för att ansluta eller starta samtal). För att kunna arbeta måste din anropande SDK ansluta till Microsofts infrastruktur för att få meddelanden om inkommande samtal och samordna annan samtalsinformation. Du Call Agent har två möjliga tillstånd:

Ansluten – Ett Call Agent connectionStatue-värde Connected innebär att klient-SDK:t är anslutet och kan ta emot meddelanden från Microsofts infrastruktur.

Frånkopplad – Ett Call Agent connectionStatue-värde för Disconnected tillstånd det finns ett problem som hindrar SDK:n från att ansluta korrekt. Call Agent ska återskapas.

  • invalidToken: Om en token har upphört att gälla eller om en ogiltig Call Agent instans kopplas från med det här felet.
  • connectionIssue: Om det finns ett problem med att klienten ansluter till Microsoft-infrastrukturen, efter att många återförsök Call Agent har exponerat connectionIssue felet.

Du kan kontrollera om din lokala Call Agent är ansluten till Microsofts infrastruktur genom att granska det aktuella värdet för connectionState egenskapen. Under ett aktivt anrop kan du lyssna på connectionStateChanged händelsen för att avgöra om Call Agent det ändras från Anslutet till frånkopplat tillstånd.

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

Kommentar

Det här API:et tillhandahålls som en förhandsversion för utvecklare och kan ändras baserat på feedback som vi får. Använd inte det här API:et i en produktionsmiljö. Om du vill använda det här API:et använder du betaversionen av Azure Communication Services Calling Web SDK.

Inspelning av moln och efterlevnad

Samtalsinspelning är en utökad funktion i kärn-API:et för samtal. Du måste först importera samtalsfunktioner från Calling SDK:

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

Sedan kan du hämta inspelningsfunktionernas API-objekt från anropsinstansen:

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

Om du vill kontrollera om anropet registreras kontrollerar du isRecordingActive egenskapen callRecordingApiför . Den returnerar Boolean.

const isRecordingActive = callRecordingApi.isRecordingActive;

Du kan också prenumerera på inspelningsändringar:

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

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

Du kan hämta en lista över inspelningar med hjälp recordings av callRecordingApiegenskapen . Den returnerar RecordingInfo[], som har det aktuella tillståndet för molninspelningen.

const recordings = callRecordingApi.recordings;

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

Du kan också prenumerera recordingsUpdated på och få en samling uppdaterade inspelningar. Den här händelsen utlöses när det finns en inspelningsuppdatering.

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

När ditt Teams-möte eller -samtal har konfigurerats för att kräva uttryckligt medgivande för inspelning och transkription måste du samla in medgivande från alla deltagare i samtalet innan du kan registrera dem. Du kan ge medgivande proaktivt när du ansluter till mötet eller reaktivt när inspelningen startar. Tills uttryckligt medgivande ges inaktiveras deltagarnas ljud-, video- och skärmdelning under inspelningen.

Du kan kontrollera om mötesinspelningen kräver uttryckligt medgivande av egenskapen isTeamsConsentRequired. Om värdet är inställt på truekrävs uttryckligt medgivande för call.

const isConsentRequired = callRecordingApi.isTeamsConsentRequired;

Om du redan har fått användarens medgivande för inspelning kan du anropa grantTeamsConsent() metoden för att ange uttryckligt medgivande till tjänsten. Det här medgivandet är endast giltigt för en call session och användarna måste ge sitt medgivande igen om de ansluter till mötet igen.

callRecordingApi.grantTeamsConsent();

Försök att aktivera ljud-, video- eller skärmdelning misslyckas när inspelningen är aktiv, explicit medgivande krävs men ges ännu inte. Du kan identifiera den här situationen genom att kontrollera egenskapen reason för klassen ParticipantCapabilities för funktioner turnVideoOnoch shareScreenunmuteMic . Du hittar dessa funktioner i funktionen call.feature(Features.Capabilities). Dessa funktioner skulle returnera orsak ExplicitConsentRequired eftersom användarna behöver ge uttryckligt medgivande.

Installera SDK:n

Leta upp filen på projektnivå build.gradle och lägg till mavenCentral() i listan med lagringsplatser under buildscript och allprojects:

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

Lägg sedan till följande rader i modulnivåfilen build.gradle i dependencies avsnittet:

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

Initiera nödvändiga objekt

Om du vill skapa en CallAgent instans måste du anropa createCallAgent metoden på en CallClient instans. Det här anropet returnerar asynkront ett CallAgent instansobjekt.

Metoden createCallAgent tar CommunicationUserCredential som ett argument som kapslar in en åtkomsttoken.

Om du vill komma åt DeviceManagermåste du skapa en callAgent instans först. Sedan kan du använda CallClient.getDeviceManager metoden för att hämta 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();

Om du vill ange ett visningsnamn för anroparen använder du den här alternativa metoden:

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

Spela in samtal

Kommentar

Det här API:et tillhandahålls som en förhandsversion för utvecklare och kan ändras baserat på feedback som vi får. Använd inte det här API:et i en produktionsmiljö. Om du vill använda det här API:et använder du betaversionen av Azure Communication Services Calling Android SDK.

Samtalsinspelning är en utökad funktion i kärnobjektet Call .

Varning

Fram till version 1.1.0 och betaversionen version 1.1.0-beta.1 av Azure Communication Services Calling Android SDK isRecordingActive och addOnIsRecordingActiveChangedListener ingick i Call objektet. För nya betaversioner flyttades dessa API:er som en utökad funktion i Call.

Du måste först hämta inspelningsfunktionsobjektet:

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

Kontrollera sedan om anropet registreras genom att granska isRecordingActive egenskapen callRecordingFeatureför . Den returnerar boolean.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

Du kan också prenumerera på inspelningsändringar:

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

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

Om du vill börja spela in från ditt program följer du först Översikt över samtalsinspelning för stegen för att konfigurera samtalsinspelning.

När du har konfigurerat samtalsinspelning på servern, från ditt Android-program, måste du hämta ServerCallId värdet från anropet och sedan skicka det till servern för att starta inspelningsprocessen. Du kan hitta värdet ServerCallId med hjälp getServerCallId() av från CallInfo klassen. Du hittar CallInfo klassen i klassobjektet med hjälp getInfo()av .

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

}

När du börjar spela in från servern utlöses händelsen handleCallOnIsRecordingChanged och värdet callRecordingFeature.isRecordingActive() för är true.

Precis som när du startar samtalsinspelningen måste du hämta ServerCallId och skicka den till inspelningsservern om du vill stoppa samtalsinspelningen så att den kan stoppa inspelningen:

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

}

När du slutar spela in från servern utlöses händelsen handleCallOnIsRecordingChanged och värdet callRecordingFeature.isRecordingActive() för är false.

Konfigurera systemet

Följ de här stegen för att konfigurera systemet.

Skapa Xcode-projektet

I Xcode skapar du ett nytt iOS-projekt och väljer mallen Enkel vyapp . Den här artikeln använder SwiftUI-ramverket, så du bör ange Language till Swift och ange Gränssnitt till SwiftUI.

Du kommer inte att skapa tester i den här artikeln. Avmarkera kryssrutan Inkludera tester .

Skärmbild som visar fönstret för att skapa ett projekt i Xcode.

Installera paketet och beroenden med hjälp av CocoaPods

  1. Skapa en Podfile för ditt program, som i det här exemplet:

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

  3. Öppna .xcworkspace med Xcode.

Begär åtkomst till mikrofonen

För att få åtkomst till enhetens mikrofon måste du uppdatera appens egenskapslista för information med hjälp NSMicrophoneUsageDescriptionav . Ange det associerade värdet till en sträng som ingår i dialogrutan som systemet använder för att begära åtkomst från användaren.

Högerklicka på posten Info.plist i projektträdet och välj sedan Öppna som>källkod. Lägg till följande rader i avsnittet på den översta nivån <dict> och spara sedan filen.

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

Konfigurera appramverket

Öppna projektets ContentView.swift fil. Lägg till en import deklaration överst i filen för att importera AzureCommunicationCalling biblioteket. Importera dessutom AVFoundation. Du behöver den för begäranden om ljudbehörighet i koden.

import AzureCommunicationCalling
import AVFoundation

Initiera CallAgent

Om du vill skapa en CallAgent instans från CallClientmåste du använda en callClient.createCallAgent metod som asynkront returnerar ett CallAgent objekt när det har initierats.

Skicka ett CommunicationTokenCredential objekt för att skapa en anropsklient:

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

Skicka objektet CommunicationTokenCredential som du skapade till CallClientoch ange visningsnamnet:

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")
        }
})

Spela in samtal

Kommentar

Det här API:et tillhandahålls som en förhandsversion för utvecklare och kan ändras baserat på feedback som vi får. Använd inte det här API:et i en produktionsmiljö. Om du vill använda det här API:et använder du betaversionen av Azure Communication Services Calling iOS SDK.

Samtalsinspelning är en utökad funktion i kärnobjektet Call .

Varning

Fram till version 1.1.0 och betaversionen version 1.1.0-beta.1 av Azure Communication Services Calling iOS SDK var isRecordingActive en del av Call objektet och didChangeRecordingState ingick i ombudet CallDelegate . För nya betaversioner flyttades dessa API:er som en utökad funktion i Call.

Du måste först hämta inspelningsfunktionsobjektet:

let callRecordingFeature = call.feature(Features.recording)

Kontrollera sedan om anropet registreras genom att granska isRecordingActive egenskapen callRecordingFeatureför . Den returnerar Bool.

let isRecordingActive = callRecordingFeature.isRecordingActive;

Du kan också prenumerera på inspelningsändringar genom att implementera ombudet RecordingCallFeatureDelegate för klassen med händelsen didChangeRecordingState:

callRecordingFeature.delegate = self

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

Om du vill börja spela in från ditt program följer du först Översikt över samtalsinspelning för stegen för att konfigurera samtalsinspelning.

När du har konfigurerat samtalsinspelning på servern, från ditt iOS-program, måste du hämta ServerCallId värdet från anropet och sedan skicka det till servern för att starta inspelningsprocessen. Du kan hitta värdet ServerCallId med hjälp getServerCallId() av från CallInfo klassen. Du hittar CallInfo klassen i klassobjektet med hjälp getInfo()av .

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

När du börjar spela in från servern utlöses händelsen didChangeRecordingState och värdet recordingFeature.isRecordingActive för är true.

Precis som när du startar samtalsinspelningen måste du hämta ServerCallId och skicka den till inspelningsservern om du vill stoppa samtalsinspelningen så att den kan stoppa inspelningen:

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

När du slutar spela in från servern utlöses händelsen didChangeRecordingState och värdet recordingFeature.isRecordingActive för är false.

Konfigurera systemet

Följ de här stegen för att konfigurera systemet.

Skapa Visual Studio-projektet

För en Universell Windows-plattform app skapar du i Visual Studio 2022 ett nytt projekt för Tom app (Universell Windows). När du har angett projektnamnet kan du välja valfri Windows SDK senare än 10.0.17763.0.

För en WinUI 3-app skapar du ett nytt projekt med mallen Tom app, Paketerad (WinUI 3 i Desktop) för att konfigurera en WinUI 3-app med en enda sida. SDK för Windows-appar version 1.3 eller senare krävs.

Installera paketet och beroendena med hjälp av NuGet Package Manager

Anropande SDK-API:er och bibliotek är offentligt tillgängliga via ett NuGet-paket.

Så här hittar du, laddar ned och installerar det anropande SDK NuGet-paketet:

  1. Öppna NuGet Package Manager genom att välja Verktyg>NuGet Package Manager>Hantera NuGet-paket för lösning.
  2. Välj Bläddra och ange sedan Azure.Communication.Calling.WindowsClient i sökrutan.
  3. Kontrollera att kryssrutan Inkludera förhandsversion är markerad.
  4. Välj paketet Azure.Communication.Calling.WindowsClient och välj sedan Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 eller en nyare version.
  5. Markera kryssrutan som motsvarar Azure Communication Services-projektet i den högra rutan.
  6. Välj Installera.

Spela in samtal

Samtalsinspelning är en utökad funktion i kärnobjektet Call . Du måste först hämta inspelningsfunktionsobjektet:

RecordingCallFeature recordingFeature = call.Features.Recording;

Kontrollera sedan om anropet registreras genom att granska IsRecordingActive egenskapen recordingFeatureför . Den returnerar boolean.

boolean isRecordingActive = recordingFeature.IsRecordingActive;

Du kan också prenumerera på inspelningsändringar:

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

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

Nästa steg