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


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

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

Пример кода

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

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

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

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

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

При использовании службы автоматизации вызовов можно получить два варианта:serverCallId

  1. При установке вызова он возвращается serverCallId как свойство CallConnected события после установки вызова. Узнайте, как получить событие CallConnected из пакета 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 для передачи типа контента записи. Используйте 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. Начало записи. Создание собственного хранилища 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>"))
    ExternalStorage = new BlobStorage(new Uri("<Insert Container / Blob Uri>"))
};
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. Остановка сеанса записи с помощью StopAsync API

recordingId Используйте полученный в ответ на StartAsyncзапрос .

var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);

4. Приостановка сеанса записи с помощью PauseAsync API

recordingId Используйте полученный в ответ на StartAsyncзапрос .

var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);

5. Возобновление сеанса записи с помощью ResumeAsync API

recordingId Используйте полученный в ответ на StartAsyncзапрос .

var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);

6. Скачивание файла записи с помощью DownloadToAsync API

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

Уведомление Microsoft.Communication.RecordingFileStatusUpdated сетки событий публикуется, когда запись готова к получению, обычно через несколько минут после завершения обработки записи (например, при завершении собрания или остановке записи). Уведомления о событиях записей включают contentLocation и metadataLocation, которые можно использовать для получения записанных носителей и файла метаданных записи.

Пример схемы события:

{
    "id": string, // Unique guid for event
    "topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
    "subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for the recording chunk
                    "contentLocation": string, //Azure Communication Services URL where the content is located
                    "metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
                    "deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                }
            ]
        },
        "recordingStartTime": string, // ISO 8601 date time for the start of the recording
        "recordingDurationMs": int, // Duration of recording in milliseconds
        "sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
    },
    "eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
    "dataVersion": string, // "1.0"
    "metadataVersion": string, // "1"
    "eventTime": string // ISO 8601 date time for when the event was created
}

С помощью DownloadToAsync API можно скачать записанный носитель.

var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);

downloadLocation Получение записи из contentLocation атрибута recordingChunkобъекта . DownloadToAsync Используйте метод для скачивания содержимого в предоставленное имя файла.

7. Удаление содержимого записи с помощью DeleteAsync API

Используйте DeleteAsync API для удаления содержимого записи (например, записанных носителей и метаданных).

var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);

Пример кода

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

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

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

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

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

При использовании службы автоматизации вызовов можно получить два варианта:serverCallId

  1. После создания serverCallId вызова возвращается как свойство CallConnected события после установки вызова. Узнайте, как получить событие CallConnected из пакета SDK службы автоматизации вызовов.

  2. После ответа на вызов или вызов serverCallId возвращается в качестве свойства AnswerCallResultCreateCallResult ответов API соответственно.

Вызов сценариев пакета SDK

При использовании пакета 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. Начало записи. Создание собственного хранилища 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>"))
        .setExternalStorage(new BlobStorage("<Insert Container / Blob Uri>"));
 
       // //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. Только для незамеченных. Укажите пользователя на канале 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. Остановка сеанса записи с помощью stopWithResponse API

recordingId Используйте полученный в ответ на startWithResponseзапрос .

Response<Void> response = callAutomationClient.getCallRecording()
               .stopWithResponse(response.getValue().getRecordingId(), null);

4. Приостановка сеанса записи с помощью pauseWithResponse API

recordingId Используйте полученный в ответ на startWithResponseзапрос .

Response<Void> response = callAutomationClient.getCallRecording()
              .pauseWithResponse(response.getValue().getRecordingId(), null);

5. Возобновление сеанса записи с помощью resumeWithResponse API

recordingId Используйте полученный в ответ на startWithResponseзапрос .

Response<Void> response = callAutomationClient.getCallRecording()
               .resumeWithResponse(response.getValue().getRecordingId(), null);

6. Скачивание файла записи с помощью downloadToWithResponse API

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

Уведомление 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. Удаление содержимого записи с помощью deleteWithResponse API

Используйте 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 события после установки вызова. Узнайте, как получить событие CallConnected из пакета 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 для передачи типа контента записи. Используйте 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. Начало записи. Создание собственного хранилища 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 события после установки вызова. Узнайте, как получить событие CallConnected из пакета 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 для передачи типа контента записи. Используйте 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. Начало записи. Создание собственного хранилища 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);

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

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

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

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