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


Call recording quickstart

В этой статье описывается запись звонков для голосовых и видеозвонков. To start using the Call Recording APIs, you must have a call in place. Чтобы создать интерфейс вызова конечных пользователей, убедитесь, что вы знакомы с пакетом SDK для клиента вызовов и автоматизацией вызовов.

Пример кода

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

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

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

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

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

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

  1. When you establish a call, it returns a serverCallId as a property of the CallConnected event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. When you answer the call or a call is created, it returns the serverCallId as a property of the AnswerCallResult or CreateCallResult API responses respectively.

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

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

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

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

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

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

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

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

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

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

2.1. Start Recording - Bring Your Own Azure Blob Store

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

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

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

Примечание.

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

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

2.3. Only for Unmixed - Specify a user on channel 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

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

2.4. Only for Unmixed - Specify channel affinity

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

The StartAsync API response contains the recordingId of the recording session.

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

Use the recordingId received in response to StartAsync.

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

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

Use the recordingId received in response to StartAsync.

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

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

Use the recordingId received in response to StartAsync.

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

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

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

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

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

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

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

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

Fetch the downloadLocation for the recording from the contentLocation attribute of the recordingChunk. Use the DownloadToAsync method to download the content into a provided filename.

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

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

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

Пример кода

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

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

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

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

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

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

  1. Once a call is created, a serverCallId is returned as a property of the CallConnected event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK.

  2. Once you answer the call or a call is created the serverCallId is returned as a property of the AnswerCallResult or CreateCallResult API responses respectively.

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

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.

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

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

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

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

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

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

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

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

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

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

2.1. Start Recording - Bring Your Own Azure Blob Store

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

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

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

Примечание.

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

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

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

2.3. Only for Unmixed - Specify a user on channel 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

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

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

2.4. Only for Unmixed - Specify channel affinity

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

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

The startWithResponse API response contains the recordingId of the recording session.

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

Use the recordingId received in response to startWithResponse.

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

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

Use the recordingId received in response to startWithResponse.

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

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

Use the recordingId received in response to startWithResponse.

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

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

Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.

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

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

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

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

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

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

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

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

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

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

  • deleteLocation: URL-адрес Службы коммуникации Azure, где находится содержимое для удаления.
  • context: A Context representing the request context.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

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

Пример кода

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

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

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

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

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

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

  • При использовании Автоматизации вызовов, у вас есть два варианта, чтобы получить serverCallId:
    1. Once a call is created, a serverCallId is returned as a property of the CallConnected event after a call is established. Узнайте, как получить событие CallConnected из Call Automation SDK.
    2. Once you answer the call or a call is created, it returns the serverCallId as a property of the AnswerCallResult or CreateCallResult API responses respectively.

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

  • When using Calling Client SDK, you can retrieve the serverCallId by using the server_call_id variable on the call. Используйте этот пример, чтобы узнать , как получить serverCallId из пакета SDK для вызывающего клиента.

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

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

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

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

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

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

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

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

2.1. Start Recording - Bring Your Own Azure Blob Store

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

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

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

Примечание.

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

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

2.3. Only for Unmixed - Specify a user on channel 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

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

2.4. Only for Unmixed - Specify channel affinity

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

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

The StartAsync API response contains the recordingId of the recording session.

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

Use the recording_id received in response to start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

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

Use the recording_id received in response to start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

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

Use the recording_id received in response to start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

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

Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.

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

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

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

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

response = recording_data = call_automation_client.download_recording(content_location)

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

The downloadLocation for the recording can be fetched from the contentLocation attribute of the recordingChunk. Используйте метод download_recording, чтобы скачать содержимое в виде байтов.

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

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

response = call_automation_client.delete_recording(delete_location);

Пример кода

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

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

  • Вам потребуется учетная запись Azure с активной подпиской.
  • Развертывание ресурса службы коммуникации. Record your resource connection string.
  • Подпишитесь на события с помощью Сетка событий Azure.
  • Node.js Active LTS and Maintenance LTS versions (8.11.1 and 10.14.1 recommended)

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

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

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

  • При использовании Автоматизации вызовов, у вас есть два варианта, чтобы получить serverCallId:
    1. Once a call is created, a serverCallId is returned as a property of the CallConnected event after a call is established. Узнайте, как из пакета SDK для автоматизации вызовов получить событие CallConnected.
    2. Once you answer the call or a call is created, it returns the serverCallId as a property of the AnswerCallResult or CreateCallResult API responses respectively.

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

При использовании Calling Client SDK можно получить serverCallId с помощью метода getServerCallId при вызове.

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

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

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

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

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

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

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

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

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

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

2.1. Start Recording - Bring Your Own Azure Blob Store

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

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

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

Примечание.

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

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

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

2.3. Only for Unmixed - Specify a user on channel 0

Чтобы создать немикшированные файлы аудиозаписи, можно использовать AudioChannelParticipantOrdering функциональность, чтобы указать, какого пользователя вы хотите записывать на канале 0. The rest of the participants are assigned to a channel as they speak. Если вы используете RecordingChannel.Unmixed, но не используете AudioChannelParticipantOrdering, запись звонков назначает канал 0 первому говорящему участнику.

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

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

2.4. Only for Unmixed - Specify channel affinity

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

The StartAsync API response contains the recordingId of the recording session.

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

Use the recordingId received in response to start.

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

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

Use the recordingId received in response to start.

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

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

Use the recordingId received in response to start.

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

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

Use an Azure Event Grid web hook or other triggered action should be used to notify your services when the recorded media is ready for download.

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

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

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

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

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

The downloadLocation for the recording can be fetched from the contentLocation attribute of the recordingChunk. Use the DownloadToAsync method to download the content into a provided filename.

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

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

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

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

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

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

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