Início Rápido da Gravação de Chamada
Este guia de início rápido mostra como começar com a Gravação de Chamada para chamadas de voz e vídeo. Para começar a usar as APIs de Gravação de Chamada, você deve ter uma chamada em andamento. Verifique se você está familiarizado com a Chamada do SDK do cliente e/ou a Automação de Chamadas para criar a experiência de chamada do usuário final.
Exemplo de código
É possível baixar o aplicativo de exemplo do GitHub
Pré-requisitos
- Você precisa de uma conta do Azure com uma assinatura ativa.
- Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
- Assine eventos por meio da Grade de Eventos do Azure.
- Baixar o SDK do .NET
Antes de começar
As APIs de Gravação de Chamada usam exclusivamente a serverCallId
para iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId
dependendo do seu cenário:
Cenários de Automação de Chamada
- Ao usar a Automação de Chamada, você terá duas opções para obter a
serverCallId
:- Após criar uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
depois que uma chamada tiver sido estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada. - Depois que você atende a chamada ou uma chamada é criada, a
serverCallId
é retornada como uma propriedade das respostasAnswerCallResult
ouCreateCallResult
da API, respectivamente.
- Após criar uma chamada, uma
Chamar cenários do SDK
- Ao usar Chamar SDK do Cliente, você poderá recuperar
serverCallId
usando o métodogetServerCallId
na chamada. Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.
Vamos começar com algumas etapas simples!
1. Criar um cliente de Automação de Chamadas
As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.
Para criar um cliente de automação de chamadas, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará para o objeto CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Iniciar a sessão de gravação com StartRecordingOptions usando a API "StartAsync"
Use a serverCallId
recebida durante o início da chamada.
- RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
- RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
- RecordingFormat é usado para passar o formato da gravação. Use wav.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.1. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure
Inicie a gravação com seu próprio Armazenamento de Blobs do Azure definido para armazenar o arquivo de gravação após a conclusão da gravação.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
RecordingStorage = RecordingStorage.CreateAzureBlobContainerRecordingStorage(new Uri("<YOUR_STORAGE_CONTAINER_URL>"))
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.2. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”
Observação
As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
PauseOnStart = true,
RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.3. Somente para não misturado – Especificar um usuário em um canal 0
Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering
para especificar qual usuário deseja gravar em cada canal 0. Um canal será atribuído ao restante dos participantes enquanto eles falam. Se você usar RecordingChannel.Unmixed
, mas não usar AudioChannelParticipantOrdering
, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
AudioChannelParticipantOrdering = { new CommunicationUserIdentifier("<ACS_USER_MRI>") }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);
2.4. Somente para não misturado – Especificar a afinidade do canal
var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
ChannelAffinity = new List<ChannelAffinity>{ channelAffinity }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);
A resposta da API StartAsync
contém a recordingId
da sessão de gravação.
3. Parar a gravação da sessão usando a API "StopAsync"
Use a recordingId
recebida na resposta a StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Pausar a sessão de gravação usando a API "PauseAsync"
Use a recordingId
recebida na resposta a StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Retomar a sessão de gravação usando a API "ResumeAsync"
Use a recordingId
recebida na resposta a StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Baixar o arquivo de gravação usando a API “DownloadToAsync”
Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.
Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated
será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.
Exemplo do esquema do evento:
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Use a API DownloadToAsync
para baixar a mídia gravada.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
O downloadLocation
para a gravação pode ser buscado a partir do atributo contentLocation
do recordingChunk
. O método DownloadToAsync
baixa o conteúdo para o nome de arquivo fornecido.
7. Excluir o conteúdo de gravação usando a API "DeleteAsync"
Usar a API DeleteAsync
para excluir conteúdo da gravação (por exemplo, mídia gravada, metadados)
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Exemplo de código
É possível baixar o aplicativo de exemplo do GitHub
Pré-requisitos
- Você precisa de uma conta do Azure com uma assinatura ativa.
- Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
- Assine eventos por meio da Grade de Eventos do Azure.
- Baixar o SDK do Java
Antes de começar
As APIs de Gravação de Chamada usam exclusivamente a serverCallId
para iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId
dependendo do seu cenário:
Cenários de Automação de Chamada
- Ao usar a Automação de Chamada, você terá duas opções para obter a
serverCallId
:- Após criar uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
depois que uma chamada tiver sido estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada. - Depois que você atende a chamada ou uma chamada é criada, a
serverCallId
é retornada como uma propriedade das respostasAnswerCallResult
ouCreateCallResult
da API, respectivamente.
- Após criar uma chamada, uma
Chamar cenários do SDK
- Ao usar Chamar SDK do Cliente, você poderá recuperar
serverCallId
usando o métodogetServerCallId
na chamada. Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.
Vamos começar com algumas etapas simples!
1. Criar um cliente de Automação de Chamadas
As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.
Para criar um cliente de automação de chamadas, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará para o objeto CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Inicie a sessão de gravação com o StartRecordingOptions usando a API "startWithResponse"
Use a serverCallId
recebida durante o início da chamada.
- RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar ÁUDIO
- RecordingChannel é usado para passar o tipo de canal de gravação. Use MISTURADO ou NÃO MISTURADO.
- RecordingFormat é usado para passar o formato da gravação. Use WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.1. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure
Inicie a sessão de Gravação com seu próprio Armazenamento de Blobs do Azure para armazenar o arquivo de gravação assim que a gravação for concluída.
StartRecordingOptions recordingOptions = new StartRecordingOptions(callLocator)
.setRecordingChannel(RecordingChannel.MIXED)
.setRecordingContent(RecordingContent.AUDIO_VIDEO)
.setRecordingFormat(RecordingFormat.MP4)
.setRecordingStorage(new AzureBlobContainerRecordingStorage("<YOUR_STORAGE_CONTAINER_URL>"));
// //start recording
RecordingStateResult result = callRecording.start(recordingOptions);
2.2. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”
Observação
As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setPauseOnStart(true)
.setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.3. Somente para não misturado – Especificar um usuário em um canal 0
Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering
para especificar qual usuário deseja gravar em cada canal 0. O restante dos participantes será atribuído a um canal enquanto falam. Se você usar RecordingChannel.Unmixed
, mas não usar AudioChannelParticipantOrdering
, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);
2.4. Somente para não misturado – Especificar a afinidade do canal
ChannelAffinity channelAffinity = new ChannelAffinity()
.setParticipant(new PhoneNumberIdentifier("RECORDING_ID"))
.setChannel(0);
List<ChannelAffinity> channelAffinities = Arrays.asList(channelAffinity);
StartRecordingOptions startRecordingOptions = new StartRecordingOptions(new ServerCallLocator(SERVER_CALL_ID))
.setRecordingChannel(RecordingChannel.UNMIXED)
.setRecordingFormat(RecordingFormat.WAV)
.setRecordingContent(RecordingContent.AUDIO)
.setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
.setChannelAffinity(channelAffinities);
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startRecordingWithResponse(recordingOptions, null);
A resposta da API startWithResponse
contém a recordingId
da sessão de gravação.
3. Pare a sessão de gravação usando a API do servidor "stopWithResponse"
Use a recordingId
recebida na resposta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Pause a sessão de gravação usando a API do "pauseWithResponse"
Use a recordingId
recebida na resposta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Retome a sessão de gravação usando a API "resumeWithResponse"
Use a recordingId
recebida na resposta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Baixe o arquivo de gravação usando a API “downloadToWithResponse”
Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.
Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated
será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.
Veja abaixo um exemplo do esquema de eventos.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Use o método downloadToWithResponse
da classe CallRecording
para baixar a mídia gravada. Veja a seguir os parâmetros com suporte para o método downloadToWithResponse
:
contentLocation
: URL dos Serviços de Comunicação do Azure em que o conteúdo está localizado.destinationPath
: local do arquivo.parallelDownloadOptions
: objeto ParallelDownloadOptions opcional para modificar como o download paralelo funcionará.overwrite
: True para substituir o arquivo, se ele existir.context
: contexto que representa o contexto da solicitação.
Boolean overwrite = true;
ParallelDownloadOptions parallelDownloadOptions = null;
Context context = null;
String filePath = String.format(".\\%s.%s", documentId, fileType);
Path destinationPath = Paths.get(filePath);
Response<Void> downloadResponse = callAutomationClient.getCallRecording().downloadToWithResponse(contentLocation, destinationPath, parallelDownloadOptions, overwrite, context);
O local do conteúdo e as IDs do documento dos arquivos de gravação podem ser obtidos nos campos contentLocation
e documentId
, respectivamente, para cada recordingChunk
.
7. Exclua o conteúdo de gravação usando a API "deleteWithResponse"
Use o método deleteWithResponse
da classe CallRecording
para excluir a mídia gravada. Veja a seguir os parâmetros com suporte para o método deleteWithResponse
:
deleteLocation
: URL dos Serviços de Comunicação do Azure onde o conteúdo a ser excluído está localizado.context
: contexto que representa o contexto da solicitação.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
O local de exclusão da gravação pode ser buscado no campo deleteLocation
do evento de Grade de Eventos.
Exemplo de código
É possível baixar o aplicativo de exemplo do GitHub
Pré-requisitos
- Você precisa de uma conta do Azure com uma assinatura ativa.
- Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
- Assine eventos por meio da Grade de Eventos do Azure.
- Python 3.7+.
Antes de começar
As APIs de Gravação de Chamada usam exclusivamente a serverCallId
para iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId
dependendo do seu cenário:
Cenários de Automação de Chamada
- Ao usar a Automação de Chamada, você terá duas opções para obter a
serverCallId
:- Após criar uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
depois que uma chamada tiver sido estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada. - Depois que você atende a chamada ou uma chamada é criada, a
serverCallId
é retornada como uma propriedade das respostasAnswerCallResult
ouCreateCallResult
da API, respectivamente.
- Após criar uma chamada, uma
Chamar cenários do SDK
- Ao usar o SDK do Cliente de Chamada, você pode recuperar o
serverCallId
usando a variávelserver_call_id
na chamada. Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.
Vamos começar com algumas etapas simples!
1. Criar um cliente de Automação de Chamadas
As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.
Para criar um cliente de automação de chamadas, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará para o objeto CallAutomationClient
.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Iniciar a sessão de gravação API start_recording
Use a serverCallId
recebida durante o início da chamada.
- RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
- RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
- RecordingFormat é usado para passar o formato da gravação. Use wav.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>")
2.1. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure
Inicie a gravação com seu próprio Armazenamento de Blobs do Azure definido para armazenar o arquivo de gravação após a conclusão da gravação.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
recording_storage = AzureBlobContainerRecordingStorage(container_url="<YOUR_STORAGE_CONTAINER_URL>"))
2.2. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”
Observação
As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
pause_on_start = true,
recording_state_callback_url = "<CallbackUri>")
2.3. Somente para não misturado – Especificar um usuário em um canal 0
Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering
para especificar qual usuário deseja gravar em cada canal 0. O restante dos participantes será atribuído a um canal enquanto falam. Se você usar RecordingChannel.Unmixed
, mas não usar AudioChannelParticipantOrdering
, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
audio_channel_participant_ordering=[CommunicationUserIdentifier(id="<ACS_USER_MRI>")])
2.4. Somente para não misturado – Especificar a afinidade do canal
_channel_affinity = ChannelAffinity(target_participant=CommunicationUserIdentifier("<ACS_USER_MRI>"), channel=0)
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
channel_affinity=[_channel_affinity])
A resposta da API StartAsync
contém a recordingId
da sessão de gravação.
3. Interromper a sessão de gravação usando a API 'stop_recording'
Use a recording_id
recebida na resposta a start_recording
.
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. Pausar a sessão de gravação usando a API 'pause_recording'
Use a recording_id
recebida na resposta a start_recording
.
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. Retomar a sessão de gravação usando a API 'resume_recording'
Use a recording_id
recebida na resposta a start_recording
.
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. Baixe o arquivo de gravação usando a API 'download_recording'
Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.
Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated
será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.
Veja abaixo um exemplo do esquema de eventos.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Use a API download_recording
para baixar a mídia gravada.
response = recording_data = call_automation_client.download_recording(content_location)
with open("<file_name>", "wb") as binary_file:
binary_file.write(recording_data.read())
O downloadLocation
para a gravação pode ser buscado a partir do atributo contentLocation
do recordingChunk
. O método download_recording
faz o download do conteúdo em bytes.
7. Excluir o conteúdo da gravação usando a API 'delete_recording'
Usar a API delete_recording
para excluir conteúdo da gravação (por exemplo, mídia gravada, metadados)
response = call_automation_client.delete_recording(delete_location);
Exemplo de código
É possível baixar o aplicativo de exemplo do GitHub
Pré-requisitos
- Você precisa de uma conta do Azure com uma assinatura ativa.
- Um recurso do Serviço de Comunicação do Azure. Grave sua cadeia de conexão do recurso.
- Assine eventos por meio da Grade de Eventos do Azure.
- Node.js: versões LTS Ativas e LTS de Manutenção (8.11.1 e 10.14.1 recomendados)
Antes de começar
As APIs de Gravação de Chamada usam exclusivamente a serverCallId
para iniciar a gravação. Há alguns métodos que você pode usar para buscar a serverCallId
dependendo do seu cenário:
Cenários de Automação de Chamada
- Ao usar a Automação de Chamada, você terá duas opções para obter a
serverCallId
:- Após criar uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
depois que uma chamada tiver sido estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada. - Depois que você atende a chamada ou uma chamada é criada, a
serverCallId
é retornada como uma propriedade das respostasAnswerCallResult
ouCreateCallResult
da API, respectivamente.
- Após criar uma chamada, uma
Chamar cenários do SDK
- Ao usar Chamar SDK do Cliente, você poderá recuperar
serverCallId
usando o métodogetServerCallId
na chamada. Use este exemplo para saber como Obter a serverCallId do SDK do Cliente de Chamada.
Vamos começar com algumas etapas simples!
1. Criar um cliente de Automação de Chamadas
As APIs de Gravação de Chamada fazem parte das bibliotecas de Automação de Chamada dos Serviços de Comunicação do Azure. Portanto, é necessário criar um cliente de Automação de Chamada.
Para criar um cliente de automação de chamadas, você usará a sua cadeia de conexão dos Serviços de Comunicação e a passará para o objeto CallAutomationClient
.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Iniciar a sessão de gravação com StartRecordingOptions usando a API "StartAsync"
Use a serverCallId
recebida durante o início da chamada.
- RecordingContent é usado para passar o tipo de conteúdo de gravação. Usar áudio
- RecordingChannel é usado para passar o tipo de canal de gravação. Use misturado ou não misturado.
- RecordingFormat é usado para passar o formato da gravação. Use wav.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>"
};
var response = await callAutomationClient.getCallRecording().start(options);
2.1. Iniciar gravação – Traga seu próprio Armazenamento de Blobs do Azure
Inicie a gravação com seu próprio Armazenamento de Blobs do Azure definido para armazenar o arquivo de gravação após a conclusão da gravação.
const recordingStorageKind: RecordingStorageKind = "azureBlobStorage"
const recordingStorage: RecordingStorage = {
recordingStorageKind: recordingStorageKind,
recordingDestinationContainerUrl: "<YOUR_STORAGE_CONTAINER_URL>"
}
var options: StartRecordingOptions = {
callLocator: callLocator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
recordingStorage: recordingStorage
};
var response = await callAutomationClient.getCallRecording().start(options);
2.2. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API “StartAsync”
Observação
As gravações precisarão ser retomadas para que o arquivo de gravação seja gerado.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
pauseOnStart: true
recordingStateCallbackEndpointUrl: "<CallbackUri>",
audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);
2.3. Somente para não misturado – Especificar um usuário em um canal 0
Para produzir arquivos de gravação de áudio não misturado, você poderá usar a funcionalidade AudioChannelParticipantOrdering
para especificar qual usuário deseja gravar em cada canal 0. O restante dos participantes será atribuído a um canal enquanto falam. Se você usar RecordingChannel.Unmixed
, mas não usar AudioChannelParticipantOrdering
, a Gravação de Chamada atribuirá o canal 0 ao primeiro participante que estiver falando.
var locator: CallLocator = { id: "<ServerCallId>", kind: "serverCallLocator" };
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);
2.4. Somente para não misturado – Especificar a afinidade do canal
var options: StartRecordingOptions =
{
callLocator: locator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
ChannelAffinity:
[
{
channel:0,
targetParticipant:{communicationUserId: "<ACS_USER_MRI>"}
}
]
};
var response = await callAutomationClient.getCallRecording().start(options);
A resposta da API StartAsync
contém a recordingId
da sessão de gravação.
3. Interromper a sessão de gravação usando a API 'stop'
Use a recordingId
recebida na resposta a start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Pausar a sessão de gravação usando a API 'pause'.
Use a recordingId
recebida na resposta a start
.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Retomar a sessão de gravação usando a API "ResumeAsync"
Use a recordingId
recebida na resposta a start
.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Baixar o arquivo de gravação usando a API “DownloadToAsync”
Use um web hook de Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para download.
Uma notificação da Grade de Eventos Microsoft.Communication.RecordingFileStatusUpdated
será publicada quando uma gravação estiver pronta para a recuperação, normalmente alguns minutos após a conclusão do processo de gravação (por exemplo, reunião encerrada, gravação interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que são usados para recuperar a mídia gravada e um arquivo de metadados de gravação.
Veja abaixo um exemplo do esquema de eventos.
{
"id": string, // Unique guid for event
"topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
"subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
"data": {
"recordingStorageInfo": {
"recordingChunks": [
{
"documentId": string, // Document id for the recording chunk
"contentLocation": string, //Azure Communication Services URL where the content is located
"metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
"deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
"index": int, // Index providing ordering for this chunk in the entire recording
"endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
}
]
},
"recordingStartTime": string, // ISO 8601 date time for the start of the recording
"recordingDurationMs": int, // Duration of recording in milliseconds
"sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
},
"eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
"dataVersion": string, // "1.0"
"metadataVersion": string, // "1"
"eventTime": string // ISO 8601 date time for when the event was created
}
Use a API downloadToPath
para baixar a mídia gravada.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
O downloadLocation
para a gravação pode ser buscado a partir do atributo contentLocation
do recordingChunk
. O método DownloadToAsync
baixa o conteúdo para o nome de arquivo fornecido.
7. Excluir o conteúdo de gravação usando a API "DeleteAsync"
Usar a API delete
para excluir conteúdo da gravação (por exemplo, mídia gravada, metadados)
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
Limpar os recursos
Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.
Próximas etapas
Para obter mais informações, consulte os seguintes artigos:
- Baixe nossos aplicativos de exemplo de gravação de chamadas Java, Python e JavaScript
- Saiba mais sobre os Gravação de chamada
- Saiba mais sobre a Automação de Chamadas