Compartilhar via


Início Rápido da Gravação de Chamada

Este guia de início rápido mostra como começar com a Gravação de Chamada para 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. Verifique se você está familiarizado com a Chamada do SDK do cliente e/ou a Automação de Chamadas para criar a experiência de chamada do usuário final.

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. Após criar uma chamada, uma serverCallId retornará por meio do evento CallConnected depois que uma chamada tiver sido 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

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, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará 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.

  • RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
  • RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
  • RecordingFormat é usado 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

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.

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. 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 gravação da sessão usando a API "StopAsync"

Use a recordingId recebida na resposta a StartAsync.

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

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

Use a recordingId recebida na resposta a StartAsync.

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

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

Use a recordingId recebida na resposta a StartAsync.

var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(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 será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, 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.

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

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

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

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

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 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 criar uma chamada, uma serverCallId retornará por meio do evento CallConnected depois que uma chamada tiver sido 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

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, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará para o objeto CallAutomationClient.

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

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

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

  • RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar ÁUDIO
  • RecordingChannel é usado para passar o tipo de canal de gravação. Use MISTURADO ou NÃO MISTURADO.
  • RecordingFormat é usado 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

Inicie a sessão de Gravação com seu próprio Armazenamento de Blobs do Azure para armazenar o arquivo de gravação assim que a gravação for concluída.

       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. 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>"))
                    .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. O restante dos participantes será atribuído a um canal enquanto 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. Pare a sessão de gravação usando a API do servidor "stopWithResponse"

Use a recordingId recebida na resposta a startWithResponse.

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

4. Pause a sessão de gravação usando a API do "pauseWithResponse"

Use a recordingId recebida na resposta a startWithResponse.

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

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

Use a recordingId recebida na resposta a startWithResponse.

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

6. Baixe o 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 da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, 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.

Veja abaixo um exemplo do esquema de eventos.

{
    "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: objeto ParallelDownloadOptions opcional para modificar como o download paralelo funcionará.
  • 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. Exclua o conteúdo de gravação usando a API "deleteWithResponse"

Use o método deleteWithResponse da classe CallRecording para excluir a mídia gravada. Veja a seguir os parâmetros com suporte para 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 criar uma chamada, uma serverCallId retornará por meio do evento CallConnected depois que uma chamada tiver sido 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

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, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará 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.

  • RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
  • RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
  • RecordingFormat é usado 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. O restante dos participantes será atribuído a um canal enquanto 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 na resposta a 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 na resposta a 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 na resposta a 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 será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, 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.

Veja abaixo um exemplo do esquema de eventos.

{
    "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. O método download_recording faz o download do conteúdo em bytes.

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

Usar a API delete_recording para excluir conteúdo da gravação (por exemplo, mídia gravada, 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 criar uma chamada, uma serverCallId retornará por meio do evento CallConnected depois que uma chamada tiver sido 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

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, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará 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.

  • RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
  • RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
  • RecordingFormat é usado 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

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.

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. O restante dos participantes será atribuído a um canal enquanto 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 na resposta a start.

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

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

Use a recordingId recebida na resposta a start.

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

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

Use a recordingId recebida na resposta a 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 será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, 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.

Veja abaixo um exemplo do esquema de eventos.

{
    "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. O método DownloadToAsync baixa o conteúdo para o 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, consulte os seguintes artigos: