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

Este início rápido permite-lhe começar com a Gravação de Chamadas para chamadas de voz e vídeo. Para começar a utilizar as APIs de Gravação de Chamadas, tem de ter uma chamada em vigor. Certifique-se de que está familiarizado com o SDK de cliente de chamadas e/ou a Automatização de Chamadas para criar a experiência de chamada do utilizador final.

Código de Exemplo

Pode transferir a aplicação de exemplo a partir do GitHub

Pré-requisitos

  • Precisa de uma conta do Azure com uma subscrição ativa.
  • Implementar um recurso do Serviço de Comunicação. Grave a cadeia de ligação de recursos.
  • Subscreva eventos através de Azure Event Grid.
  • Transferir o SDK .NET

Antes de começar

As APIs de Gravação de Chamadas utilizam exclusivamente a serverCallIdpara iniciar a gravação. Existem alguns métodos que pode utilizar para obter o, dependendo do serverCallId seu cenário:

Cenários de Automatização de Chamadas

  • Ao utilizar a Automatização de Chamadas, tem duas opções para obter o serverCallId:
    1. Assim que uma chamada é criada, uma serverCallId é devolvida como uma propriedade do CallConnected evento após a criação de uma chamada. Saiba como Obter o evento CallConnected a partir do SDK de Automatização de Chamadas.
    2. Assim que atender a chamada ou uma chamada for criada, a serverCallId chamada é devolvida como uma propriedade das AnswerCallResult respostas ou CreateCallResult da API, respetivamente.

Chamar cenários do SDK

Vamos começar com alguns passos simples!

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

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automatização de Chamadas Azure Communication Services. Assim, é necessário criar um cliente de Automatização de Chamadas. Para criar um cliente de automatização de chamadas, utilize a cadeia de ligação dos Serviços de Comunicação e transmita-a para CallAutomationClient o objeto.

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

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

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

  • RecordingContent é utilizado para transmitir o tipo de conteúdo de gravação. Utilizar áudio
  • RecordingChannel é utilizado para transmitir o tipo de canal de gravação. Utilize misto ou não misturado.
  • RecordingFormat é utilizado para transmitir o formato da gravação. Utilize 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. Apenas para Unmixed - Especifique um utilizador no canal 0

Para produzir ficheiros de gravação de áudio não misturados, pode utilizar a AudioChannelParticipantOrdering funcionalidade para especificar o utilizador que pretende gravar no canal 0. Os restantes participantes são atribuídos a um canal enquanto falam. Se utilizar RecordingChannel.Unmixed , mas não utilizar AudioChannelParticipantOrdering, a Gravação de Chamadas atribui o canal 0 ao primeiro participante a falar.

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.2. Apenas para Unmixed - 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 a recordingId da sessão de gravação.

3. Pare a sessão de gravação com a API "StopAsync"

Utilize o recordingId recebido em resposta a StartAsync.

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

4. Colocar em pausa a sessão de gravação com a API "PauseAsync"

Utilize o recordingId recebido em resposta a StartAsync.

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

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

Utilize o recordingId recebido em resposta a StartAsync.

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

6. Transferir ficheiro de gravação com a API "DownloadToAsync"

Utilize um web hook Azure Event Grid ou outra ação acionada para notificar os seus serviços quando o suporte de dados gravado estiver pronto para transferência.

É publicada uma notificação Microsoft.Communication.RecordingFileStatusUpdated do Event Grid quando uma gravação está pronta para ser obtida, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, a reunião terminou, a gravação parou). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são utilizadas para obter suportes de dados gravados e um ficheiro 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
}

Utilize DownloadToAsync a API para transferir o suporte de dados gravado.

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 atributo do recordingChunk. DownloadToAsync o método transfere o conteúdo para o nome de ficheiro fornecido.

7. Eliminar conteúdo de gravação com a API "DeleteAsync"

