Início Rápido da gravação de chamada
Este artigo descreve a gravação de 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. Para construir a experiência de chamada para os usuários finais, familiarize-se com o SDK do cliente de chamadas e a Automação de Chamadas.
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
:
Quando ao estabelecer uma chamada, ela retorna um
serverCallId
como propriedade do eventoCallConnected
. Saiba como Obter evento CallConnected do SDK de Automação de Chamada.Quando você atende a chamada ou uma chamada é criada, retorna o
serverCallId
como propriedade das respostas das APIsAnswerCallResult
ouCreateCallResult
, respectivamente.
Chamar cenários do SDK
Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId
usando o método getServerCallId
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. Para isso, 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 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.
- Use
RecordingContent
para passar o tipo de conteúdo de gravação. UseAUDIO
. - Use
RecordingChannel
para passar o tipo de canal de gravação. UseMIXED
ouUNMIXED
. - Use
RecordingFormat
para passar o formato da gravação. UseWAV
.
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
Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado 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>"))
ExternalStorage = new BlobStorage(new Uri("<Insert Container / Blob Uri>"))
};
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 sessão de gravação usando a API StopAsync
Use a recordingId
recebida em resposta à StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Pausar a sessão de gravação usando a API PauseAsync
Use a recordingId
recebida em resposta à StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Retomar a sessão de gravação usando a API ResumeAsync
Use a recordingId
recebida em resposta à StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Baixar arquivo de gravação usando a API DownloadToAsync
Use um web hook da Grade de Eventos do Azure ou outra ação disparada para notificar seus serviços quando a mídia gravada estiver pronta para baixar.
Uma notificação Microsoft.Communication.RecordingFileStatusUpdated
da Grade de Eventos é publicada quando uma gravação está pronta para recuperação. Isso normalmente ocorre alguns minutos após a conclusão do processamento da gravação (como quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que podem ser usados para recuperar tanto a mídia gravada quanto um arquivo de metadados da 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);
Busque o downloadLocation
da gravação do atributo contentLocation
do recordingChunk
. Use o método DownloadToAsync
para baixar o conteúdo em um nome de arquivo fornecido.
7. Excluir o conteúdo de gravação usando a API DeleteAsync
Use a API DeleteAsync
para excluir o conteúdo da gravação (como mídias e metadados gravados).
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 Chamadas 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 a criação de uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
após a chamada ser 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.
Chamar cenários do SDK
Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId
usando o método getServerCallId
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. Para isso, 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 objeto CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Iniciar a sessão de gravação com StartRecordingOptions usando a API startWithResponse
Use a serverCallId
recebida durante o início da chamada.
- Use
RecordingContent
para passar o tipo de conteúdo de gravação. UseAUDIO
. - Use
RecordingChannel
para passar o tipo de canal de gravação. UseMIXED
ouUNMIXED
. - Use
RecordingFormat
para passar o formato da gravação. UseWAV
.
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
Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado após a conclusão da gravação.
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. Iniciar a sessão de gravação com o modo Pausar habilitado usando a API StartAsync
Observação
As gravações precisam 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. 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>"))
.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. Parar a sessão de gravação usando a API stopWithResponse
Use a recordingId
recebida em resposta à startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Pausar a sessão de gravação usando a API pauseWithResponse
Use a recordingId
recebida em resposta à startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Retomar a sessão de gravação usando a API resumeWithResponse
Use a recordingId
recebida em resposta à startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Baixar 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 Microsoft.Communication.RecordingFileStatusUpdated
da 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 quando a reunião termina ou a gravação é interrompida). As notificações de eventos de gravação incluem contentLocation
e metadataLocation
, que podem ser usados para recuperar tanto a mídia gravada quanto um arquivo de metadados da gravação.
O item a seguir é um 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 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
: um objeto opcionalParallelDownloadOptions
para modificar como o download paralelo funciona. -
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. Excluir o conteúdo de gravação usando a API deleteWithResponse
Use o método deleteWithResponse
da classe CallRecording
para excluir a mídia gravada. Parâmetros compatíveis com 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 a criação de uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
após a chamada ser estabelecida. Saiba como Obter evento CallConnected do SDK de Automação de Chamada. - Quando você atende a chamada ou uma chamada é criada, retorna o
serverCallId
como propriedade das respostas das APIsAnswerCallResult
ouCreateCallResult
, respectivamente.
- Após a criação de 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, use sua cadeia de conexão dos Serviços de Comunicação e passe-a 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.
- Use
RecordingContent
para passar o tipo de conteúdo de gravação. UseAUDIO
. - Use
RecordingChannel
para passar o tipo de canal de gravação. UseMIXED
ouUNMIXED
. - Use
RecordingFormat
para passar o formato da gravação. UseWAV
.
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. 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.
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 em resposta à 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 em resposta à 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 em resposta à 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
é publicada quando uma gravação está pronta para recuperação, geralmente alguns minutos após a conclusão do processo de gravação (como quando a reunião termina ou a 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.
O item a seguir é um 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 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
. Use o método download_recording
para baixar o conteúdo em bytes.
7. Excluir o conteúdo da gravação usando a API 'delete_recording'
Use a API delete_recording
para excluir conteúdos da gravação, como mídias gravadas e 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 a criação de uma chamada, uma
serverCallId
retornará por meio do eventoCallConnected
após a chamada ser estabelecida. Saiba como Obter um evento CallConnected do SDK de Automação de Chamadas. - Quando você atende a chamada ou uma chamada é criada, retorna o
serverCallId
como propriedade das respostas das APIsAnswerCallResult
ouCreateCallResult
, respectivamente.
- Após a criação de uma chamada, uma
Chamar cenários do SDK
Ao usar Chamar SDK do Cliente, você poderá recuperar serverCallId
usando o método getServerCallId
na chamada.
Use este exemplo para saber como Obter uma serverCallId do SDK do Cliente de Chamadas.
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, use sua cadeia de conexão dos Serviços de Comunicação e passe-a 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.
- Use
RecordingContent
para passar o tipo de conteúdo de gravação. UseAUDIO
. - Use
RecordingChannel
para passar o tipo de canal de gravação. UseMIXED
ouUNMIXED
. - Use
RecordingFormat
para passar o formato da gravação. UseWAV
.
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
Comece a gravar usando o Armazenamento de Blobs do Azure designado para armazenar o arquivo gravado 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. 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.
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 em resposta à start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Pausar a sessão de gravação usando a API 'pause'.
Use a recordingId
recebida em resposta à start
.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Retomar a sessão de gravação usando a API "ResumeAsync"
Use a recordingId
recebida em resposta à 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
é publicada quando uma gravação está pronta para recuperação, geralmente alguns minutos após a conclusão do processo de gravação (como quando a reunião termina ou a 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.
O item a seguir é um 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 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
. Use o método DownloadToAsync
para baixar o conteúdo em um 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, confira os seguintes artigos:
- Baixe nossos aplicativos de exemplo para gravação de chamadas em Java, Python e JavaScript.
- Saiba mais sobre os Gravação de chamada.
- Saiba mais sobre a Automação de Chamadas.