Compartilhar via


Início Rápido da gravação de chamada

Este artigo descreve a gravação de chamadas de voz e vídeo. Para começar a usar as APIs de Gravação de Chamada, você deve ter uma chamada em andamento. Para construir a experiência de chamada para os usuários finais, familiarize-se com o SDK do cliente de chamadas e a Automação de Chamadas.

Exemplo de código

É possível baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
  • Assine eventos por meio da Grade de Eventos do Azure.
  • Baixar o SDK do .NET

Antes de começar

As APIs de Gravação de Chamada usam exclusivamente a serverCallIdpara iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId dependendo do seu cenário:

Cenários de Automação de Chamada

Ao usar a Automação de Chamada, você terá duas opções para obter a serverCallId:

  1. Quando ao estabelecer uma chamada, ela retorna um serverCallId como propriedade do evento CallConnected. Saiba como Obter evento CallConnected do SDK de Automação de Chamada.

  2. Quando você atende a chamada ou uma chamada é criada, retorna o serverCallId como propriedade das respostas das APIs AnswerCallResult ou CreateCallResult, respectivamente.

Chamar cenários do SDK

Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId usando o método getServerCallId na chamada. Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.

Vamos começar com algumas etapas simples.

1. Criar um cliente de Automação de Chamadas

As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Para isso, você precisa criar um cliente de Automação de Chamadas.

Para criar um cliente de automação de chamadas, use sua cadeia de conexão dos Serviços de Comunicação e passe-a para o objeto CallAutomationClient.

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

2. Iniciar a sessão de gravação com StartRecordingOptions usando a API "StartAsync"

Use a serverCallId recebida durante o início da chamada.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. Use AUDIO.
  • Use RecordingChannel para passar o tipo de canal de gravação. Use MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. Use 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. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure

Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado após a conclusão da gravação.

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. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”

Observação

As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.

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. Somente para não misturado – Especificar um usuário em um canal 0

Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering para especificar qual usuário deseja gravar em cada canal 0. Um canal será atribuído ao restante dos participantes enquanto eles falam. Se você usar RecordingChannel.Unmixed, mas não usar AudioChannelParticipantOrdering, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.

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. Somente para não misturado – Especificar a afinidade do canal

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);

A resposta da API StartAsync contém a recordingId da sessão de gravação.

3. Parar a sessão de gravação usando a API StopAsync

Use a recordingId recebida em resposta à StartAsync.

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

4. Pausar a sessão de gravação usando a API PauseAsync

Use a recordingId recebida em resposta à StartAsync.

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

5. Retomar a sessão de gravação usando a API ResumeAsync

Use a recordingId recebida em resposta à StartAsync.

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

6. Baixar arquivo de gravação usando a API DownloadToAsync

Use um web hook da Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para baixar.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated da Grade de Eventos é publicada quando uma gravação está pronta para recuperação. Isso normalmente ocorre alguns minutos após a conclusão do processamento da gravação (como quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que podem ser usados para recuperar tanto a mídia gravada quanto um arquivo de metadados da gravação.

Exemplo do esquema do evento:

{
    "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
}

Use a API DownloadToAsync para baixar a mídia gravada.

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

Busque o downloadLocation da gravação do atributo contentLocation do recordingChunk. Use o método DownloadToAsync para baixar o conteúdo em um nome de arquivo fornecido.

7. Excluir o conteúdo de gravação usando a API DeleteAsync

Use a API DeleteAsync para excluir o conteúdo da gravação (como mídias e metadados gravados).

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

Exemplo de código

É possível baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
  • Assine eventos por meio da Grade de Eventos do Azure.
  • Baixar o SDK do Java

Antes de começar

As APIs de Gravação de Chamadas usam exclusivamente a serverCallId para iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId dependendo do seu cenário:

Cenários de Automação de Chamada

Ao usar a Automação de Chamada, você terá duas opções para obter a serverCallId:

  1. Após a criação de uma chamada, uma serverCallId retornará por meio do evento CallConnected após a chamada ser estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada.

  2. Depois que você atende a chamada ou uma chamada é criada, a serverCallId é retornada como uma propriedade das respostas AnswerCallResult ou CreateCallResult da API, respectivamente.

Chamar cenários do SDK

Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId usando o método getServerCallId na chamada.

Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.

Vamos começar com algumas etapas simples.

1. Criar um cliente de Automação de Chamadas

As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Para isso, você precisa criar um cliente de Automação de Chamadas.

Para criar um cliente de automação de chamadas, use sua cadeia de conexão dos Serviços de Comunicação e passe-a para o objeto CallAutomationClient.

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

2. Iniciar a sessão de gravação com StartRecordingOptions usando a API startWithResponse

Use a serverCallId recebida durante o início da chamada.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. Use AUDIO.
  • Use RecordingChannel para passar o tipo de canal de gravação. Use MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. Use 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. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure

Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado após a conclusão da gravação.

        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. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API StartAsync

Observação

As gravações precisam ser retomadas para que o arquivo de gravação seja gerado.

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. Somente para não misturado – Especificar um usuário em um canal 0

Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering para especificar qual usuário deseja gravar em cada canal 0. Um canal será atribuído ao restante dos participantes enquanto eles falam. Se você usar RecordingChannel.Unmixed, mas não usar AudioChannelParticipantOrdering, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.

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. Somente para não misturado – Especificar a afinidade do canal

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);

