클라이언트에서 통화 녹음/녹화 관리

중요

이 문서에 설명된 기능은 현재 공개 미리 보기 상태입니다. 이 미리 보기 버전은 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

통화 녹음/녹화를 사용하면 사용자가 Azure Communication Services로 통화한 통화를 녹음/녹화할 수 있습니다. 여기서는 클라이언트 쪽에서 기록을 관리하는 방법을 알아봅니다. 이 작업을 수행하려면 서버 쪽 레코딩을 설정해야 합니다.

필수 구성 요소

SDK 설치

npm install 명령을 사용하여 JavaScript용 Azure Communication Services 통화 SDK 및 일반 SDK를 설치합니다.

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

필수 개체 초기화

CallClient 인스턴스는 대부분의 호출 작업에 필요합니다. 새 CallClient 인스턴스를 만들어 보겠습니다. 로거 인스턴스와 같은 사용자 지정 옵션을 사용하여 구성할 수 있습니다.

CallClient 인스턴스가 있으면 CallClient 인스턴스에서 createCallAgent 메서드를 호출하여 CallAgent 인스턴스를 만들 수 있습니다. 이 메서드는 CallAgent 인스턴스 개체를 비동기적으로 반환됩니다.

createCallAgent 메서드는 CommunicationTokenCredential을 인수로 사용합니다. 사용자 액세스 토큰이 허용됩니다.

CallClient 인스턴스에서 getDeviceManager 메서드를 사용하여 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 wherever desired. To console, file, buffer, REST API, etc...
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()

통화 녹음

참고

이 API는 개발자를 위한 미리 보기로 제공되며 수신한 피드백을 기반으로 변경될 수 있습니다. 프로덕션 환경에서 이 API를 사용하지 마세요. 이 API를 사용하려면 Azure Communication Services 통화 웹 SDK의 '베타' 릴리스를 사용하세요.

통화 레코딩은 핵심 Call API의 확장 기능입니다. 먼저 통화 SDK에서 호출 기능을 가져와야 합니다.

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

그런 다음, 통화 인스턴스에서 레코딩 기능 API 개체를 가져올 수 있습니다.

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

그런 다음, 통화가 녹음되고 있는지 확인하려면 callRecordingApiisRecordingActive 속성을 검사합니다. Boolean를 반환합니다.

const isRecordingActive = callRecordingApi.isRecordingActive;

레코딩 변화를 구독할 수도 있습니다.

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

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

SDK 설치

프로젝트 수준 build.gradle을 찾고, mavenCentral()buildscriptallprojects 아래의 리포지토리 목록에 추가해야 합니다.

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

그런 다음, 모듈 수준 build.gradle에서 dependencies 섹션에 다음 줄을 추가합니다.

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

필요한 개체 초기화

CallAgent 인스턴스를 만들려면 CallClient 인스턴스에서 createCallAgent 메서드를 호출해야 합니다. 이렇게 하면 CallAgent 인스턴스 개체가 비동기적으로 반환됩니다. createCallAgent 메서드는 CommunicationUserCredential을 인수로 사용하여 액세스 토큰을 캡슐화합니다. DeviceManager에 액세스하려면 먼저 callAgent 인스턴스를 만든 다음, CallClient.getDeviceManager 메서드를 사용하여 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();

호출자의 표시 이름을 설정하려면 다음과 같은 대체 방법을 사용합니다.

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

통화 녹음

경고

Azure Communication Services 호출 Android SDK의 버전 1.1.0 및 베타 릴리스 버전 1.1.0-beta.1까지는 isRecordingActiveaddOnIsRecordingActiveChangedListenerCall 개체의 일부입니다. 새 베타 릴리스의 경우 해당 API는 아래 설명과 같이 Call의 확장 기능으로 이동되었습니다.

참고

이 API는 개발자를 위한 미리 보기로 제공되며 수신한 피드백을 기반으로 변경될 수 있습니다. 프로덕션 환경에서 이 API를 사용하지 마세요. 이 API를 사용하려면 Azure Communication Services 통화 Android SDK의 '베타' 릴리스를 사용하세요.

통화 녹음/녹화는 핵심 Call 개체의 확장 기능입니다. 먼저 레코딩 기능 개체를 가져와야 합니다.

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

그런 다음, 통화가 녹음되고 있는지 확인하려면 callRecordingFeatureisRecordingActive 속성을 검사합니다. boolean를 반환합니다.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

레코딩 변화를 구독할 수도 있습니다.

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

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

애플리케이션에서 녹음/녹화를 시작하려면 먼저 통화 녹음/녹화 개요에 따라 통화 녹음/녹화를 설정하는 단계를 따르세요.

서버에 통화 녹음/녹화를 설정하고 나면 Android 애플리케이션에서 통화에서 ServerCallId 값을 얻은 다음 이를 서버로 보내 녹음/녹화 프로세스를 시작해야 합니다. ServerCallId 값은 getInfo()를 사용하여 클래스 개체에서 찾을 수 있는 CallInfo 클래스의 getServerCallId()를 사용하여 찾을 수 있습니다.

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

}

서버에서 녹음/녹화가 시작되면 handleCallOnIsRecordingChanged 이벤트가 트리거되고 callRecordingFeature.isRecordingActive()의 값은 true가 됩니다.

