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


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

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

Пример кода

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

Предварительные условия

  • Вам потребуется учетная запись Azure с активной подпиской.
  • Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
  • Подпишитесь на события с помощью Сетка событий Azure.
  • Скачивание пакета SDK для .NET

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

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

Как получить callConnectionId

При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.

Получение serverCallId

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

  1. Когда вы устанавливаете вызов, serverCallId возвращается как свойство события CallConnected после того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. При ответе на вызов или создании вызова, он возвращается как свойство ответов AnswerCallResult или CreateCallResult API соответственно.

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.

Давайте начнем с нескольких простых шагов.

1. Создание клиента автоматизации вызовов

API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.

Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.

CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");

2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync

Используйте callConnectionId или serverCallId, полученные во время запуска вызова.

  • Используется RecordingContent для передачи типа контента записи. Используйте AUDIO.
  • Используется RecordingChannel для передачи типа канала записи. Используйте MIXED или UNMIXED.
  • Используется RecordingFormat для передачи формата записи. Используйте WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.1. Начать запись - Используйте собственное хранилище BLOB-объектов Azure

Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>"))
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>"),
    RecordingStorage = RecordingStorage.CreateAzureBlobContainerRecordingStorage(new Uri("<YOUR_STORAGE_CONTAINER_URL>"))
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.2. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync

Примечание.

Записи должны быть возобновлены для создания файла записи.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    PauseOnStart = true,
    RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.3. Только для неизмененных - Укажите пользователя на канале 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>"),
    AudioChannelParticipantOrdering = { new CommunicationUserIdentifier("<ACS_USER_MRI>") }
    
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);

2.4. Только для несмешанных данных— указание сходства каналов

var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>"))
{
   RecordingContent = RecordingContent.Audio,
   RecordingChannel = RecordingChannel.Unmixed,
   RecordingFormat = RecordingFormat.Wav,
   RecordingStateCallbackUri = new Uri("<CallbackUri>"),
   ChannelAffinity = new List<ChannelAffinity>{ channelAffinity }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);

StartAsync Ответ API содержит recordingId, связанный с сеансом записи.

3. Остановка сеанса записи с помощью StopAsync API

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример кода

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

Предварительные условия

  • Вам потребуется учетная запись Azure с активной подпиской.
  • Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
  • Подпишитесь на события с помощью Сетка событий Azure.
  • Скачивание пакета SDK для Java

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

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

Как получить callConnectionId

При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.

Получение serverCallId

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

  1. Когда вы устанавливаете вызов, serverCallId возвращается как свойство события CallConnected после того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. При ответе на вызов или создании вызова, он возвращается как свойство ответов AnswerCallResult или CreateCallResult API соответственно.

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.

Давайте начнем с нескольких простых шагов.

1. Создание клиента автоматизации вызовов

API записи вызовов являются частью библиотек автоматизации вызовов Службы коммуникации Azure. Поэтому необходимо создать клиент службы автоматизации вызовов.

Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.

CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
            .connectionString("<acsConnectionString>")
            .buildClient();

2. Запуск сеанса записи с помощью StartRecordingOptions с помощью startWithResponse API

Используйте callConnectionId или serverCallId, полученные во время запуска вызова.

  • Используется RecordingContent для передачи типа контента записи. Используйте AUDIO.
  • Используется RecordingChannel для передачи типа канала записи. Используйте MIXED или UNMIXED.
  • Используется RecordingFormat для передачи формата записи. Используйте WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.1. Начать запись - Используйте собственное хранилище BLOB-объектов Azure

Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.

        StartRecordingOptions recordingOptions = new StartRecordingOptions(callLocator)
        .setRecordingChannel(RecordingChannel.MIXED)
        .setRecordingContent(RecordingContent.AUDIO_VIDEO)
        .setRecordingFormat(RecordingFormat.MP4)
        .setRecordingStorage(new AzureBlobContainerRecordingStorage("<YOUR_STORAGE_CONTAINER_URL>"));
 
       // //start recording
       RecordingStateResult result = callRecording.start(recordingOptions);

2.2. Запуск сеанса записи с включенным режимом приостановки с помощью StartAsync API

Примечание.

Записи должны быть возобновлены для создания файла записи.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
                    .setPauseOnStart(true)
                    .setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.3. Только для неизмененных - Укажите пользователя на канале 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
                    .setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.4. Только для несмешанных данных— указание сходства каналов

ChannelAffinity channelAffinity = new ChannelAffinity()
.setParticipant(new PhoneNumberIdentifier("RECORDING_ID"))
.setChannel(0);
List<ChannelAffinity> channelAffinities = Arrays.asList(channelAffinity);

StartRecordingOptions startRecordingOptions = new StartRecordingOptions(new ServerCallLocator(SERVER_CALL_ID))
   .setRecordingChannel(RecordingChannel.UNMIXED)
   .setRecordingFormat(RecordingFormat.WAV)
   .setRecordingContent(RecordingContent.AUDIO)
   .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
   .setChannelAffinity(channelAffinities);
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startRecordingWithResponse(recordingOptions, null);

startWithResponse Ответ API содержит recordingId, связанный с сеансом записи.

3. Остановка сеанса записи с помощью stopWithResponse API

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

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

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

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

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

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

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

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

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

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

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

Следующий код является примером схемы события.

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

Используйте downloadToWithResponse метод CallRecording класса, чтобы скачать записанный носитель. Ниже приведены поддерживаемые параметры для метода downloadToWithResponse.

  • contentLocation: URL-адрес Службы коммуникации Azure, где находится содержимое.
  • destinationPath — расположение файла.
  • parallelDownloadOptions: необязательный ParallelDownloadOptions объект для изменения работы параллельного скачивания.
  • overwrite — значение true для перезаписи файла, если он существует.
  • context: Контекст, представляющий контекст запроса.
Boolean overwrite = true;
ParallelDownloadOptions parallelDownloadOptions = null;
Context context = null;

String filePath = String.format(".\\%s.%s", documentId, fileType);
Path destinationPath = Paths.get(filePath);

Response<Void> downloadResponse = callAutomationClient.getCallRecording().downloadToWithResponse(contentLocation, destinationPath, parallelDownloadOptions, overwrite, context);

Расположение содержимого и идентификаторы документов для файлов записей можно получить из полей contentLocation и documentId соответственно для каждого элемента recordingChunk.

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

Используйте deleteWithResponse метод CallRecording класса для удаления записываемого носителя. Поддерживаемые параметры для deleteWithResponse метода:

  • deleteLocation: URL-адрес Службы коммуникации Azure, где находится содержимое для удаления.
  • context: Контекст, представляющий контекст запроса.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

Расположение удаления записи можно получить из deleteLocation поля события сетки событий.

Пример кода

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

Предварительные условия

  • Вам потребуется учетная запись Azure с активной подпиской.
  • Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
  • Подпишитесь на события с помощью Сетка событий Azure.
  • Python версии 3.7 и выше.

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

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

Как получить callConnectionId

При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.

Получение serverCallId

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

  1. Когда вы устанавливаете вызов, serverCallId возвращается как свойство события CallConnected после того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. При ответе на вызов или при его создании, он возвращается как serverCallId в качестве свойства ответов AnswerCallResult или API CreateCallResult соответственно.

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.

Давайте начнем с нескольких простых шагов.

1. Создание клиента автоматизации вызовов

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

Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.

call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")

2. Запуск сеанса записи start_recording API

Используйте callConnectionId или serverCallId, полученные во время запуска вызова.

  • Используется RecordingContent для передачи типа контента записи. Используйте AUDIO.
  • Используется RecordingChannel для передачи типа канала записи. Используйте MIXED или UNMIXED.
  • Используется RecordingFormat для передачи формата записи. Используйте WAV.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>")

2.1. Начало записи. Создание собственного хранилища BLOB-объектов Azure

Начните запись, используя собственное хранилище BLOB-ов Azure, предназначенное для хранения файла после завершения записи.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
                   recording_content_type = RecordingContent.Audio,
                   recording_channel_type = RecordingChannel.Unmixed,
                   recording_format_type = RecordingFormat.Wav,
                   recording_state_callback_url = "<CallbackUri>",
                   recording_storage = AzureBlobContainerRecordingStorage(container_url="<YOUR_STORAGE_CONTAINER_URL>"))

2.2. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync

Примечание.

Записи должны быть возобновлены для создания файла записи.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            pause_on_start = true,
            recording_state_callback_url = "<CallbackUri>")

2.3. Только для не смешанных - укажите пользователя на канале 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу по мере их выступления. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>",
            audio_channel_participant_ordering=[CommunicationUserIdentifier(id="<ACS_USER_MRI>")])

2.4. Только для несмешанных — указание привязки каналов

_channel_affinity = ChannelAffinity(target_participant=CommunicationUserIdentifier("<ACS_USER_MRI>"), channel=0)

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>",
            channel_affinity=[_channel_affinity])

StartAsync Ответ API содержит данные сеанса записи recordingId.

3. Остановка сеанса записи с помощью API stop_recording

Используйте recording_id, полученный в ответ на start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

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

Используйте recording_id, полученный в ответ на start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

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

Используйте recording_id, полученное в ответ на start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

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

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

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

Следующий код является примером схемы события.

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

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

response = recording_data = call_automation_client.download_recording(content_location)

with open("<file_name>", "wb") as binary_file:
    binary_file.write(recording_data.read())

Запись downloadLocation может быть получена из contentLocation атрибута объекта recordingChunk. Используйте метод download_recording, чтобы скачать содержимое в виде байтов.

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

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

response = call_automation_client.delete_recording(delete_location);

Пример кода

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

Предварительные условия

  • Вам потребуется учетная запись Azure с активной подпиской.
  • Развертывание ресурса службы коммуникации. Запишите строку подключения к ресурсу.
  • Подпишитесь на события с помощью Сетка событий Azure.
  • Node.js Активные и версии поддержки LTS (рекомендуемые: 8.11.1 и 10.14.1)

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

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

Как получить callConnectionId

При использовании службы автоматизации вызовов вы получите callConnectionId из события ответа при запросах createCall, answer или connect при инициировании вызова.

Получение serverCallId

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

  1. Когда вы устанавливаете вызов, serverCallId возвращается как свойство события CallConnected после того, как вызов установлен. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. При ответе на вызов или создании вызова, он возвращается как свойство ответов AnswerCallResult или CreateCallResult API соответственно.

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.

Давайте начнем с нескольких простых шагов.

1. Создание клиента автоматизации вызовов

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

Чтобы создать клиента автоматизации вызовов, используйте строку подключения службы связи и передайте её в объект CallAutomationClient.

const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");

2. Запуск сеанса записи с помощью StartRecordingOptions с помощью API StartAsync

Используйте callConnectionId или serverCallId, полученные во время запуска вызова.

  • Используется RecordingContent для передачи типа контента записи. Используйте AUDIO.
  • Используется RecordingChannel для передачи типа канала записи. Используйте MIXED или UNMIXED.
  • Используется RecordingFormat для передачи формата записи. Используйте WAV.
var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>"
};
var response = await callAutomationClient.getCallRecording().start(options);

2.1. Начать запись - Используйте собственное хранилище BLOB-объектов Azure

Начните запись, используя указанное Azure Blob Storage для хранения файла после окончания записи.

const recordingStorageKind: RecordingStorageKind = "azureBlobStorage"
const recordingStorage: RecordingStorage = { 
       recordingStorageKind: recordingStorageKind, 
       recordingDestinationContainerUrl: "<YOUR_STORAGE_CONTAINER_URL>"
   }
var options: StartRecordingOptions = {
       callLocator: callLocator,
       recordingContent: "audio",
       recordingChannel:"unmixed",
       recordingFormat: "wav",
       recordingStateCallbackEndpointUrl: "<CallbackUri>",
       recordingStorage: recordingStorage
   };
var response = await callAutomationClient.getCallRecording().start(options);

2.2. Запуск сеанса записи с включенным режимом приостановки с помощью API StartAsync

Примечание.

Записи должны быть возобновлены для создания файла записи.

var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  pauseOnStart: true
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);

2.3. Только для неизмененных - Укажите пользователя на канале 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. Остальные участники назначаются каналу во время их разговора. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);

2.4. Только для несмешанных данных— указание сходства каналов

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  ChannelAffinity:
  [
    {
      channel:0,
      targetParticipant:{communicationUserId: "<ACS_USER_MRI>"}
    }
  ]
};
var response = await callAutomationClient.getCallRecording().start(options);

StartAsync Ответ API содержит recordingId, связанный с сеансом записи.

3. Остановка сеанса записи с помощью API stop

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

var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);

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

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

var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);

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

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

var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);

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

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

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

Следующий код является примером схемы события.

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

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

var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);

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

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

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

var response = await callAutomationClient.getCallRecording().delete(deleteLocation);

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

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

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

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