Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается запись звонков для голосовых и видеозвонков. Чтобы начать использовать API записи вызовов, у вас должен быть активный вызов. Чтобы создать интерфейс вызова конечных пользователей, убедитесь, что вы знакомы с пакетом SDK для клиента вызовов и автоматизацией вызовов.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для .NET
Перед началом работы
API записи вызовов используют callConnectionId или serverCallId для инициирования записи. Существует несколько методов, которые можно использовать для получения этих идентификаторов в зависимости от вашего сценария:
Как получить callConnectionId
При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.
Получение serverCallId
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId:
Когда вы устанавливаете вызов,
serverCallIdвозвращается как свойство событияCallConnectedпосле того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.При ответе на вызов или создании вызова, он возвращается как свойство ответов
AnswerCallResultилиCreateCallResultAPI соответственно.
При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
Используйте callConnectionId или serverCallId, полученные во время запуска вызова.
- Используется
RecordingContentдля передачи типа контента записи. ИспользуйтеAUDIO. - Используется
RecordingChannelдля передачи типа канала записи. ИспользуйтеMIXEDилиUNMIXED. - Используется
RecordingFormatдля передачи формата записи. ИспользуйтеWAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.1. Начать запись - Используйте собственное хранилище BLOB-объектов Azure
Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <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. Только для неизмененных - Укажите пользователя на канале 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <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. Только для несмешанных данных— указание сходства каналов
var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <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 Ответ API содержит recordingId, связанный с сеансом записи.
3. Остановка сеанса записи с помощью StopAsync API
Используйте recordingId, полученный в ответ на StartAsync.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Приостановка сеанса записи с помощью PauseAsync API
Используйте recordingId, полученный в ответ на StartAsync.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Возобновление сеанса записи с помощью ResumeAsync API
Используйте recordingId, полученный в ответ на StartAsync.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Скачивание файла записи с помощью DownloadToAsync API
Используйте вебхук или другое активированное действие Azure Event Grid, чтобы уведомить службы о готовности записываемого медиаконтента к загрузке.
Уведомление Microsoft.Communication.RecordingFileStatusUpdated сетки событий публикуется, когда запись готова к получению, обычно через несколько минут после завершения обработки записи (например, при завершении собрания или остановке записи). Уведомления о событиях записей включают contentLocation и metadataLocation, которые можно использовать для извлечения записанных медиафайлов и метаданных записи.
Пример схемы события:
{
"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
}
С помощью DownloadToAsync API можно скачать записанный носитель.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
Извлеките downloadLocation для записи из атрибута contentLocation объекта recordingChunk. Используйте метод DownloadToAsync, чтобы скачать содержимое в указанный файл.
7. Удаление содержимого записи с помощью DeleteAsync API
Используйте DeleteAsync API для удаления содержимого записи (например, записанных носителей и метаданных).
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для Java
Перед началом работы
API записи вызовов используют callConnectionId или serverCallId для инициирования записи. Существует несколько методов, которые можно использовать для получения этих идентификаторов в зависимости от вашего сценария:
Как получить callConnectionId
При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.
Получение serverCallId
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId:
Когда вы устанавливаете вызов,
serverCallIdвозвращается как свойство событияCallConnectedпосле того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.При ответе на вызов или создании вызова, он возвращается как свойство ответов
AnswerCallResultилиCreateCallResultAPI соответственно.
При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью startWithResponse API
Используйте callConnectionId или serverCallId, полученные во время запуска вызова.
- Используется
RecordingContentдля передачи типа контента записи. ИспользуйтеAUDIO. - Используется
RecordingChannelдля передачи типа канала записи. ИспользуйтеMIXEDилиUNMIXED. - Используется
RecordingFormatдля передачи формата записи. ИспользуйтеWAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.1. Начать запись - Используйте собственное хранилище BLOB-объектов Azure
Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.
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. Запуск сеанса записи с включенным режимом приостановки с помощью StartAsync API
Примечание.
Записи должны быть возобновлены для создания файла записи.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or 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. Только для неизмененных - Укажите пользователя на канале 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or 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. Только для несмешанных данных— указание сходства каналов
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 Ответ API содержит recordingId, связанный с сеансом записи.
3. Остановка сеанса записи с помощью stopWithResponse API
Используйте recordingId, полученный в ответ на startWithResponse.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Приостановка сеанса записи с помощью pauseWithResponse API
Используйте recordingId, полученный в ответ на startWithResponse.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Возобновление сеанса записи с помощью resumeWithResponse API
Используйте recordingId, полученный в ответ на startWithResponse.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Скачивание файла записи с помощью downloadToWithResponse API
Используйте веб-перехватчик Службы Azure Event Grid или другое активированное действие, чтобы уведомить ваши службы о готовности записанного медиафайла для скачивания.
Уведомление Microsoft.Communication.RecordingFileStatusUpdated сетки событий публикуется, когда запись готова к получению, обычно через несколько минут после завершения процесса записи (например, окончание собрания или остановка записи). Уведомления о событиях записей включают contentLocation и metadataLocation, которые можно использовать для извлечения записанных медиафайлов и метаданных записи.
Следующий код является примером схемы события.
{
"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
}
Используйте downloadToWithResponse метод CallRecording класса, чтобы скачать записанный носитель. Ниже приведены поддерживаемые параметры для метода downloadToWithResponse.
-
contentLocation: URL-адрес Службы коммуникации Azure, где находится содержимое. -
destinationPath— расположение файла. -
parallelDownloadOptions: необязательныйParallelDownloadOptionsобъект для изменения работы параллельного скачивания. -
overwrite— значение true для перезаписи файла, если он существует. -
context: Контекст, представляющий контекст запроса.
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);
Расположение содержимого и идентификаторы документов для файлов записей можно получить из полей contentLocation и documentId соответственно для каждого элемента recordingChunk.
7. Удаление содержимого записи с помощью deleteWithResponse API
Используйте deleteWithResponse метод CallRecording класса для удаления записываемого носителя. Поддерживаемые параметры для deleteWithResponse метода:
-
deleteLocation: URL-адрес Службы коммуникации Azure, где находится содержимое для удаления. -
context: Контекст, представляющий контекст запроса.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
Расположение удаления записи можно получить из deleteLocation поля события сетки событий.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
- Подпишитесь на события с помощью Сетка событий Azure.
- Python версии 3.7 и выше.
Перед началом работы
API записи вызовов используют callConnectionId или serverCallId для инициирования записи. Существует несколько методов, которые можно использовать для получения этих идентификаторов в зависимости от вашего сценария:
Как получить callConnectionId
При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.
Получение serverCallId
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId:
Когда вы устанавливаете вызов,
serverCallIdвозвращается как свойство событияCallConnectedпосле того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.При ответе на вызов или при его создании, он возвращается как
serverCallIdв качестве свойства ответовAnswerCallResultили APICreateCallResultсоответственно.
При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Запуск сеанса записи start_recording API
Используйте callConnectionId или serverCallId, полученные во время запуска вызова.
- Используется
RecordingContentдля передачи типа контента записи. ИспользуйтеAUDIO. - Используется
RecordingChannelдля передачи типа канала записи. ИспользуйтеMIXEDилиUNMIXED. - Используется
RecordingFormatдля передачи формата записи. ИспользуйтеWAV.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or 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. Начало записи. Создание собственного хранилища BLOB-объектов Azure
Начните запись, используя собственное хранилище BLOB-ов Azure, предназначенное для хранения файла после завершения записи.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or 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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or 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. Только для не смешанных - укажите пользователя на канале 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу по мере их выступления. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or 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. Только для несмешанных — указание привязки каналов
_channel_affinity = ChannelAffinity(target_participant=CommunicationUserIdentifier("<ACS_USER_MRI>"), channel=0)
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or 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 Ответ API содержит данные сеанса записи recordingId.
3. Остановка сеанса записи с помощью API stop_recording
Используйте recording_id, полученный в ответ на start_recording.
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. Приостановка сеанса записи с помощью API pause_recording
Используйте recording_id, полученный в ответ на start_recording.
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. Возобновление сеанса записи с помощью API resume_recording
Используйте recording_id, полученное в ответ на start_recording.
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. Скачивание файла записи с помощью API download_recording
Используйте веб-перехватчик Azure Event Grid или другое триггерное действие, чтобы уведомить ваши службы о готовности записанного материала для загрузки.
Уведомление Microsoft.Communication.RecordingFileStatusUpdated сетки событий публикуется, когда запись готова к получению, как правило, через несколько минут после завершения процесса записи (например, завершение собрания или остановка записи). Уведомления о событиях записи включают contentLocation и metadataLocation, которые можно использовать для получения как записанного носителя, так и файла метаданных записи.
Следующий код является примером схемы события.
{
"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
}
С помощью download_recording API можно скачать записанный носитель.
response = recording_data = call_automation_client.download_recording(content_location)
with open("<file_name>", "wb") as binary_file:
binary_file.write(recording_data.read())
Запись downloadLocation может быть получена из contentLocation атрибута объекта recordingChunk. Используйте метод download_recording, чтобы скачать содержимое в виде байтов.
7. Удаление содержимого записи с помощью API delete_recording
Используйте delete_recording API для удаления содержимого записи, например записанных носителей и метаданных.
response = call_automation_client.delete_recording(delete_location);
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
- Подпишитесь на события с помощью Сетка событий Azure.
- Node.js Активные и версии поддержки LTS (рекомендуемые: 8.11.1 и 10.14.1)
Перед началом работы
API записи вызовов используют callConnectionId или serverCallId для инициирования записи. Существует несколько методов, которые можно использовать для получения этих идентификаторов в зависимости от вашего сценария:
Как получить callConnectionId
При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.
Получение serverCallId
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId:
Когда вы устанавливаете вызов,
serverCallIdвозвращается как свойство событияCallConnectedпосле того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.При ответе на вызов или создании вызова, он возвращается как свойство ответов
AnswerCallResultилиCreateCallResultAPI соответственно.
При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
Используйте callConnectionId или serverCallId, полученные во время запуска вызова.
- Используется
RecordingContentдля передачи типа контента записи. ИспользуйтеAUDIO. - Используется
RecordingChannelдля передачи типа канала записи. ИспользуйтеMIXEDилиUNMIXED. - Используется
RecordingFormatдля передачи формата записи. ИспользуйтеWAV.
var locator: CallLocator = { id: "<callConnectionId> or <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. Начать запись - Используйте собственное хранилище BLOB-объектов Azure
Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.
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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
var locator: CallLocator = { id: "<callConnectionId> or <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. Только для неизмененных - Укажите пользователя на канале 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.
var locator: CallLocator = { id: "<callConnectionId> or <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. Только для несмешанных данных— указание сходства каналов
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 Ответ API содержит recordingId, связанный с сеансом записи.
3. Остановка сеанса записи с помощью API stop
Используйте recordingId, полученное в ответ на start запрос.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Приостановка сеанса записи с помощью API приостановки
Используйте recordingId, полученный в ответ на start.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Возобновление сеанса записи с помощью API ResumeAsync
Используйте recordingId, полученный в ответ на start.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Скачивание файла записи с помощью API DownloadToAsync
Используйте веб-перехватчик Службы Azure Event Grid или другое активированное действие, чтобы уведомить ваши службы о готовности записанного медиафайла для скачивания.
Уведомление Microsoft.Communication.RecordingFileStatusUpdated сетки событий публикуется, когда запись готова к получению, как правило, через несколько минут после завершения процесса записи (например, завершение собрания или остановка записи). Уведомления о событиях записи включают contentLocation и metadataLocation, которые можно использовать для получения как записанного носителя, так и файла метаданных записи.
Следующий код является примером схемы события.
{
"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
}
С помощью downloadToPath API можно скачать записанный носитель.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
Получить downloadLocation для записи можно из атрибута contentLocation объекта recordingChunk. Используйте метод DownloadToAsync, чтобы скачать содержимое в указанный файл.
7. Удаление содержимого записи с помощью API DeleteAsync
Используйте delete API для удаления содержимого записи (например, записанных носителей, метаданных)
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.
Следующие шаги
Дополнительные сведения см. в следующих статьях:
- Скачайте примеры приложений для записи вызовов Java, Python и JavaScript .
- Дополнительные сведения о записи звонков.
- Дополнительные сведения об автоматизации вызовов.