A resposta da API startWithResponse contém a recordingId da sessão de gravação.

3. Parar a sessão de gravação usando a API stopWithResponse

Use a recordingId recebida em resposta à startWithResponse.

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

4. Pausar a sessão de gravação usando a API pauseWithResponse

Use a recordingId recebida em resposta à startWithResponse.

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

5. Retomar a sessão de gravação usando a API resumeWithResponse

Use a recordingId recebida em resposta à startWithResponse.

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

6. Baixar arquivo de gravação usando a API downloadToWithResponse

Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated da Grade de Eventos é publicada quando uma gravação está pronta para recuperação, geralmente alguns minutos após a conclusão do processo de gravação (como quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que podem ser usados para recuperar tanto a mídia gravada quanto um arquivo de metadados da gravação.

O item a seguir é um exemplo do esquema do evento.

{
    "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
}

Use o método downloadToWithResponse da classe CallRecording para baixar a mídia gravada. Veja a seguir os parâmetros com suporte para o método downloadToWithResponse:

  • contentLocation: URL dos Serviços de Comunicação do Azure em que o conteúdo está localizado.
  • destinationPath: local do arquivo.
  • parallelDownloadOptions: um objeto opcional ParallelDownloadOptions para modificar como o download paralelo funciona.
  • overwrite: True para substituir o arquivo, se ele existir.
  • context: contexto que representa o contexto da solicitação.
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);

O local do conteúdo e as IDs do documento dos arquivos de gravação podem ser obtidos nos campos contentLocation e documentId, respectivamente, para cada recordingChunk.

7. Excluir o conteúdo de gravação usando a API deleteWithResponse

Use o método deleteWithResponse da classe CallRecording para excluir a mídia gravada. Parâmetros compatíveis com o método deleteWithResponse:

  • deleteLocation: URL dos Serviços de Comunicação do Azure onde o conteúdo a ser excluído está localizado.
  • context: contexto que representa o contexto da solicitação.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

O local de exclusão da gravação pode ser buscado no campo deleteLocation do evento de Grade de Eventos.

Exemplo de código

É possível baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
  • Assine eventos por meio da Grade de Eventos do Azure.
  • Python 3.7+.

Antes de começar

As APIs de Gravação de Chamada usam exclusivamente a serverCallIdpara iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId dependendo do seu cenário:

Cenários de Automação de Chamada

  • Ao usar a Automação de Chamada, você terá duas opções para obter a serverCallId:
    1. Após a criação de uma chamada, uma serverCallId retornará por meio do evento CallConnected após a chamada ser estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada.
    2. Quando você atende a chamada ou uma chamada é criada, retorna o serverCallId como propriedade das respostas das APIs AnswerCallResult ou CreateCallResult, respectivamente.

Chamar cenários do SDK

Vamos começar com algumas etapas simples!

1. Criar um cliente de Automação de Chamadas

As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.

Para criar um cliente de automação de chamadas, use sua cadeia de conexão dos Serviços de Comunicação e passe-a para o objeto CallAutomationClient.

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

2. Iniciar a sessão de gravação API start_recording

Use a serverCallId recebida durante o início da chamada.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. Use AUDIO.
  • Use RecordingChannel para passar o tipo de canal de gravação. Use MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. Use 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. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure

Inicie a gravação com seu próprio Armazenamento de Blobs do Azure definido para armazenar o arquivo de gravação após a conclusão da gravação.

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. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”

Observação

As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.

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. Somente para não misturado – Especificar um usuário em um canal 0

Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering para especificar qual usuário deseja gravar em cada canal 0. Um canal será atribuído ao restante dos participantes enquanto eles falam. Se você usar RecordingChannel.Unmixed, mas não usar AudioChannelParticipantOrdering, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.

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. Somente para não misturado – Especificar a afinidade do canal

