Szybkie wprowadzenie: rejestrowanie połączeń
W tym artykule opisano nagrywanie połączeń głosowych i wideo. Aby rozpocząć korzystanie z interfejsów API nagrywania połączeń, musisz mieć połączenie. Aby zbudować doświadczenie połączeń dla użytkownika końcowego, upewnij się, że znasz zestaw SDK klienta wywołującego i Automatyzacja połączeń.
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.
- Pobierz .NET SDK
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie serverCallId
do inicjowania nagrywania. 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 funkcji automatyzacji połączeń masz dwie opcje, aby uzyskać serverCallId
:
Gdy ustanowisz połączenie, zwraca
serverCallId
jako właściwość zdarzeniaCallConnected
po nawiązaniu połączenia. Dowiedz się, jak uzyskać zdarzenie CallConnected z zestawu SDK Call Automation.Po odebraniu połączenia lub utworzeniu połączenia odpowiednia właściwość
serverCallId
jest zwracana jako część odpowiedzi API interfejsuAnswerCallResult
lubCreateCallResult
.
Scenariusze użycia zestawu SDK
W przypadku korzystania z SDK klienta dzwoniącego można pobrać serverCallId
przy użyciu metody getServerCallId
dla połączenia.
Skorzystaj z tego przykładu, aby dowiedzieć się, jak pobrać serverCallId z SDK klienta wywołującego.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
API nagrywania połączeń 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żyjAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. UżyjMIXED
lubUNMIXED
. - Użyj
RecordingFormat
, aby przekazać format nagrania. UżyjWAV
.
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>"))
};
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 w momencie, gdy zaczynają 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);
Odpowiedź interfejsu API StartAsync
zawiera recordingId
dotyczące sesji nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu StopAsync
interfejsu API
Użyj elementu recordingId
, który otrzymano w odpowiedzi na StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Wstrzymaj sesję nagrywania przy użyciu PauseAsync
interfejsu API
Użyj recordingId
odebranego w odpowiedzi na StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Wznów sesję nagrywania przy użyciu ResumeAsync
API
Użyj odebranego recordingId
w odpowiedzi na StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Pobieranie pliku nagrywania przy użyciu interfejsu DownloadToAsync
API
Użyj webhook Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane pliki multimedialne 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 materiały.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
Pobierz element downloadLocation
dotyczący nagrania z atrybutu contentLocation
obiektu recordingChunk
. Użyj metody DownloadToAsync
, 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.
- Pobierz Java SDK
Przed rozpoczęciem
Interfejsy API rejestrowania wywołań używają wyłącznie elementu serverCallId
do inicjowania nagrywania. 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 wywołania, element
serverCallId
jest zwracany jako właściwość zdarzeniaCallConnected
, po ustanowieniu połączenia. 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 użycia zestawu SDK
W przypadku używania Calling Client SDK można pobrać serverCallId
za pomocą metody getServerCallId
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
API rejestrowania wywołań są częścią bibliotek 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żyjMIXED
lubUNMIXED
. - Użyj
RecordingFormat
polecenia , aby przekazać format nagrania. UżyjWAV
.
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>"));
// //start recording
RecordingStateResult result = callRecording.start(recordingOptions);
2.2. Rozpocznij sesję nagrywania, używając StartAsync
API, z włączonym trybem wstrzymania.
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 w miarę jak 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 recordingId
otrzymanego 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 recordingId
otrzymanego w odpowiedzi na startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Wznów sesję nagrywania przy użyciu interfejsu API resumeWithResponse
Użyj recordingId
, które otrzymano 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 webhooku usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić swoje usługi, gdy zapisany materiał jest gotowy 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 metody downloadToWithResponse
klasy CallRecording
, aby pobrać nagrany materiał. 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 do modyfikacji działania pobierania równoległego. -
overwrite
: Wartość "prawda" powoduje zastąpienie pliku, 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ć z pól contentLocation
i documentId
odpowiednio dla każdego elementu recordingChunk
.
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. Zapisz ciąg połączenia zasobu.
- Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
- Python 3.7+.
Przed rozpoczęciem
API rejestrowania połączeń używają wyłącznie serverCallId
do inicjowania nagrywania. 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 połączeń masz dwie opcje, aby uzyskać
serverCallId
:- Po utworzeniu wywołania,
serverCallId
jest zwracane jako właściwość zdarzeniaCallConnected
, po nawiązaniu połączenia. Dowiedz się, jak uzyskać zdarzenie CallConnected z zestawu Call Automation SDK. - Gdy odpowiesz na połączenie lub zostanie utworzone połączenie, zwraca
serverCallId
jako właściwość w odpowiedziach APIAnswerCallResult
lubCreateCallResult
.
- Po utworzeniu wywołania,
Scenariusze wywoływania zestawu SDK
- Podczas korzystania z SDK klientów połączeń możesz pobrać
serverCallId
przy użyciu zmiennejserver_call_id
w połączeniu. Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać serverCallId w SDK klienta wywołującego.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API nagrywania 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 za pomocą interfejsu start_recording API
Użyj odebranego serverCallId
podczas inicjowania połączenia.
- Użyj
RecordingContent
polecenia , aby przekazać typ zawartości nagrania. UżyjAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. Użyj poleceniaMIXED
lubUNMIXED
. - Użyj polecenia
RecordingFormat
, aby przekazać format nagrania. UżyjWAV
.
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 recording_id
, które otrzymano 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 recording_id
otrzymanego 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 recording_id
, który został odebrany 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 webhooka Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić swoje usługi, gdy nagrania multimedialne 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). Powiadomienia o zdarzeniach rejestrowania obejmują contentLocation
i 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 download_recording
API, aby pobrać nagrany materiał.
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 uzyskać z atrybutu contentLocation
elementu recordingChunk
. Użyj metody download_recording
, 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 nagrania, 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. Zapisz connection string 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 serverCallId
do inicjowania nagrywania. Istnieje kilka metod, których można użyć do pobrania serverCallId
w zależności od scenariusza:
Scenariusze automatyzacji wywołań
- Podczas korzystania z Call Automation, masz dwie opcje uzyskania
serverCallId
:- Po utworzeniu wywołania, element
serverCallId
jest zwracany jako właściwośćCallConnected
zdarzenia po nawiązaniu połączenia. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu SDK usługi Call Automation. - Po odebraniu połączenia lub jego utworzeniu, zwraca
serverCallId
jako właściwość odpowiedzi interfejsu APIAnswerCallResult
lubCreateCallResult
, odpowiednio.
- Po utworzeniu wywołania, element
Scenariusze użycia zestawu SDK
Korzystając z SDK klienta do wykonywania połączeń, możesz pobrać serverCallId
przy użyciu metody getServerCallId
na wywołaniu.
Skorzystaj z tego przykładu, aby dowiedzieć się, jak przy pomocy Calling Client SDK uzyskać identyfikator serverCallId.
Zacznijmy od kilku prostych kroków.
1. Tworzenie klienta usługi Call Automation
Interfejsy API do nagrywania rozmów 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żyjAUDIO
. - Użyj
RecordingChannel
polecenia , aby przekazać typ kanału nagrywania. UżyjMIXED
lubUNMIXED
. - Użyj
RecordingFormat
, aby przekazać format nagrania. UżyjWAV
.
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. Rozpocznij nagrywanie — Skorzystaj z własnego 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
zawartość sesji nagrywania.
3. Zatrzymaj sesję nagrywania przy użyciu interfejsu API "stop"
Użyj odebranego recordingId
w odpowiedzi na start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Wstrzymaj sesję nagrywania używając API 'pause'
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 odebranego recordingId
w odpowiedzi na start
.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Pobieranie pliku nagrywania przy użyciu interfejsu API "DownloadToAsync"
Użyj webhooka z usługi Azure Event Grid lub innego wyzwolonego działania, aby powiadomić swoje usługi, gdy zarejestrowane media będą 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 contentLocation
i metadataLocation
, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych rejestrowania.
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 downloadToPath
API, aby pobrać nagrane materiały.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
Element downloadLocation
dla nagrania można pobrać z contentLocation
atrybutu recordingChunk
. Użyj metody DownloadToAsync
, 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 nagrania (na przykład nagranego materiału, 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ń.