Utilizar DeleteAsync a API para eliminar o conteúdo da gravação (por exemplo, multimédia gravada, metadados)

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

Código de Exemplo

Pode transferir a aplicação de exemplo a partir do GitHub

Pré-requisitos

  • Precisa de uma conta do Azure com uma subscrição ativa.
  • Implementar um recurso do Serviço de Comunicação. Grave a cadeia de ligação de recursos.
  • Subscreva eventos através de Azure Event Grid.
  • Transferir o SDK Java

Antes de começar

As APIs de Gravação de Chamadas utilizam exclusivamente a serverCallIdpara iniciar a gravação. Existem alguns métodos que pode utilizar para obter o, dependendo do serverCallId seu cenário:

Cenários de Automatização de Chamadas

  • Ao utilizar a Automatização de Chamadas, tem duas opções para obter o serverCallId:
    1. Assim que uma chamada é criada, uma serverCallId é devolvida como uma propriedade do CallConnected evento após a criação de uma chamada. Saiba como Obter o evento CallConnected a partir do SDK de Automatização de Chamadas.
    2. Assim que atender a chamada ou uma chamada for criada, a serverCallId chamada é devolvida como uma propriedade das AnswerCallResult respostas ou CreateCallResult da API, respetivamente.

Chamar cenários do SDK

Vamos começar com alguns passos simples!

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

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automatização de Chamadas Azure Communication Services. Assim, é necessário criar um cliente de Automatização de Chamadas. Para criar um cliente de automatização de chamadas, irá utilizar a cadeia de ligação dos Serviços de Comunicação e transmiti-la para CallAutomationClient objeto.

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

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

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

  • RecordingContent é utilizado para transmitir o tipo de conteúdo de gravação. Utilizar ÁUDIO
  • RecordingChannel é utilizado para transmitir o tipo de canal de gravação. Utilize MIXED ou UNMIXED.
  • RecordingFormat é utilizado para transmitir o formato da gravação. Utilize 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. Apenas para Unmixed - Especifique um utilizador no canal 0

Para produzir ficheiros de gravação de áudio não misturados, pode utilizar a AudioChannelParticipantOrdering funcionalidade para especificar o utilizador que pretende gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se utilizar RecordingChannel.Unmixed , mas não utilizar 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.2. Apenas para Unmixed - 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 a recordingId da sessão de gravação.

3. Pare a sessão de gravação com a API "stopWithResponse"

Utilize o recordingId recebido em resposta a startWithResponse.

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

4. Colocar em pausa a sessão de gravação com a API "pauseWithResponse"

Utilize o recordingId recebido em resposta a startWithResponse.

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

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

Utilize o recordingId recebido em resposta a startWithResponse.

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

6. Transferir ficheiro de gravação com a API "downloadToWithResponse"

Utilize um web hook Azure Event Grid ou outra ação acionada para notificar os seus serviços quando o suporte de dados gravado estiver pronto para transferência.

É publicada uma notificação Microsoft.Communication.RecordingFileStatusUpdated do Event Grid quando uma gravação está pronta para ser obtida, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, a reunião terminou, a gravação parou). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são utilizadas para obter suportes de dados gravados e um ficheiro de metadados de gravação.

Segue-se 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
}

Utilize o downloadToWithResponse método de CallRecording classe para transferir o suporte de dados gravado. Seguem-se os parâmetros suportados para downloadToWithResponse o método:

  • contentLocation: Azure Communication Services URL onde o conteúdo está localizado.
  • destinationPath : Localização do ficheiro.
  • parallelDownloadOptions: um objeto ParallelDownloadOptions opcional para modificar a forma como a transferência paralela irá funcionar.
  • overwrite: verdadeiro para substituir o ficheiro se existir.
  • context: um contexto que representa o contexto do pedido.
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);

A localização do conteúdo e os IDs de documento dos ficheiros de gravação podem ser obtidos a contentLocation partir dos campos e documentId , respetivamente, para cada recordingChunk.

