Partilhar via


Início rápido da gravação da chamada

Este artigo descreve 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. Para criar a experiência de chamada do usuário final, certifique-se de estar familiarizado com o SDK do cliente de chamada e a automação de chamadas.

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. Quando você estabelece uma chamada, ela retorna a serverCallId como uma propriedade do evento depois que CallConnected uma chamada é estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.

  2. Quando você atende a chamada ou uma chamada é criada, ela retorna a serverCallId propriedade as das respostas da AnswerCallResult API ou CreateCallResult da API, 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. Então 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 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.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. AUDIOUtilize.
  • Use RecordingChannel para passar o tipo de canal de gravação. Utilizar MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. WAVUtilize.
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

Comece a gravar usando seu Armazenamento de Blob do Azure designado para armazenar o arquivo gravado 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>"))
    ExternalStorage = new BlobStorage(new Uri("<Insert Container / Blob Uri>"))
};
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 StopAsync API

Use o recordingId recebido em resposta a StartAsync.

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

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

Use o recordingId recebido em resposta a StartAsync.

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

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

Use o recordingId recebido em resposta a StartAsync.

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

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

Use um gancho da Web da Grade de Eventos do Azure ou outra ação acionada 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 o processamento da gravação terminar (como quando a reunião termina ou uma gravação para). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que você pode usar 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);

Buscar o downloadLocation para a gravação a contentLocation partir do recordingChunkatributo do . Use o DownloadToAsync método para baixar o conteúdo em um nome de arquivo fornecido.

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

Use DeleteAsync a API para excluir o conteúdo de gravação (como mídia gravada e 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 serverCallId gravaçã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 evento depois que CallConnected uma chamada é 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. Então 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 CallAutomationClient objeto.

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

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

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

  • Use RecordingContent para passar o tipo de conteúdo de gravação. AUDIOUtilize.
  • Use RecordingChannel para passar o tipo de canal de gravação. Utilizar MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. WAVUtilize.
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

Comece a gravar usando seu Armazenamento de Blob do Azure designado para armazenar o arquivo gravado 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>"))
        .setExternalStorage(new BlobStorage("<Insert Container / Blob Uri>"));
 
       // //start recording
       RecordingStateResult result = callRecording.start(recordingOptions);

2.2. Inicie a sessão de gravação com o modo de pausa ativado usando a StartAsync API

Nota

As gravações devem 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 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>"))
                    .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 stopWithResponse API

Use o recordingId recebido em resposta a startWithResponse.

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

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

Use o recordingId recebido em resposta a startWithResponse.

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

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

Use o recordingId recebido em resposta a startWithResponse.

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

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

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 (como término de reunião ou paradas de gravação). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que você pode usar para recuperar mídia gravada e um arquivo de metadados de gravação.

O código a seguir é 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 funciona.
  • 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 deleteWithResponse API

Use deleteWithResponse o método de CallRecording classe para excluir a mídia gravada. 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 evento depois que CallConnected uma chamada é estabelecida. Saiba como obter o evento CallConnected do SDK de automação de chamadas.
    2. Depois que você atender a chamada ou uma chamada for criada, ela retornará a serverCallId propriedade as das respostas da AnswerCallResult API ou CreateCallResult da API, 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, use sua cadeia de conexão dos Serviços de Comunicação e passe-a 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.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. AUDIOUtilize.
  • Use RecordingChannel para passar o tipo de canal de gravação. Utilizar MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. WAVUtilize.
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 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.

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 a 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 a 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 a 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 (como o término da reunião ou a interrupção da gravação). 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.

O código a seguir é 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 . Use o download_recording método para baixar o 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, como mídia gravada e 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 evento depois que CallConnected uma chamada é estabelecida. Saiba como obter um evento CallConnected a partir do SDK de automação de chamadas.
    2. Depois que você atender a chamada ou uma chamada for criada, ela retornará a serverCallId propriedade as das respostas da AnswerCallResult API ou CreateCallResult da API, 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 um 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 sua cadeia de conexão dos Serviços de Comunicação e passe-a 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.

  • Use RecordingContent para passar o tipo de conteúdo de gravação. AUDIOUtilize.
  • Use RecordingChannel para passar o tipo de canal de gravação. Utilizar MIXED ou UNMIXED.
  • Use RecordingFormat para passar o formato da gravação. WAVUtilize.
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

Comece a gravar usando seu Armazenamento de Blob do Azure designado para armazenar o arquivo gravado 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 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.

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 a 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 a 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 a 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 (como o término da reunião ou a interrupção da gravação). 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.

O código a seguir é 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 . Use o DownloadToAsync método para baixar o conteúdo em um 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: