Guia de início rápido de gravação de chamadas

Este guia de início rápido ajuda você a começar com a Gravação de chamadas para chamadas de voz e vídeo. Para começar a usar as APIs de gravação de chamadas, você deve ter uma chamada no lugar. Verifique se você está familiarizado com o SDK do cliente de chamada e/ou a automação de chamadas para criar a experiência de chamada do usuário final.

Código de Exemplo

Você pode baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Implante um recurso do Serviço de Comunicação. Registre sua cadeia de conexão de recurso.
  • Inscreva-se em eventos por meio da Grade de Eventos do Azure.
  • Baixe o SDK do .NET

Antes de começar

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

Cenários de automação de chamadas

  • Ao usar a Automação de Chamadas, você tem duas opções para obter o serverCallId:
    1. Depois que uma chamada é criada, a serverCallId é retornada como uma propriedade do CallConnected evento após uma chamada ter sido estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.
    2. Depois de atender a chamada ou uma chamada é criada, o serverCallId é retornado como uma propriedade das respostas da AnswerCallResult API ou CreateCallResult respectivamente.

Chamando cenários do SDK

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

Vamos começar com alguns passos simples!

1. Crie um cliente de automação de chamadas

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automação de Chamadas dos Serviços de Comunicação do Azure. Assim, é necessário criar um cliente de Call Automation. Para criar um cliente de automação de chamadas, use a cadeia de conexão dos Serviços de Comunicação e passe-a para o CallAutomationClient objeto.

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

2. Inicie a sessão de gravação com StartRecordingOptions usando a API 'StartAsync'

Use o serverCallId recebido 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. Utilizar 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. Comece a gravar - traga sua própria loja de Blob do Azure

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

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. Inicie a sessão de gravação com o modo de pausa ativado usando a API 'StartAsync'

Nota

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 - Especifique um usuário no canal 0

Para produzir arquivos de gravação de áudio não misturados, você pode usar a AudioChannelParticipantOrdering funcionalidade para especificar qual usuário deseja gravar no canal 0. Os restantes participantes são atribuídos a um canal enquanto falam. Se você usa RecordingChannel.Unmixed , mas não usa AudioChannelParticipantOrdering, a Gravação de Chamadas atribui o canal 0 ao primeiro participante que fala.

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. Apenas para não misturado - Especificar afinidade de 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 StartAsync resposta da API contém o recordingId da sessão de gravação.

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

Use o recordingId recebido em resposta de StartAsync.

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

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

Use o recordingId recebido em resposta de StartAsync.

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

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

Use o recordingId recebido em resposta de StartAsync.

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

6. Faça o download do arquivo de gravação usando a API 'DownloadToAsync'