7. Elimine o conteúdo da gravação com a API "deleteWithResponse".

Utilize o deleteWithResponse método de CallRecording classe para eliminar o suporte de dados gravado. Seguem-se os parâmetros suportados para deleteWithResponse o método:

  • deleteLocation: Azure Communication Services URL onde se encontra o conteúdo a eliminar.
  • context: um contexto que representa o contexto do pedido.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

A localização de eliminação da gravação pode ser obtida a deleteLocation partir do campo do evento do Event Grid.

Código de Exemplo

Pode transferir a aplicação de exemplo a partir do GitHub

Pré-requisitos

  • Precisa de uma conta do Azure com uma subscrição ativa.
  • Implementar um recurso do Serviço de Comunicação. Grave a cadeia de ligação de recursos.
  • Subscreva eventos através de Azure Event Grid.
  • Python 3.7+.

Antes de começar

As APIs de Gravação de Chamadas utilizam exclusivamente a serverCallIdpara iniciar a gravação. Existem alguns métodos que pode utilizar para obter o, dependendo do serverCallId seu cenário:

Cenários de Automatização de Chamadas

  • Ao utilizar a Automatização de Chamadas, tem duas opções para obter o serverCallId:
    1. Assim que uma chamada é criada, uma serverCallId é devolvida como uma propriedade do CallConnected evento após a criação de uma chamada. Saiba como Obter o evento CallConnected a partir do SDK de Automatização de Chamadas.
    2. Assim que atender a chamada ou uma chamada for criada, a serverCallId chamada é devolvida como uma propriedade das AnswerCallResult respostas ou CreateCallResult da API, respetivamente.

Chamar cenários do SDK

Vamos começar com alguns passos simples!

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

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automatização de Chamadas Azure Communication Services. Assim, é necessário criar um cliente de Automatização de Chamadas. Para criar um cliente de automatização de chamadas, irá utilizar a cadeia de ligação dos Serviços de Comunicação e transmiti-la para CallAutomationClient objeto.

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

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

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

  • RecordingContent é utilizado para transmitir o tipo de conteúdo de gravação. Utilizar áudio
  • RecordingChannel é utilizado para transmitir o tipo de canal de gravação. Utilize misto ou não misturado.
  • RecordingFormat é utilizado para transmitir o formato da gravação. Utilize 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. Apenas para Unmixed - Especifique um utilizador no canal 0

Para produzir ficheiros de gravação de áudio não misturados, pode utilizar a AudioChannelParticipantOrdering funcionalidade para especificar o utilizador que pretende gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se utilizar RecordingChannel.Unmixed , mas não utilizar 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.2. Apenas para Unmixed - 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 a recordingId da sessão de gravação.

3. Parar a sessão de gravação com a API "stop_recording"

Utilize o recording_id recebido em resposta a start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

4. Colocar em pausa a sessão de gravação com a API "pause_recording"

Utilize o recording_id recebido em resposta a start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

5. Retomar a sessão de gravação com a API "resume_recording"

Utilize o recording_id recebido em resposta a start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Transferir ficheiro de gravação com a API "download_recording"

Utilize um web hook Azure Event Grid ou outra ação acionada para notificar os seus serviços quando o suporte de dados gravado estiver pronto para transferência.

É publicada uma notificação Microsoft.Communication.RecordingFileStatusUpdated do Event Grid quando uma gravação está pronta para ser obtida, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, a reunião terminou, a gravação parou). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são utilizadas para obter suportes de dados gravados e um ficheiro de metadados de gravação.

Segue-se 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
}

Utilize download_recording a API para transferir o suporte de dados gravado.

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 atributo do recordingChunk. download_recording o método transfere o conteúdo para bytes.

7. Eliminar conteúdo de gravação com a API "delete_recording"

Utilizar delete_recording a API para eliminar o conteúdo da gravação (por exemplo, multimédia gravada, metadados)

response = call_automation_client.delete_recording(delete_location);

Código de Exemplo

Pode transferir a aplicação de exemplo a partir do GitHub

Pré-requisitos

  • Precisa de uma conta do Azure com uma subscrição ativa.
  • Implementar um recurso do Serviço de Comunicação. Grave a cadeia de ligação de recursos.
  • Subscreva eventos através de Azure Event Grid.
  • 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 Chamadas utilizam exclusivamente a serverCallIdpara iniciar a gravação. Existem alguns métodos que pode utilizar para obter o, dependendo do serverCallId seu cenário:

Cenários de Automatização de Chamadas

  • Ao utilizar a Automatização de Chamadas, tem duas opções para obter o serverCallId:
    1. Assim que uma chamada é criada, uma serverCallId é devolvida como uma propriedade do CallConnected evento após a criação de uma chamada. Saiba como Obter o evento CallConnected a partir do SDK de Automatização de Chamadas.
    2. Assim que atender a chamada ou uma chamada for criada, a serverCallId chamada é devolvida como uma propriedade das AnswerCallResult respostas ou CreateCallResult da API, respetivamente.

Chamar cenários do SDK

Vamos começar com alguns passos simples!

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

As APIs de Gravação de Chamadas fazem parte das bibliotecas de Automatização de Chamadas Azure Communication Services. Assim, é necessário criar um cliente de Automatização de Chamadas. Para criar um cliente de automatização de chamadas, irá utilizar a cadeia de ligação dos Serviços de Comunicação e transmiti-la para CallAutomationClient objeto.

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

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

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

  • RecordingContent é utilizado para transmitir o tipo de conteúdo de gravação. Utilizar áudio
  • RecordingChannel é utilizado para transmitir o tipo de canal de gravação. Utilize misto ou não misturado.
  • RecordingFormat é utilizado para transmitir o formato da gravação. Utilize 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. Apenas para Unmixed - Especifique um utilizador no canal 0

Para produzir ficheiros de gravação de áudio não misturados, pode utilizar a AudioChannelParticipantOrdering funcionalidade para especificar o utilizador que pretende gravar no canal 0. Os restantes participantes serão atribuídos a um canal enquanto falam. Se utilizar RecordingChannel.Unmixed , mas não utilizar 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.2. Apenas para Unmixed - 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 a recordingId da sessão de gravação.

3. Parar a sessão de gravação com a API "parar"

Utilize o recordingId recebido em resposta a start.

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

4. Colocar em pausa a sessão de gravação com a API "colocar em pausa"

Utilize o recordingId recebido em resposta a start.

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

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

Utilize o recordingId recebido em resposta a start.

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

6. Transferir ficheiro de gravação com a API "DownloadToAsync"

Utilize um web hook Azure Event Grid ou outra ação acionada para notificar os seus serviços quando o suporte de dados gravado estiver pronto para transferência.

É publicada uma notificação Microsoft.Communication.RecordingFileStatusUpdated do Event Grid quando uma gravação está pronta para ser obtida, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, a reunião terminou, a gravação parou). As notificações de eventos de gravação incluem contentLocation e metadataLocation, que são utilizadas para obter suportes de dados gravados e um ficheiro de metadados de gravação.

Segue-se 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
}

Utilize downloadToPath a API para transferir o suporte de dados gravado.

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

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

7. Eliminar conteúdo de gravação com a API "DeleteAsync"

Utilizar delete a API para eliminar o conteúdo da gravação (por exemplo, multimédia gravada, metadados)

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

Limpar os recursos

Se quiser limpar e remover uma subscrição dos Serviços de Comunicação, pode eliminar o recurso ou grupo de recursos. Eliminar o grupo de recursos também elimina quaisquer outros recursos associados ao mesmo. Saiba mais sobre a limpeza de recursos.

Próximos passos

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