_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])

A resposta da API StartAsync contém a recordingId da sessão de gravação.

3. Interromper a sessão de gravação usando a API 'stop_recording'

Use a recording_id recebida em resposta à start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

4. Pausar a sessão de gravação usando a API 'pause_recording'

Use a recording_id recebida em resposta à start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

5. Retomar a sessão de gravação usando a API 'resume_recording'

Use a recording_id recebida em resposta à start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Baixe o arquivo de gravação usando a API 'download_recording'

Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated é publicada quando uma gravação está pronta para recuperação, geralmente alguns minutos após a conclusão do processo de gravação (como quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.

O item a seguir é um exemplo do esquema do evento.

{
    "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
}

Use a API download_recording para baixar a mídia gravada.

response = recording_data = call_automation_client.download_recording(content_location)

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

O downloadLocation para a gravação pode ser buscado a partir do atributo contentLocation do recordingChunk. Use o método download_recording para baixar o conteúdo em bytes.

7. Excluir o conteúdo da gravação usando a API 'delete_recording'

Use a API delete_recording para excluir conteúdos da gravação, como mídias gravadas e metadados.

response = call_automation_client.delete_recording(delete_location);

Exemplo de código

É possível baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
  • Assine eventos por meio da Grade de Eventos do Azure.
  • Node.js: versões LTS Ativas e LTS de Manutenção (8.11.1 e 10.14.1 recomendados)

Antes de começar

As APIs de Gravação de Chamada usam exclusivamente a serverCallIdpara iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId dependendo do seu cenário:

Cenários de Automação de Chamada

  • Ao usar a Automação de Chamada, você terá duas opções para obter a serverCallId:
    1. Após a criação de uma chamada, uma serverCallId retornará por meio do evento CallConnected após a chamada ser estabelecida. Saiba como Obter um evento CallConnected do SDK de Automação de Chamadas.
    2. Quando você atende a chamada ou uma chamada é criada, retorna o serverCallId como propriedade das respostas das APIs AnswerCallResult ou CreateCallResult, respectivamente.

Chamar cenários do SDK

Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId usando o método getServerCallId na chamada.

Use este exemplo para saber como Obter uma serverCallId do SDK do Cliente de Chamadas.

Vamos começar com algumas etapas simples!

1. Criar um cliente de Automação de Chamadas

As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.

Para criar um cliente de automação de chamadas, use sua cadeia de conexão dos Serviços de Comunicação e passe-a para o objeto CallAutomationClient.

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

2. Iniciar a sessão de gravação com StartRecordingOptions usando a API "StartAsync"

Use a serverCallId recebida durante o início da chamada.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. Use AUDIO.
  • Use RecordingChannel para passar o tipo de canal de gravação. Use MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. Use 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. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure

Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado após a conclusão da gravação.

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. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”

Observação

As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.

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. Somente para não misturado – Especificar um usuário em um canal 0

Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering para especificar qual usuário deseja gravar em cada canal 0. Um canal será atribuído ao restante dos participantes enquanto eles falam. Se você usar RecordingChannel.Unmixed, mas não usar AudioChannelParticipantOrdering, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.

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. Somente para não misturado – Especificar a afinidade do canal

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);

A resposta da API StartAsync contém a recordingId da sessão de gravação.

3. Interromper a sessão de gravação usando a API 'stop'

Use a recordingId recebida em resposta à start.

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

4. Pausar a sessão de gravação usando a API 'pause'.

Use a recordingId recebida em resposta à start.

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

5. Retomar a sessão de gravação usando a API "ResumeAsync"

Use a recordingId recebida em resposta à start.

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

6. Baixar o arquivo de gravação usando a API “DownloadToAsync”

Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated é publicada quando uma gravação está pronta para recuperação, geralmente alguns minutos após a conclusão do processo de gravação (como quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.

O item a seguir é um exemplo do esquema do evento.

{
    "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
}

Use a API downloadToPath para baixar a mídia gravada.

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

O downloadLocation para a gravação pode ser buscado a partir do atributo contentLocation do recordingChunk. Use o método DownloadToAsync para baixar o conteúdo em um nome de arquivo fornecido.

7. Excluir o conteúdo de gravação usando a API "DeleteAsync"

Usar a API delete para excluir conteúdo da gravação (por exemplo, mídia gravada, metadados)

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

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.

Próximas etapas

Para obter mais informações, confira os seguintes artigos: