Szybki start: rejestrowanie wywołań
W tym artykule opisano nagrywanie połączeń głosowych i wideo. Aby rozpocząć korzystanie z interfejsów API nagrywania połączeń, musisz mieć wywołanie. Aby utworzyć środowisko wywoływania przez użytkownika końcowego, upewnij się, że znasz zestaw SDK klienta wywołującego i automatyzację wywołań.
Przykładowy kod
Przykładową aplikację można pobrać z usługi GitHub
Wymagania wstępne
- Potrzebujesz konta platformy Azure z aktywną subskrypcją.
- Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
- Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
- Pobieranie zestawu .NET SDK
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId
. Istnieje kilka metod, których można użyć do pobrania serverCallId
w zależności od scenariusza:
Scenariusze automatyzacji wywołań
W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId
:
Po ustanowieniu wywołania zwraca
serverCallId
on właściwość jako właściwośćCallConnected
zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK.Po odebraniu wywołania lub wywołaniu jest zwracana
serverCallId
odpowiednio właściwość jako odpowiedź interfejsuAnswerCallResult
API lubCreateCallResult
.
Scenariusze wywoływania zestawu SDK
W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId
metodę getServerCallId
przy użyciu metody wywołania .
Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . Dlatego należy utworzyć klienta usługi Call Automation.
Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient
obiektu.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu API "StartAsync"
Użyj odebranego serverCallId
podczas inicjowania połączenia.
- Użyj
RecordingContent
polecenia , aby przekazać typ zawartości nagrania. Użyj witrynyAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. Użyj poleceniaMIXED
lubUNMIXED
. - Użyj
RecordingFormat
polecenia , aby przekazać format nagrania. Użyj witrynyWAV
.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.1. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store
Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
RecordingStorage = RecordingStorage.CreateAzureBlobContainerRecordingStorage(new Uri("<YOUR_STORAGE_CONTAINER_URL>"))
ExternalStorage = new BlobStorage(new Uri("<Insert Container / Blob Uri>"))
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.2. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"
Uwaga
Nagrania należy wznowić w celu wygenerowania pliku nagrywania.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
PauseOnStart = true,
RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.3. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0
Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering
funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed
, ale nie używasz AudioChannelParticipantOrdering
funkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
AudioChannelParticipantOrdering = { new CommunicationUserIdentifier("<ACS_USER_MRI>") }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);
2.4 Tylko dla opcji Unmixed — Określ koligację kanału
var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
ChannelAffinity = new List<ChannelAffinity>{ channelAffinity }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);
StartAsync
Odpowiedź interfejsu API zawiera recordingId
sesję nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu StopAsync
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Wstrzymaj sesję nagrywania przy użyciu PauseAsync
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Wznów sesję nagrywania przy użyciu ResumeAsync
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Pobieranie pliku nagrywania przy użyciu interfejsu DownloadToAsync
API
Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.
Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated
usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu przetwarzania nagrania (np. po zakończeniu spotkania lub zatrzymaniu nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation
metadataLocation
, których można użyć do pobrania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.
Przykład schematu zdarzeń:
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Użyj interfejsu DownloadToAsync
API, aby pobrać nagrane nośniki.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
Pobierz element downloadLocation
dla nagrania z contentLocation
atrybutu recordingChunk
.
DownloadToAsync
Użyj metody , aby pobrać zawartość do podanej nazwy pliku.
7. Usuwanie zawartości nagrywania przy użyciu DeleteAsync
interfejsu API
Użyj DeleteAsync
interfejsu API, aby usunąć zawartość nagrywania (np. zarejestrowane nośniki i metadane).
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Przykładowy kod
Przykładową aplikację można pobrać z usługi GitHub
Wymagania wstępne
- Potrzebujesz konta platformy Azure z aktywną subskrypcją.
- Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
- Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
- Pobieranie zestawu Java SDK
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId
. Istnieje kilka metod, których można użyć do pobrania serverCallId
w zależności od scenariusza:
Scenariusze automatyzacji wywołań
W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId
:
Po utworzeniu
serverCallId
wywołania element jest zwracany jako właściwośćCallConnected
zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK.Po udzieleniu odpowiedzi na wywołanie lub wywołaniu
serverCallId
element jest zwracany odpowiednio jako właściwość odpowiedzi interfejsuAnswerCallResult
API lubCreateCallResult
.
Scenariusze wywoływania zestawu SDK
W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId
metodę getServerCallId
przy użyciu metody wywołania .
Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . Dlatego należy utworzyć klienta usługi Call Automation.
Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient
obiektu.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu startWithResponse
API
Użyj odebranego serverCallId
podczas inicjowania połączenia.
- Użyj
RecordingContent
polecenia , aby przekazać typ zawartości nagrania. Użyj witrynyAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. Użyj poleceniaMIXED
lubUNMIXED
. - Użyj
RecordingFormat
polecenia , aby przekazać format nagrania. Użyj witrynyWAV
.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.1. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store
Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.
StartRecordingOptions recordingOptions = new StartRecordingOptions(callLocator)
.setRecordingChannel(RecordingChannel.MIXED)
.setRecordingContent(RecordingContent.AUDIO_VIDEO)
.setRecordingFormat(RecordingFormat.MP4)
.setRecordingStorage(new AzureBlobContainerRecordingStorage("<YOUR_STORAGE_CONTAINER_URL>"))
.setExternalStorage(new BlobStorage("<Insert Container / Blob Uri>"));
// //start recording
RecordingStateResult result = callRecording.start(recordingOptions);
2.2. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu StartAsync
interfejsu API
Uwaga
Nagrania należy wznowić, aby można było wygenerować plik nagrywania.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setPauseOnStart(true)
.setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.3. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0
Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering
funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed
, ale nie używasz AudioChannelParticipantOrdering
funkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.4 Tylko dla opcji Unmixed — Określ koligację kanału
ChannelAffinity channelAffinity = new ChannelAffinity()
.setParticipant(new PhoneNumberIdentifier("RECORDING_ID"))
.setChannel(0);
List<ChannelAffinity> channelAffinities = Arrays.asList(channelAffinity);
StartRecordingOptions startRecordingOptions = new StartRecordingOptions(new ServerCallLocator(SERVER_CALL_ID))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setChannelAffinity(channelAffinities);
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startRecordingWithResponse(recordingOptions, null);
startWithResponse
Odpowiedź interfejsu API zawiera recordingId
sesję nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu stopWithResponse
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Wstrzymaj sesję nagrywania przy użyciu pauseWithResponse
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Wznów sesję nagrywania przy użyciu resumeWithResponse
interfejsu API
Użyj odebranych recordingId
w odpowiedzi na startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Pobieranie pliku nagrywania przy użyciu interfejsu downloadToWithResponse
API
Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.
Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated
usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (np. zakończenie spotkania lub zatrzymanie nagrywania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation
metadataLocation
, których można użyć do pobrania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.
Poniższy kod jest przykładem schematu zdarzeń.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Użyj downloadToWithResponse
metody CallRecording
klasy, aby pobrać nagrane nośniki. Poniżej przedstawiono obsługiwane parametry dla downloadToWithResponse
metody:
-
contentLocation
: adres URL usług Azure Communication Services, pod którym znajduje się zawartość. -
destinationPath
: Lokalizacja pliku. -
parallelDownloadOptions
: opcjonalnyParallelDownloadOptions
obiekt modyfikując sposób działania pobierania równoległego. -
overwrite
: prawda, aby zastąpić plik, jeśli istnieje. -
context
: Kontekst reprezentujący kontekst żądania.
Boolean overwrite = true;
ParallelDownloadOptions parallelDownloadOptions = null;
Context context = null;
String filePath = String.format(".\\%s.%s", documentId, fileType);
Path destinationPath = Paths.get(filePath);
Response<Void> downloadResponse = callAutomationClient.getCallRecording().downloadToWithResponse(contentLocation, destinationPath, parallelDownloadOptions, overwrite, context);
Lokalizację zawartości i identyfikatory dokumentów dla plików nagrywania można pobrać odpowiednio z contentLocation
pól i documentId
dla każdego recordingChunk
elementu .
7. Usuwanie zawartości nagrywania przy użyciu deleteWithResponse
interfejsu API
Użyj deleteWithResponse
metody CallRecording
klasy, aby usunąć zarejestrowane nośniki. Obsługiwane parametry dla deleteWithResponse
metody:
-
deleteLocation
: adres URL usług Azure Communication Services, pod którym znajduje się zawartość do usunięcia. -
context
: Kontekst reprezentujący kontekst żądania.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
Lokalizację usuwania nagrania można pobrać z deleteLocation
pola zdarzenia usługi Event Grid.
Przykładowy kod
Przykładową aplikację można pobrać z usługi GitHub
Wymagania wstępne
- Potrzebujesz konta platformy Azure z aktywną subskrypcją.
- Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
- Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
- Python 3.7+.
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId
. Istnieje kilka metod, których można użyć do pobrania serverCallId
w zależności od scenariusza:
Scenariusze automatyzacji wywołań
- W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu
serverCallId
:- Po utworzeniu
serverCallId
wywołania element jest zwracany jako właściwośćCallConnected
zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK. - Po udzieleniu odpowiedzi na wywołanie lub wywołaniu zwraca
serverCallId
ona odpowiednio właściwość jako właściwość odpowiedzi interfejsuAnswerCallResult
API lubCreateCallResult
.
- Po utworzeniu
Scenariusze wywoływania zestawu SDK
- W przypadku używania zestawu SDK klienta wywołującego można pobrać
serverCallId
element przy użyciu zmiennejserver_call_id
w wywołaniu . Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . W związku z tym należy utworzyć klienta usługi Call Automation.
Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient
obiektu.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Rozpocznij sesję nagrywania start_recording interfejsu API
Użyj odebranego serverCallId
podczas inicjowania połączenia.
- Użyj
RecordingContent
polecenia , aby przekazać typ zawartości nagrania. Użyj witrynyAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. Użyj poleceniaMIXED
lubUNMIXED
. - Użyj
RecordingFormat
polecenia , aby przekazać format nagrania. Użyj witrynyWAV
.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>")
2.1. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store
Rozpocznij nagrywanie przy użyciu własnej usługi Azure Blob Storage zdefiniowanej w celu przechowywania pliku nagrywania po zakończeniu nagrywania.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
recording_storage = AzureBlobContainerRecordingStorage(container_url="<YOUR_STORAGE_CONTAINER_URL>"))
2.2. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"
Uwaga
Nagrania należy wznowić w celu wygenerowania pliku nagrywania.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
pause_on_start = true,
recording_state_callback_url = "<CallbackUri>")
2.3. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0
Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering
funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed
, ale nie używasz AudioChannelParticipantOrdering
funkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
audio_channel_participant_ordering=[CommunicationUserIdentifier(id="<ACS_USER_MRI>")])
2.4 Tylko dla opcji Unmixed — Określ koligację kanału
_channel_affinity = ChannelAffinity(target_participant=CommunicationUserIdentifier("<ACS_USER_MRI>"), channel=0)
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
channel_affinity=[_channel_affinity])
StartAsync
Odpowiedź interfejsu API zawiera recordingId
sesję nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu interfejsu API "stop_recording"
Użyj odebranych recording_id
w odpowiedzi na start_recording
.
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. Wstrzymywanie sesji nagrywania przy użyciu interfejsu API "pause_recording"
Użyj odebranych recording_id
w odpowiedzi na start_recording
.
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. Wznów sesję nagrywania przy użyciu interfejsu API "resume_recording"
Użyj odebranych recording_id
w odpowiedzi na start_recording
.
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. Pobieranie pliku nagrywania przy użyciu interfejsu API "download_recording"
Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.
Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated
usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (na przykład zakończenie spotkania lub zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation
metadataLocation
, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.
Poniższy kod jest przykładem schematu zdarzeń.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Użyj interfejsu download_recording
API, aby pobrać nagrane nośniki.
response = recording_data = call_automation_client.download_recording(content_location)
with open("<file_name>", "wb") as binary_file:
binary_file.write(recording_data.read())
Element downloadLocation
dla nagrania można pobrać z contentLocation
atrybutu recordingChunk
.
download_recording
Użyj metody , aby pobrać zawartość do bajtów.
7. Usuwanie zawartości nagrywania przy użyciu interfejsu API "delete_recording"
Użyj delete_recording
interfejsu API do usuwania zawartości nagrywania, takiej jak zarejestrowane nośniki i metadane.
response = call_automation_client.delete_recording(delete_location);
Przykładowy kod
Przykładową aplikację można pobrać z usługi GitHub
Wymagania wstępne
- Potrzebujesz konta platformy Azure z aktywną subskrypcją.
- Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
- Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
- Node.js wersji Active LTS i Maintenance LTS (zalecane wersje 8.11.1 i 10.14.1)
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId
. Istnieje kilka metod, których można użyć do pobrania serverCallId
w zależności od scenariusza:
Scenariusze automatyzacji wywołań
- W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu
serverCallId
:- Po utworzeniu
serverCallId
wywołania element jest zwracany jako właściwośćCallConnected
zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Sdk usługi Call Automation. - Po udzieleniu odpowiedzi na wywołanie lub wywołaniu zwraca
serverCallId
ona odpowiednio właściwość jako właściwość odpowiedzi interfejsuAnswerCallResult
API lubCreateCallResult
.
- Po utworzeniu
Scenariusze wywoływania zestawu SDK
W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId
metodę getServerCallId
przy użyciu metody wywołania .
Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . W związku z tym należy utworzyć klienta usługi Call Automation.
Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient
obiektu.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu API "StartAsync"
Użyj odebranego serverCallId
podczas inicjowania połączenia.
- Użyj
RecordingContent
polecenia , aby przekazać typ zawartości nagrania. Użyj witrynyAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. Użyj poleceniaMIXED
lubUNMIXED
. - Użyj
RecordingFormat
polecenia , aby przekazać format nagrania. Użyj witrynyWAV
.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>"
};
var response = await callAutomationClient.getCallRecording().start(options);
2.1. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store
Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.
const recordingStorageKind: RecordingStorageKind = "azureBlobStorage"
const recordingStorage: RecordingStorage = {
recordingStorageKind: recordingStorageKind,
recordingDestinationContainerUrl: "<YOUR_STORAGE_CONTAINER_URL>"
}
var options: StartRecordingOptions = {
callLocator: callLocator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
recordingStorage: recordingStorage
};
var response = await callAutomationClient.getCallRecording().start(options);
2.2. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"
Uwaga
Nagrania należy wznowić w celu wygenerowania pliku nagrywania.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
pauseOnStart: true
recordingStateCallbackEndpointUrl: "<CallbackUri>",
audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);
2.3. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0
Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering
funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed
, ale nie używasz AudioChannelParticipantOrdering
funkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);
2.4 Tylko dla opcji Unmixed — Określ koligację kanału
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
ChannelAffinity:
[
{
channel:0,
targetParticipant:{communicationUserId: "<ACS_USER_MRI>"}
}
]
};
var response = await callAutomationClient.getCallRecording().start(options);
StartAsync
Odpowiedź interfejsu API zawiera recordingId
sesję nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu interfejsu API "stop"
Użyj odebranych recordingId
w odpowiedzi na start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Wstrzymaj sesję nagrywania przy użyciu interfejsu API wstrzymania
Użyj odebranych recordingId
w odpowiedzi na start
.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Wznów sesję nagrywania przy użyciu interfejsu API "ResumeAsync"
Użyj odebranych recordingId
w odpowiedzi na start
.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Pobieranie pliku nagrywania przy użyciu interfejsu API "DownloadToAsync"
Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.
Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated
usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (na przykład zakończenie spotkania lub zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation
metadataLocation
, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.
Poniższy kod jest przykładem schematu zdarzeń.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Użyj interfejsu downloadToPath
API, aby pobrać nagrane nośniki.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
Element downloadLocation
dla nagrania można pobrać z contentLocation
atrybutu recordingChunk
.
DownloadToAsync
Użyj metody , aby pobrać zawartość do podanej nazwy pliku.
7. Usuwanie zawartości nagrywania przy użyciu interfejsu API "DeleteAsync"
Użyj delete
interfejsu API do usuwania zawartości nagrywania (na przykład zarejestrowanego nośnika, metadanych)
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
Czyszczenie zasobów
Jeśli chcesz wyczyścić i usunąć subskrypcję usług Komunikacyjnych, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Dowiedz się więcej o czyszczeniu zasobów.
Następne kroki
Aby uzyskać więcej informacji, zobacz następujące artykuły:
- Pobierz nasze przykładowe aplikacje java, Python i JavaScript do nagrywania wywołań.
- Dowiedz się więcej o nagrywaniu połączeń.
- Dowiedz się więcej o automatyzacji wywołań.