Краткое руководство по записи звонков
В этом кратком руководстве описано, как начать запись звонков для голосовых и видеозвонков. Чтобы начать использование API записи вызовов, необходимо выполнить вызов. Убедитесь, что вы знакомы с пакетом SDK для клиента вызовов и (или) службой автоматизации вызовов для создания интерфейса вызова конечных пользователей.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Необходимые компоненты
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строка подключения ресурса.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для .NET
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании службы автоматизации вызовов можно получить два варианта:
serverCallId
- После создания
serverCallId
вызова возвращается как свойствоCallConnected
события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов. - После ответа на вызов или вызов
serverCallId
возвращается в качестве свойстваAnswerCallResult
CreateCallResult
ответов API соответственно.
- После создания
Вызов сценариев пакета SDK
- При использовании пакета SDK для вызывающего клиента можно получить
serverCallId
с помощьюgetServerCallId
метода в вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиент автоматизации вызовов, используйте строка подключения служб коммуникации и передайте его в CallAutomationClient
объект.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
serverCallId
Используйте полученный во время запуска вызова.
- RecordingContent используется для передачи типа содержимого записи. Использование звука
- RecordingChannel используется для передачи типа канала записи. Используйте смешанные или несмешанные.
- RecordingFormat используется для передачи формата записи. Используйте wav.
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. Начало записи. Создание собственного хранилища BLOB-объектов Azure
Начните запись с собственной Хранилище BLOB-объектов Azure, определенной для хранения файла записи после завершения записи.
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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
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. Только для незамеченных. Укажите пользователя на канале 0
Чтобы создать неисправные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функцию, чтобы указать, какой пользователь требуется записать на канале 0. Остальные участники назначаются каналу, как они говорят. Если вы используете, но не используете RecordingChannel.Unmixed
AudioChannelParticipantOrdering
, запись звонков назначает канал 0 первому участнику.
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. Только для несмешанных данных— указание сходства каналов
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
Ответ API содержит recordingId
сеанс записи.
3. Остановка сеанса записи с помощью API StopAsync
recordingId
Используйте полученный ответStartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Приостановка сеанса записи с помощью API "PauseAsync"
recordingId
Используйте полученный ответStartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Возобновление сеанса записи с помощью API ResumeAsync
recordingId
Используйте полученный ответStartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Скачивание файла записи с помощью API DownloadToAsync
Для уведомления служб о том, что записанный файл готов к скачиванию, используется веб-перехватчик службы Сетка событий Azure или другое инициируемое действие.
Уведомление 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. Удаление содержимого записи с помощью API DeleteAsync
Используйте DeleteAsync
API для удаления содержимого записи (например, записанных носителей, метаданных)
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Необходимые компоненты
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строка подключения ресурса.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для Java
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании службы автоматизации вызовов можно получить два варианта:
serverCallId
- После создания
serverCallId
вызова возвращается как свойствоCallConnected
события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов. - После ответа на вызов или вызов
serverCallId
возвращается в качестве свойстваAnswerCallResult
CreateCallResult
ответов API соответственно.
- После создания
Вызов сценариев пакета SDK
- При использовании пакета SDK для вызывающего клиента можно получить
serverCallId
с помощьюgetServerCallId
метода в вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиент автоматизации вызовов, вы будете использовать строка подключения служб коммуникации и передайте его в CallAutomationClient
объект.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API startWithResponse
serverCallId
Используйте полученный во время запуска вызова.
- RecordingContent используется для передачи типа содержимого записи. Использование AUDIO
- RecordingChannel используется для передачи типа канала записи. Используйте MIXED или UNMIXED.
- RecordingFormat используется для передачи формата записи. Используйте WAV.
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. Начало записи. Создание собственного хранилища BLOB-объектов Azure
Запустите сеанс записи с собственным Хранилище BLOB-объектов Azure, чтобы сохранить файл записи после завершения записи.
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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
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. Только для незамеченных. Укажите пользователя на канале 0
Чтобы создать неисправные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функцию, чтобы указать, какой пользователь требуется записать на канале 0. Остальные участники будут назначены каналу, как они говорят. Если вы используете, но не используете RecordingChannel.Unmixed
AudioChannelParticipantOrdering
, запись звонков назначит канал 0 первому участнику.
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. Только для несмешанных данных— указание сходства каналов
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. Остановка сеанса записи с помощью API stopWithResponse
recordingId
Используйте полученный ответstartWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Приостановка сеанса записи с помощью API pauseWithResponse
recordingId
Используйте полученный ответstartWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Возобновление сеанса записи с помощью API resumeWithResponse
recordingId
Используйте полученный ответstartWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Скачивание файла записи с помощью API downloadToWithResponse
Для уведомления служб о том, что записанный файл готов к скачиванию, используется веб-перехватчик службы Сетка событий Azure или другое инициируемое действие.
Уведомление 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
: Службы коммуникации Azure URL-адрес, в котором находится содержимое.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. Удаление содержимого записи с помощью API deleteWithResponse.
Используйте deleteWithResponse
метод CallRecording
класса для удаления записываемого носителя. Ниже приведены поддерживаемые параметры для метода deleteWithResponse
.
deleteLocation
: Службы коммуникации Azure URL-адрес, в котором находится содержимое для удаления.context
— контекст, представляющий контекст запроса.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
Расположение удаления записи можно получить из deleteLocation
поля события сетки событий.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Необходимые компоненты
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Запишите строка подключения ресурса.
- Подпишитесь на события с помощью Сетка событий Azure.
- Python версии 3.7 и выше.
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании службы автоматизации вызовов можно получить два варианта:
serverCallId
- После создания
serverCallId
вызова возвращается как свойствоCallConnected
события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов. - После ответа на вызов или вызов
serverCallId
возвращается в качестве свойстваAnswerCallResult
CreateCallResult
ответов API соответственно.
- После создания
Вызов сценариев пакета SDK
- При использовании пакета SDK для вызова клиента можно получить
serverCallId
с помощью переменнойserver_call_id
в вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиент автоматизации вызовов, вы будете использовать строка подключения служб коммуникации и передайте его в CallAutomationClient
объект.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Запуск сеанса записи start_recording API
serverCallId
Используйте полученный во время запуска вызова.
- RecordingContent используется для передачи типа содержимого записи. Использование звука
- RecordingChannel используется для передачи типа канала записи. Используйте смешанные или несмешанные.
- RecordingFormat используется для передачи формата записи. Используйте wav.
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. Начало записи. Создание собственного хранилища BLOB-объектов Azure
Начните запись с собственной Хранилище BLOB-объектов Azure, определенной для хранения файла записи после завершения записи.
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. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync
Примечание.
Записи должны быть возобновлены для создания файла записи.
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. Только для незамеченных. Укажите пользователя на канале 0
Чтобы создать неисправные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функцию, чтобы указать, какой пользователь требуется записать на канале 0. Остальные участники будут назначены каналу, как они говорят. Если вы используете, но не используете RecordingChannel.Unmixed
AudioChannelParticipantOrdering
, запись звонков назначит канал 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>",
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(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 или другое инициируемое действие.
Уведомление 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 и обслуживания LTS (рекомендуется 8.11.1 и 10.14.1)
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании службы автоматизации вызовов можно получить два варианта:
serverCallId
- После создания
serverCallId
вызова возвращается как свойствоCallConnected
события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов. - После ответа на вызов или вызов
serverCallId
возвращается в качестве свойстваAnswerCallResult
CreateCallResult
ответов API соответственно.
- После создания
Вызов сценариев пакета SDK
- При использовании пакета SDK для вызывающего клиента можно получить
serverCallId
с помощьюgetServerCallId
метода в вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиент автоматизации вызовов, вы будете использовать строка подключения служб коммуникации и передайте его в CallAutomationClient
объект.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
serverCallId
Используйте полученный во время запуска вызова.
- RecordingContent используется для передачи типа содержимого записи. Использование звука
- RecordingChannel используется для передачи типа канала записи. Используйте смешанные или несмешанные.
- RecordingFormat используется для передачи формата записи. Используйте wav.
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. Начало записи. Создание собственного хранилища BLOB-объектов Azure
Начните запись с собственной Хранилище BLOB-объектов Azure, определенной для хранения файла записи после завершения записи.
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: "<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: "<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 или другое инициируемое действие.
Уведомление 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
- Дополнительные сведения о записи звонков
- Дополнительные сведения об автоматизации вызовов