통화 녹음/녹화를 시작하는 것과 마찬가지로 통화 녹음/녹화를 중지하려면 ServerCallId를 가져와 녹음/녹화 서버로 보내 통화 녹음/녹화를 중지해야 합니다.

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

}

서버에서 녹음/녹화가 중지되면 handleCallOnIsRecordingChanged 이벤트가 트리거되고 callRecordingFeature.isRecordingActive() 값은 false가 됩니다.

시스템 설정

Xcode 프로젝트 만들기

Xcode에서 새 iOS 프로젝트를 만들고 단일 보기 앱 템플릿을 선택합니다. 이 빠른 시작에서는 SwiftUI 프레임워크를 사용하므로 언어Swift로 설정하고 사용자 인터페이스SwiftUI로 설정해야 합니다.

이 빠른 시작 중에는 단위 테스트 또는 UI 테스트를 만들지 않습니다. 단위 테스트 포함UI 테스트 포함 텍스트 상자 선택을 취소할 수 있습니다.

Xcode 내에서 프로젝트를 만드는 창을 보여주는 스크린샷.

CocoaPods를 사용하여 패키지 및 종속성 설치

  1. 다음과 같이 애플리케이션에 대한 Podfile을 만듭니다.

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. pod install을 실행합니다.

  3. Xcode에서 .xcworkspace를 엽니다.

마이크에 대한 액세스 요청

디바이스의 마이크에 액세스하려면 앱의 정보 속성 목록을 NSMicrophoneUsageDescription으로 업데이트해야 합니다. 연결된 값을 시스템이 사용자의 액세스를 요청하는 데 사용하는 대화 상자에 포함될 string으로 설정합니다.

프로젝트 트리의 Info.plist 항목을 마우스 오른쪽 단추로 클릭하고 다음 형식으로 열기>소스 코드를 선택합니다. 최상위 <dict> 섹션에 다음 줄을 추가한 다음, 파일을 저장합니다.

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

앱 프레임워크 설정

프로젝트의 ContentView.swift 파일을 열고 파일 맨 위에 import 선언을 추가하여 AzureCommunicationCalling 라이브러리를 가져옵니다. 추가로 AVFoundation을 가져옵니다. 코드에서 오디오 권한 요청에 필요합니다.

import AzureCommunicationCalling
import AVFoundation

CallAgent 초기화

CallAgent에서 CallClient 인스턴스를 만들려면 초기화된 후 비동기적으로 callClient.createCallAgent 개체를 반환하는 CallAgent 메서드를 사용해야 합니다.

통화 클라이언트를 만들려면 CommunicationTokenCredential 개체를 전달해야 합니다.

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

만든 CommunicationTokenCredential 개체를 CallClient에 전달하고 표시 이름을 설정합니다.

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

통화 녹음

경고

Azure Communication Services 통화 iOS SDK의 버전 1.1.0 및 베타 릴리스 버전 1.1.0-beta.1까지는 isRecordingActiveCall 개체의 일부이고 didChangeRecordingStateCallDelegate 대리자의 일부입니다. 새 베타 릴리스의 경우 해당 API는 아래 설명과 같이 Call의 확장 기능으로 이동되었습니다.

참고

이 API는 개발자를 위한 미리 보기로 제공되며 수신한 피드백을 기반으로 변경될 수 있습니다. 프로덕션 환경에서 이 API를 사용하지 마세요. 이 API를 사용하려면 Azure Communication Services 통화 iOS SDK의 '베타' 릴리스를 사용하세요.

통화 녹음/녹화는 핵심 Call 개체의 확장 기능입니다. 먼저 레코딩 기능 개체를 가져와야 합니다.

let callRecordingFeature = call.feature(Features.recording)

그런 다음, 통화가 녹음되고 있는지 확인하려면 callRecordingFeatureisRecordingActive 속성을 검사합니다. Bool를 반환합니다.

let isRecordingActive = callRecordingFeature.isRecordingActive;

이벤트 didChangeRecordingState를 사용하여 클래스에 RecordingCallFeatureDelegate 대리자를 구현하여 변경 내용 기록을 구독할 수도 있습니다.

callRecordingFeature.delegate = self

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

애플리케이션에서 녹음/녹화를 시작하려면 먼저 통화 녹음/녹화 개요에 따라 통화 녹음/녹화를 설정하는 단계를 따르세요.

서버에 통화 녹음/녹화를 설정하고 나면 iOS 애플리케이션에서 통화에서 ServerCallId 값을 얻은 다음, 이를 서버로 보내 녹음/녹화 프로세스를 시작해야 합니다. ServerCallId 값은 getInfo()를 사용하여 클래스 개체에서 찾을 수 있는 CallInfo 클래스의 getServerCallId()를 사용하여 찾을 수 있습니다.

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

서버에서 녹음/녹화가 시작되면 didChangeRecordingState 이벤트가 트리거되고 recordingFeature.isRecordingActive의 값은 true가 됩니다.

통화 녹음/녹화를 시작하는 것과 마찬가지로 통화 녹음/녹화를 중지하려면 ServerCallId를 가져와 녹음/녹화 서버로 보내 통화 녹음/녹화를 중지해야 합니다.

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

서버에서 녹음/녹화가 중지되면 didChangeRecordingState 이벤트가 트리거되고 recordingFeature.isRecordingActive 값은 false가 됩니다.

다음 단계