Поделиться через


Краткое руководство по записи звонков

В этом кратком руководстве описано, как начать запись звонков для голосовых и видеозвонков. Чтобы начать использование API записи вызовов, необходимо выполнить вызов. Убедитесь, что вы знакомы с пакетом SDK для клиента вызовов и (или) службой автоматизации вызовов для создания интерфейса вызова конечных пользователей.

Пример кода

Пример приложения можно скачать в репозитории GitHub.

Необходимые компоненты

Перед началом работы

API записи вызовов используют исключительно serverCallIdдля запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId в зависимости от вашего сценария:

Сценарии автоматизации вызовов

  • При использовании службы автоматизации вызовов можно получить два варианта:serverCallId
    1. После создания serverCallId вызова возвращается как свойство CallConnected события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов.
    2. После ответа на вызов или вызов serverCallId возвращается в качестве свойства AnswerCallResultCreateCallResult ответов 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.UnmixedAudioChannelParticipantOrdering, запись звонков назначает канал 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.

Необходимые компоненты

Перед началом работы

API записи вызовов используют исключительно serverCallIdдля запуска записи. Существует несколько методов, которые можно использовать для получения serverCallId в зависимости от вашего сценария:

Сценарии автоматизации вызовов

  • При использовании службы автоматизации вызовов можно получить два варианта:serverCallId
    1. После создания serverCallId вызова возвращается как свойство CallConnected события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов.
    2. После ответа на вызов или вызов serverCallId возвращается в качестве свойства AnswerCallResultCreateCallResult ответов 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.UnmixedAudioChannelParticipantOrdering, запись звонков назначит канал 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
    1. После создания serverCallId вызова возвращается как свойство CallConnected события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов.
    2. После ответа на вызов или вызов serverCallId возвращается в качестве свойства AnswerCallResultCreateCallResult ответов 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.UnmixedAudioChannelParticipantOrdering, запись звонков назначит канал 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
    1. После создания serverCallId вызова возвращается как свойство CallConnected события после установки вызова. Узнайте, как получить событие Подключение ed из пакета SDK службы автоматизации вызовов.
    2. После ответа на вызов или вызов serverCallId возвращается в качестве свойства AnswerCallResultCreateCallResult ответов 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.UnmixedAudioChannelParticipantOrdering, запись звонков назначит канал 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);

Очистка ресурсов

Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.

Следующие шаги

Дополнительные сведения см. в следующих статьях: