Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается запись звонков для голосовых и видеозвонков. To start using the Call Recording APIs, you must have a call in place. Чтобы создать интерфейс вызова конечных пользователей, убедитесь, что вы знакомы с пакетом SDK для клиента вызовов и автоматизацией вызовов.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Record your resource connection string.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для .NET
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId
:
When you establish a call, it returns a
serverCallId
as a property of theCallConnected
event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK.When you answer the call or a call is created, it returns the
serverCallId
as a property of theAnswerCallResult
orCreateCallResult
API responses respectively.
Вызов сценариев SDK
При использовании Calling Client SDK можно получить serverCallId
с помощью метода getServerCallId
при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
Используйте serverCallId
, полученный во время инициации вызова.
- Используется
RecordingContent
для передачи типа контента записи. ИспользуйтеAUDIO
. - Используется
RecordingChannel
для передачи типа канала записи. ИспользуйтеMIXED
илиUNMIXED
. - Используется
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. Start Recording - Bring Your Own Azure Blob Store
Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.
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. Only for Unmixed - Specify a user on channel 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете 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. Only for Unmixed - Specify channel affinity
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);
The StartAsync
API response contains the recordingId
of the recording session.
3. Остановка сеанса записи с помощью StopAsync
API
Use the recordingId
received in response to StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Приостановка сеанса записи с помощью PauseAsync
API
Use the recordingId
received in response to StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Возобновление сеанса записи с помощью ResumeAsync
API
Use the recordingId
received in response to 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);
Fetch the downloadLocation
for the recording from the contentLocation
attribute of the recordingChunk
. Use the DownloadToAsync
method to download the content into a provided filename.
7. Удаление содержимого записи с помощью DeleteAsync
API
Используйте DeleteAsync
API для удаления содержимого записи (например, записанных носителей и метаданных).
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Record your resource connection string.
- Подпишитесь на события с помощью Сетка событий Azure.
- Скачивание пакета SDK для Java
Перед началом работы
API записи вызовов используют serverCallId
исключительно для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
При использовании Автоматизация вызовов у вас есть два способа получить serverCallId
:
Once a call is created, a
serverCallId
is returned as a property of theCallConnected
event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK.Once you answer the call or a call is created the
serverCallId
is returned as a property of theAnswerCallResult
orCreateCallResult
API responses respectively.
Вызов сценариев SDK
При использовании Calling Client SDK можно получить serverCallId
с помощью метода getServerCallId
при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов.
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью startWithResponse
API
Используйте 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. Start Recording - Bring Your Own Azure Blob Store
Начните запись, используя указанное 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("<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. Only for Unmixed - Specify a user on channel 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете 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. Only for Unmixed - Specify channel affinity
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);
The startWithResponse
API response contains the recordingId
of the recording session.
3. Остановка сеанса записи с помощью stopWithResponse
API
Use the recordingId
received in response to startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Приостановка сеанса записи с помощью pauseWithResponse
API
Use the recordingId
received in response to startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Возобновление сеанса записи с помощью resumeWithResponse
API
Use the recordingId
received in response to startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Скачивание файла записи с помощью downloadToWithResponse
API
Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.
Уведомление 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
: A Context representing the request 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
: A Context representing the request context.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
Расположение удаления записи можно получить из deleteLocation
поля события сетки событий.
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Record your resource connection string.
- Подпишитесь на события с помощью Сетка событий Azure.
- Python версии 3.7 и выше.
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании Автоматизации вызовов, у вас есть два варианта, чтобы получить
serverCallId
:- Once a call is created, a
serverCallId
is returned as a property of theCallConnected
event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK. - Once you answer the call or a call is created, it returns the
serverCallId
as a property of theAnswerCallResult
orCreateCallResult
API responses respectively.
- Once a call is created, a
Вызов сценариев SDK
- When using Calling Client SDK, you can retrieve the
serverCallId
by using theserver_call_id
variable on the call. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient
.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Запуск сеанса записи start_recording API
Используйте serverCallId
, полученный во время инициации вызова.
- Используется
RecordingContent
для передачи типа контента записи. ИспользуйтеAUDIO
. - Используется
RecordingChannel
для передачи типа канала записи. ИспользуйтеMIXED
илиUNMIXED
. - Используется
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. Start Recording - Bring Your Own Azure Blob Store
Начните запись, используя собственное хранилище 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. Only for Unmixed - Specify a user on channel 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете 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. Only for Unmixed - Specify channel affinity
_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])
The StartAsync
API response contains the recordingId
of the recording session.
3. Остановка сеанса записи с помощью API stop_recording
Use the recording_id
received in response to start_recording
.
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. Приостановка сеанса записи с помощью API pause_recording
Use the recording_id
received in response to start_recording
.
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. Возобновление сеанса записи с помощью API resume_recording
Use the recording_id
received in response to start_recording
.
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. Скачивание файла записи с помощью API download_recording
Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.
Уведомление 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())
The downloadLocation
for the recording can be fetched from the contentLocation
attribute of the recordingChunk
. Используйте метод download_recording
, чтобы скачать содержимое в виде байтов.
7. Удаление содержимого записи с помощью API delete_recording
Используйте delete_recording
API для удаления содержимого записи, например записанных носителей и метаданных.
response = call_automation_client.delete_recording(delete_location);
Пример кода
Пример приложения можно скачать в репозитории GitHub.
Предварительные условия
- Вам потребуется учетная запись Azure с активной подпиской.
- Развертывание ресурса службы коммуникации. Record your resource connection string.
- Подпишитесь на события с помощью Сетка событий Azure.
- Node.js Active LTS and Maintenance LTS versions (8.11.1 and 10.14.1 recommended)
Перед началом работы
API записи вызовов используют исключительно serverCallId
для запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId
в зависимости от вашего сценария:
Сценарии автоматизации вызовов
- При использовании Автоматизации вызовов, у вас есть два варианта, чтобы получить
serverCallId
:- Once a call is created, a
serverCallId
is returned as a property of theCallConnected
event after a call is established. Узнайте, как из пакета SDK для автоматизации вызовов получить событие CallConnected. - Once you answer the call or a call is created, it returns the
serverCallId
as a property of theAnswerCallResult
orCreateCallResult
API responses respectively.
- Once a call is created, a
Вызов сценариев SDK
При использовании Calling Client SDK можно получить serverCallId
с помощью метода getServerCallId
при вызове.
Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.
Давайте начнем с нескольких простых шагов!
1. Создание клиента автоматизации вызовов
API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Таким образом, необходимо создать клиент службы автоматизации вызовов.
Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient
.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync
Используйте serverCallId
, полученный во время инициации вызова.
- Используется
RecordingContent
для передачи типа контента записи. ИспользуйтеAUDIO
. - Используется
RecordingChannel
для передачи типа канала записи. ИспользуйтеMIXED
илиUNMIXED
. - Используется
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. Start Recording - Bring Your Own Azure Blob Store
Начните запись, используя указанное 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: "<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. Only for Unmixed - Specify a user on channel 0
Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering
функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете 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. Only for Unmixed - Specify channel affinity
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);
The StartAsync
API response contains the recordingId
of the recording session.
3. Остановка сеанса записи с помощью API stop
Use the recordingId
received in response to start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Приостановка сеанса записи с помощью API приостановки
Use the recordingId
received in response to start
.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Возобновление сеанса записи с помощью API ResumeAsync
Use the recordingId
received in response to start
.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Скачивание файла записи с помощью API DownloadToAsync
Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.
Уведомление 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);
The downloadLocation
for the recording can be fetched from the contentLocation
attribute of the recordingChunk
. Use the DownloadToAsync
method to download the content into a provided filename.
7. Удаление содержимого записи с помощью API DeleteAsync
Используйте delete
API для удаления содержимого записи (например, записанных носителей, метаданных)
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.
Следующие шаги
Дополнительные сведения см. в следующих статьях:
- Скачайте примеры приложений для записи вызовов Java, Python и JavaScript .
- Дополнительные сведения о записи звонков.
- Дополнительные сведения об автоматизации вызовов.