Usar um gancho da Web da Grade de Eventos do Azure ou outra ação acionada deve ser usado para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated de 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 (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usadas para recuperar mídia gravada e um arquivo de metadados de gravação.

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 DownloadToAsync a API 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 obtido a contentLocation partir do recordingChunkatributo do . DownloadToAsync O método baixa o conteúdo para o nome de arquivo fornecido.

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

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

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

Código de Exemplo

Você pode baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Implante um recurso do Serviço de Comunicação. Registre sua cadeia de conexão de recurso.
  • Inscreva-se em eventos por meio da Grade de Eventos do Azure.
  • Faça o download do Java SDK

Antes de começar

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

Cenários de automação de chamadas

  • Ao usar a Automação de Chamadas, você tem duas opções para obter o serverCallId:
    1. Depois que uma chamada é criada, a serverCallId é retornada como uma propriedade do CallConnected evento após uma chamada ter sido estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.
    2. Depois de atender a chamada ou uma chamada é criada, o serverCallId é retornado como uma propriedade das respostas da AnswerCallResult API ou CreateCallResult respectivamente.

Chamando cenários do SDK

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

Vamos começar com alguns passos simples!

1. Crie um cliente de automação de chamadas

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automação de Chamadas dos Serviços de Comunicação do Azure. Assim, é necessário criar um cliente de Call Automation. Para criar um cliente de automação de chamadas, você usará sua cadeia de conexão dos Serviços de Comunicação e a passará para o CallAutomationClient objeto.

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

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

Use o serverCallId recebido durante o início da chamada.

  • RecordingContent é usado para passar o tipo de conteúdo de gravação. Use AUDIO
  • RecordingChannel é usado para passar o tipo de canal de gravação. Use MIXED ou UNMIXED.
  • 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. Comece a gravar - traga sua própria loja de Blob do Azure

Inicie a sessão de gravação com seu próprio Armazenamento de Blob 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. Inicie a sessão de gravação com o modo de pausa ativado usando a API 'StartAsync'

Nota

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 - Especifique um usuário no canal 0

Para produzir arquivos de gravação de áudio não misturados, você pode usar a AudioChannelParticipantOrdering funcionalidade para especificar qual usuário deseja gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se você usar RecordingChannel.Unmixed , mas não usar AudioChannelParticipantOrdering, a Gravação de Chamadas atribuirá o canal 0 ao primeiro participante a falar.

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. Apenas para não misturado - Especificar afinidade de 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 startWithResponse resposta da API contém o recordingId da sessão de gravação.

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

Use o recordingId recebido em resposta de startWithResponse.

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

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

Use o recordingId recebido em resposta de startWithResponse.

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

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

Use o recordingId recebido em resposta de startWithResponse.

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

6. Faça o download do arquivo de gravação usando a API 'downloadToWithResponse'

Usar um gancho da Web da Grade de Eventos do Azure ou outra ação acionada deve ser usado para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated de 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 (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usadas para recuperar mídia gravada e um arquivo de metadados de gravação.

Abaixo está 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 downloadToWithResponse o método de CallRecording classe para baixar a mídia gravada. A seguir estão os parâmetros suportados para downloadToWithResponse o método:

  • contentLocation: URL dos Serviços de Comunicação do Azure onde o conteúdo está localizado.
  • destinationPath : Localização do ficheiro.
  • parallelDownloadOptions: Um objeto opcional ParallelDownloadOptions para modificar como o - download paralelo funcionará.
  • overwrite: True para substituir o arquivo, se ele existir.
  • context: Um 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 os IDs do documento para os arquivos de gravação podem ser buscados nos contentLocation campos e documentId respectivamente, para cada recordingChunk.

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

Use deleteWithResponse o método de CallRecording classe para excluir a mídia gravada. A seguir estão os parâmetros suportados para deleteWithResponse o método:

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

O local de exclusão para a gravação pode ser buscado no deleteLocation campo do evento Event Grid.

Código de Exemplo

Você pode baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Implante um recurso do Serviço de Comunicação. Registre sua cadeia de conexão de recurso.
  • Inscreva-se em eventos por meio da Grade de Eventos do Azure.
  • Python 3.7+.

Antes de começar

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

Cenários de automação de chamadas

  • Ao usar a Automação de Chamadas, você tem duas opções para obter o serverCallId:
    1. Depois que uma chamada é criada, a serverCallId é retornada como uma propriedade do CallConnected evento após uma chamada ter sido estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.
    2. Depois de atender a chamada ou uma chamada é criada, o serverCallId é retornado como uma propriedade das respostas da AnswerCallResult API ou CreateCallResult respectivamente.

Chamando cenários do SDK

  • Ao usar o SDK do Cliente de Chamada, você pode recuperar o serverCallId usando a server_call_id variável na chamada. Use este exemplo para saber como Obter serverCallId do SDK do Cliente de Chamada.

Vamos começar com alguns passos simples!

1. Crie um cliente de automação de chamadas

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automação de Chamadas dos Serviços de Comunicação do Azure. Assim, é necessário criar um cliente de Call Automation. Para criar um cliente de automação de chamadas, você usará sua cadeia de conexão dos Serviços de Comunicação e a passará para o CallAutomationClient objeto.

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

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

Use o serverCallId recebido 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. Utilizar 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. Comece a gravar - traga sua própria loja de Blob do Azure

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

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. Inicie a sessão de gravação com o modo de pausa ativado usando a API 'StartAsync'

Nota

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 - Especifique um usuário no canal 0

Para produzir arquivos de gravação de áudio não misturados, você pode usar a AudioChannelParticipantOrdering funcionalidade para especificar qual usuário deseja gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se você usar RecordingChannel.Unmixed , mas não usar AudioChannelParticipantOrdering, a Gravação de Chamadas atribuirá o canal 0 ao primeiro participante a falar.

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. Apenas para não misturado - Especificar afinidade de 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 StartAsync resposta da API contém o recordingId da sessão de gravação.

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

Use o recording_id recebido em resposta de start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

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

Use o recording_id recebido em resposta de start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

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

Use o recording_id recebido em resposta de start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Faça o download do arquivo de gravação usando a API 'download_recording'

Usar um gancho da Web da Grade de Eventos do Azure ou outra ação acionada deve ser usado para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated de 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 (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usadas para recuperar mídia gravada e um arquivo de metadados de gravação.

Abaixo está 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 download_recording a API 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 obtido a contentLocation partir do recordingChunkatributo do . download_recording método de download do conteúdo em bytes.

7. Exclua o conteúdo de gravação usando a API 'delete_recording'

Use delete_recording a API para excluir o conteúdo de gravação (por exemplo, mídia gravada, metadados)

response = call_automation_client.delete_recording(delete_location);

Código de Exemplo

Você pode baixar o aplicativo de exemplo do GitHub

Pré-requisitos

  • Você precisa de uma conta do Azure com uma assinatura ativa.
  • Implante um recurso do Serviço de Comunicação. Registre sua cadeia de conexão de recurso.
  • Inscreva-se em eventos por meio da Grade de Eventos do Azure.
  • Node.js versões Ative LTS e Maintenance LTS (recomenda-se 8.11.1 e 10.14.1)

Antes de começar

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

Cenários de automação de chamadas

  • Ao usar a Automação de Chamadas, você tem duas opções para obter o serverCallId:
    1. Depois que uma chamada é criada, a serverCallId é retornada como uma propriedade do CallConnected evento após uma chamada ter sido estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.
    2. Depois de atender a chamada ou uma chamada é criada, o serverCallId é retornado como uma propriedade das respostas da AnswerCallResult API ou CreateCallResult respectivamente.

Chamando cenários do SDK

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

Vamos começar com alguns passos simples!

1. Crie um cliente de automação de chamadas

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automação de Chamadas dos Serviços de Comunicação do Azure. Assim, é necessário criar um cliente de Call Automation. Para criar um cliente de automação de chamadas, você usará sua cadeia de conexão dos Serviços de Comunicação e a passará para o CallAutomationClient objeto.

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

2. Inicie a sessão de gravação com StartRecordingOptions usando a API 'StartAsync'

Use o serverCallId recebido 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. Utilizar 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. Comece a gravar - traga sua própria loja de Blob do Azure

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

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. Inicie a sessão de gravação com o modo de pausa ativado usando a API 'StartAsync'

Nota

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 - Especifique um usuário no canal 0

Para produzir arquivos de gravação de áudio não misturados, você pode usar a AudioChannelParticipantOrdering funcionalidade para especificar qual usuário deseja gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se você usar RecordingChannel.Unmixed , mas não usar AudioChannelParticipantOrdering, a Gravação de Chamadas atribuirá o canal 0 ao primeiro participante a falar.

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. Apenas para não misturado - Especificar afinidade de 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 StartAsync resposta da API contém o recordingId da sessão de gravação.

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

Use o recordingId recebido em resposta de start.

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

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

Use o recordingId recebido em resposta de start.

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

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

Use o recordingId recebido em resposta de start.

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

6. Faça o download do arquivo de gravação usando a API 'DownloadToAsync'

Usar um gancho da Web da Grade de Eventos do Azure ou outra ação acionada deve ser usado para notificar seus serviços quando a mídia gravada estiver pronta para download.

Uma notificação Microsoft.Communication.RecordingFileStatusUpdated de 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 (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são usadas para recuperar mídia gravada e um arquivo de metadados de gravação.

Abaixo está 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 downloadToPath a API para baixar a mídia gravada.

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

O downloadLocation para a gravação pode ser obtido a contentLocation partir do recordingChunkatributo do . DownloadToAsync método de download do conteúdo em nome de arquivo fornecido.

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

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

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

Clean up resources (Limpar recursos)

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, você pode excluir o recurso ou grupo de recursos. A exclusão do grupo de recursos também exclui quaisquer outros recursos associados a ele. Saiba mais sobre a limpeza de recursos.

Próximos passos

Para obter mais informações, consulte os seguintes artigos que podem estar em inglês: