Inicio rápido de la grabación de llamadas
Este inicio rápido le permite empezar a utilizar la grabación de llamadas de voz y vídeo. Para empezar a usar las API de grabación de llamadas, debe tener una llamada en curso. Asegúrese de que está familiarizado con el SDK de cliente de llamadas o la automatización de llamadas para crear la experiencia de llamada del usuario final.
Código de ejemplo
Puede descargar la aplicación de ejemplo de GitHub.
Requisitos previos
- Necesita una cuenta de Azure con una suscripción activa.
- Implemente un recurso de Communication Service. Registre la cadena de conexión del recurso.
- Suscríbase a eventos a través de Azure Event Grid.
- Descargue el SDK de .NET
Antes de empezar
Las API de grabación de llamadas usan exclusivamente serverCallId
para iniciar la grabación. Hay un par de métodos que puede usar para capturar serverCallId
en función de su escenario:
Escenarios de automatización de llamadas
- Al usar la automatización de llamadas, tiene dos opciones para obtener
serverCallId
:- Cuando se crea una llamada, se devuelve un
serverCallId
con el eventoCallConnected
una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas. - Una vez que responda a la llamada o se cree una llamada,
serverCallId
se devuelve como propiedad de las respuestas de APIAnswerCallResult
oCreateCallResult
respectivamente.
- Cuando se crea una llamada, se devuelve un
Escenarios del SDK de llamada
- Al usar el SDK de cliente de llamada, puede recuperar
serverCallId
mediante el métodogetServerCallId
en la llamada. Use este ejemplo para aprender a obtener serverCallId desde el SDK de cliente de llamada.
Comencemos con unos sencillos pasos.
1. Creación de un cliente de automatización de llamadas
Las API de grabación de llamadas forman parte de las bibliotecas de automatización de llamadas de Azure Communication Services. Por tanto, es necesario crear un cliente de automatización de llamadas.
Para crear un cliente de automatización de llamadas, usará la cadena de conexión de Communication Services y la pasará al objeto de cliente CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. Comience a grabar la sesión con StartRecordingOptions mediante la API "StartAsync"
Use el serverCallId
recibido durante el inicio de la llamada.
- RecordingContent se usa para pasar el tipo de contenido de grabación. Use audio.
- RecordingChannel se usa para pasar el tipo de canal de grabación. Use mezclado o sin mezclar.
- RecordingFormat se usa para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Inicie una grabación con su propio Azure Blob Storage definido para que almacene el archivo resultante una vez completada la grabación.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>"))
{
RecordingContent = RecordingContent.Audio,
RecordingChannel = RecordingChannel.Unmixed,
RecordingFormat = RecordingFormat.Wav,
RecordingStateCallbackUri = new Uri("<CallbackUri>"),
RecordingStorage = RecordingStorage.CreateAzureBlobContainerRecordingStorage(new Uri("<YOUR_STORAGE_CONTAINER_URL>"))
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);
2.2. Inicie la sesión de grabación con el modo pausado habilitado mediante la API "StartAsync"
Nota:
Las grabaciones deben reanudarse para que se genere el archivo de grabación.
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. Solo para archivos sin mezclar: especifique un usuario en el canal 0
Para generar archivos de grabación de audio sin mezclar, puede usar la funcionalidad AudioChannelParticipantOrdering
para especificar el usuario que quiere grabar en el canal 0. El resto de los participantes se asignarán a un canal mientras hablan. Si usa RecordingChannel.Unmixed
pero no usa AudioChannelParticipantOrdering
, Grabación de llamadas asignará el canal 0 al primer participante que hable.
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. Solo para archivos sin mezclar: especifique la afinidad del 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);
La respuesta de la API StartAsync
contiene el recordingId
de la sesión de grabación.
3. Detenga la sesión de grabación mediante la API "StopAsync"
Use el recordingId
recibido en respuesta a StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Pause la sesión de grabación mediante la API "PauseAsync"
Use el recordingId
recibido en respuesta a StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Reanude la sesión de grabación mediante la API "ResumeAsync"
Use el recordingId
recibido en respuesta a StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Descarga del archivo de grabación mediante la API "DownloadToAsync"
Use un webhook Azure Event Grid u otra acción desencadenada debería utilizarse para notificar sus servicios cuando los elementos multimedia grabados ya se puedan descargar.
Se publica una notificación Microsoft.Communication.RecordingFileStatusUpdated
de Event Grid cuando una grabación está lista para recuperarla, normalmente unos minutos después de que se haya completado el proceso de grabación (por ejemplo, finalizó la reunión o se detuvo la grabación). Las notificaciones de eventos de grabación incluyen los elementos contentLocation
y metadataLocation
, que se usan para recuperar los elementos multimedia grabados y un archivo de metadatos de la grabación.
Ejemplo del 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 la API DownloadToAsync
para descargar los elementos multimedia grabados.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
El elemento downloadLocation
de la grabación se puede recuperar del atributo contentLocation
de recordingChunk
. El método DownloadToAsync
descarga el contenido en el nombre de archivo proporcionado.
7. Elimine el contenido de grabación mediante la API "DeleteAsync"
Use la API DeleteAsync
para eliminar el contenido de grabación (por ejemplo, elementos multimedia grabados, metadatos).
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
Código de ejemplo
Puede descargar la aplicación de ejemplo de GitHub.
Requisitos previos
- Necesita una cuenta de Azure con una suscripción activa.
- Implemente un recurso de Communication Service. Registre la cadena de conexión del recurso.
- Suscríbase a eventos a través de Azure Event Grid.
- Descarga del SDK de Java
Antes de empezar
Las API de grabación de llamadas usan exclusivamente serverCallId
para iniciar la grabación. Hay un par de métodos que puede usar para capturar serverCallId
en función de su escenario:
Escenarios de automatización de llamadas
- Al usar la automatización de llamadas, tiene dos opciones para obtener
serverCallId
:- Cuando se crea una llamada, se devuelve un
serverCallId
con el eventoCallConnected
una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas. - Una vez que responda a la llamada o se cree una llamada,
serverCallId
se devuelve como propiedad de las respuestas de APIAnswerCallResult
oCreateCallResult
respectivamente.
- Cuando se crea una llamada, se devuelve un
Escenarios del SDK de llamada
- Al usar el SDK de cliente de llamada, puede recuperar
serverCallId
mediante el métodogetServerCallId
en la llamada. Use este ejemplo para aprender a obtener serverCallId desde el SDK de cliente de llamada.
Comencemos con unos sencillos pasos.
1. Creación de un cliente de automatización de llamadas
Las API de grabación de llamadas forman parte de las bibliotecas de automatización de llamadas de Azure Communication Services. Por tanto, es necesario crear un cliente de automatización de llamadas.
Para crear un cliente de automatización de llamadas, usará la cadena de conexión de Communication Services y la pasará al objeto de cliente CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Comience a grabar la sesión con StartRecordingOptions mediante la API "startWithResponse"
Use el serverCallId
recibido durante el inicio de la llamada.
- RecordingContent se usa para pasar el tipo de contenido de grabación. Use AUDIO.
- RecordingChannel se usa para pasar el tipo de canal de grabación. Use MEZCLADO o SIN MEZCLAR.
- RecordingFormat se usa para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Inicie la sesión de grabación con su propio Azure Blob Storage para almacenar el archivo resultante una vez completada la grabación.
StartRecordingOptions recordingOptions = new StartRecordingOptions(callLocator)
.setRecordingChannel(RecordingChannel.MIXED)
.setRecordingContent(RecordingContent.AUDIO_VIDEO)
.setRecordingFormat(RecordingFormat.MP4)
.setRecordingStorage(new AzureBlobContainerRecordingStorage("<YOUR_STORAGE_CONTAINER_URL>"));
// //start recording
RecordingStateResult result = callRecording.start(recordingOptions);
2.2. Inicie la sesión de grabación con el modo pausado habilitado mediante la API "StartAsync"
Nota:
Las grabaciones deben reanudarse para que se genere el archivo de grabación.
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. Solo para archivos sin mezclar: especifique un usuario en el canal 0
Para generar archivos de grabación de audio sin mezclar, puede usar la funcionalidad AudioChannelParticipantOrdering
para especificar el usuario que quiere grabar en el canal 0. El resto de los participantes se asignarán a un canal mientras hablan. Si usa RecordingChannel.Unmixed
pero no usa AudioChannelParticipantOrdering
, Grabación de llamadas asignará el canal 0 al primer participante que hable.
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. Solo para archivos sin mezclar: especifique la afinidad del 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);
La respuesta de la API startWithResponse
contiene el recordingId
de la sesión de grabación.
3. Detenga la sesión de grabación mediante la API "stopWithResponse"
Use el recordingId
recibido en respuesta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Pause la sesión de grabación mediante la API "pauseWithResponse"
Use el recordingId
recibido en respuesta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Reanude la sesión de grabación mediante la API "resumeWithResponse"
Use el recordingId
recibido en respuesta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. Descarga del archivo de grabación mediante la API "downloadToWithResponse"
Use un webhook Azure Event Grid u otra acción desencadenada debería utilizarse para notificar sus servicios cuando los elementos multimedia grabados ya se puedan descargar.
Se publica una notificación Microsoft.Communication.RecordingFileStatusUpdated
de Event Grid cuando una grabación está lista para recuperarla, normalmente unos minutos después de que se haya completado el proceso de grabación (por ejemplo, finalizó la reunión o se detuvo la grabación). Las notificaciones de eventos de grabación incluyen los elementos contentLocation
y metadataLocation
, que se usan para recuperar los elementos multimedia grabados y un archivo de metadatos de la grabación.
A continuación encontrará un ejemplo del 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 el método downloadToWithResponse
de la clase CallRecording
para descargar los elementos multimedia grabados. El método downloadToWithResponse
admite los siguientes parámetros:
contentLocation
: URL de Azure Communication Services donde se encuentra el contenido.destinationPath
: ubicación del archivo.parallelDownloadOptions
: un objeto ParallelDownloadOptions opcional para modificar cómo funcionará la descarga en paralelo.overwrite
: es true para sobrescribir el archivo si existe.context
: contexto que representa el contexto de solicitud.
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);
Los identificadores de documento y ubicación del contenido para los archivos de grabación se pueden recuperar de los campos contentLocation
y documentId
respectivamente, para cada recordingChunk
.
7. Elimine el contenido de grabación mediante la API "deleteWithResponse".
Use el método deleteWithResponse
de la clase CallRecording
para eliminar los elementos multimedia grabados. El método deleteWithResponse
admite los siguientes parámetros:
deleteLocation
: URL de Azure Communication Services donde se encuentra el contenido que se va a eliminar.context
: contexto que representa el contexto de solicitud.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
Se puede capturar la ubicación de eliminación de la grabación del campo deleteLocation
del evento de Event Grid.
Código de ejemplo
Puede descargar la aplicación de ejemplo de GitHub.
Requisitos previos
- Necesita una cuenta de Azure con una suscripción activa.
- Implemente un recurso de Communication Service. Registre la cadena de conexión del recurso.
- Suscríbase a eventos a través de Azure Event Grid.
- Versión 3.7 o superiores de Python.
Antes de empezar
Las API de grabación de llamadas usan exclusivamente serverCallId
para iniciar la grabación. Hay un par de métodos que puede usar para capturar serverCallId
en función de su escenario:
Escenarios de automatización de llamadas
- Al usar la automatización de llamadas, tiene dos opciones para obtener
serverCallId
:- Cuando se crea una llamada, se devuelve un
serverCallId
con el eventoCallConnected
una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas. - Una vez que responda a la llamada o se cree una llamada,
serverCallId
se devuelve como propiedad de las respuestas de APIAnswerCallResult
oCreateCallResult
respectivamente.
- Cuando se crea una llamada, se devuelve un
Escenarios del SDK de llamada
- Al usar el SDK de cliente de llamada, puede recuperar
serverCallId
mediante la variableserver_call_id
en la llamada. Use este ejemplo para aprender a obtener serverCallId desde el SDK de cliente de llamada.
Comencemos con unos sencillos pasos.
1. Creación de un cliente de automatización de llamadas
Las API de grabación de llamadas forman parte de las bibliotecas de automatización de llamadas de Azure Communication Services. Por tanto, es necesario crear un cliente de automatización de llamadas.
Para crear un cliente de automatización de llamadas, usará la cadena de conexión de Communication Services y la pasará al objeto de cliente CallAutomationClient
.
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. Inicie sesión de grabación start_recording API
Use el serverCallId
recibido durante el inicio de la llamada.
- RecordingContent se usa para pasar el tipo de contenido de grabación. Use audio.
- RecordingChannel se usa para pasar el tipo de canal de grabación. Use mezclado o sin mezclar.
- RecordingFormat se usa para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Inicie una grabación con su propio Azure Blob Storage definido para que almacene el archivo resultante una vez completada la grabación.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(server_call_id),
recording_content_type = RecordingContent.Audio,
recording_channel_type = RecordingChannel.Unmixed,
recording_format_type = RecordingFormat.Wav,
recording_state_callback_url = "<CallbackUri>",
recording_storage = AzureBlobContainerRecordingStorage(container_url="<YOUR_STORAGE_CONTAINER_URL>"))
2.2. Inicie la sesión de grabación con el modo pausado habilitado mediante la API "StartAsync"
Nota:
Las grabaciones deben reanudarse para que se genere el archivo de grabación.
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. Solo para archivos sin mezclar: especifique un usuario en el canal 0
Para generar archivos de grabación de audio sin mezclar, puede usar la funcionalidad AudioChannelParticipantOrdering
para especificar el usuario que quiere grabar en el canal 0. El resto de los participantes se asignarán a un canal mientras hablan. Si usa RecordingChannel.Unmixed
pero no usa AudioChannelParticipantOrdering
, Grabación de llamadas asignará el canal 0 al primer participante que hable.
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. Solo para archivos sin mezclar: especifique la afinidad del 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])
La respuesta de la API StartAsync
contiene el recordingId
de la sesión de grabación.
3. Detenga la sesión de grabación mediante la API "stop_recording"
Use el recording_id
recibido en respuesta a start_recording
.
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. Pause la sesión de grabación mediante la API "pause_recording"
Use el recording_id
recibido en respuesta a start_recording
.
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. Reanude la sesión de grabación mediante la API "resume_recording"
Use el recording_id
recibido en respuesta a start_recording
.
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. Descargue el archivo de grabación mediante la API "download_recording"
Use un webhook Azure Event Grid u otra acción desencadenada debería utilizarse para notificar sus servicios cuando los elementos multimedia grabados ya se puedan descargar.
Se publica una notificación Microsoft.Communication.RecordingFileStatusUpdated
de Event Grid cuando una grabación está lista para recuperarla, normalmente unos minutos después de que se haya completado el proceso de grabación (por ejemplo, finalizó la reunión o se detuvo la grabación). Las notificaciones de eventos de grabación incluyen los elementos contentLocation
y metadataLocation
, que se usan para recuperar los elementos multimedia grabados y un archivo de metadatos de la grabación.
A continuación encontrará un ejemplo del 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 la API download_recording
para descargar los elementos multimedia grabados.
response = recording_data = call_automation_client.download_recording(content_location)
with open("<file_name>", "wb") as binary_file:
binary_file.write(recording_data.read())
El elemento downloadLocation
de la grabación se puede recuperar del atributo contentLocation
de recordingChunk
. El método download_recording
descarga el contenido en bytes.
7. Elimine el contenido de grabación mediante la API "delete_recording"
Use la API delete_recording
para eliminar el contenido de grabación (por ejemplo, elementos multimedia grabados, metadatos).
response = call_automation_client.delete_recording(delete_location);
Código de ejemplo
Puede descargar la aplicación de ejemplo de GitHub.
Requisitos previos
- Necesita una cuenta de Azure con una suscripción activa.
- Implemente un recurso de Communication Service. Registre la cadena de conexión del recurso.
- Suscríbase a eventos a través de Azure Event Grid.
- Versiones de Node.js, Active LTS y Maintenance LTS (se recomiendan 8.11.1 y 10.14.1)
Antes de empezar
Las API de grabación de llamadas usan exclusivamente serverCallId
para iniciar la grabación. Hay un par de métodos que puede usar para capturar serverCallId
en función de su escenario:
Escenarios de automatización de llamadas
- Al usar la automatización de llamadas, tiene dos opciones para obtener
serverCallId
:- Cuando se crea una llamada, se devuelve un
serverCallId
con el eventoCallConnected
una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas. - Una vez que responda a la llamada o se cree una llamada,
serverCallId
se devuelve como propiedad de las respuestas de APIAnswerCallResult
oCreateCallResult
respectivamente.
- Cuando se crea una llamada, se devuelve un
Escenarios del SDK de llamada
- Al usar el SDK de cliente de llamada, puede recuperar
serverCallId
mediante el métodogetServerCallId
en la llamada. Use este ejemplo para aprender a obtener serverCallId desde el SDK de cliente de llamada.
Comencemos con unos sencillos pasos.
1. Creación de un cliente de automatización de llamadas
Las API de grabación de llamadas forman parte de las bibliotecas de automatización de llamadas de Azure Communication Services. Por tanto, es necesario crear un cliente de automatización de llamadas.
Para crear un cliente de automatización de llamadas, usará la cadena de conexión de Communication Services y la pasará al objeto de cliente CallAutomationClient
.
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. Comience a grabar la sesión con StartRecordingOptions mediante la API "StartAsync"
Use el serverCallId
recibido durante el inicio de la llamada.
- RecordingContent se usa para pasar el tipo de contenido de grabación. Use audio.
- RecordingChannel se usa para pasar el tipo de canal de grabación. Use mezclado o sin mezclar.
- RecordingFormat se usa para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Inicie una grabación con su propio Azure Blob Storage definido para que almacene el archivo resultante una vez completada la grabación.
const recordingStorageKind: RecordingStorageKind = "azureBlobStorage"
const recordingStorage: RecordingStorage = {
recordingStorageKind: recordingStorageKind,
recordingDestinationContainerUrl: "<YOUR_STORAGE_CONTAINER_URL>"
}
var options: StartRecordingOptions = {
callLocator: callLocator,
recordingContent: "audio",
recordingChannel:"unmixed",
recordingFormat: "wav",
recordingStateCallbackEndpointUrl: "<CallbackUri>",
recordingStorage: recordingStorage
};
var response = await callAutomationClient.getCallRecording().start(options);
2.2. Inicie la sesión de grabación con el modo pausado habilitado mediante la API "StartAsync"
Nota:
Las grabaciones deben reanudarse para que se genere el archivo de grabación.
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. Solo para archivos sin mezclar: especifique un usuario en el canal 0
Para generar archivos de grabación de audio sin mezclar, puede usar la funcionalidad AudioChannelParticipantOrdering
para especificar el usuario que quiere grabar en el canal 0. El resto de los participantes se asignarán a un canal mientras hablan. Si usa RecordingChannel.Unmixed
pero no usa AudioChannelParticipantOrdering
, Grabación de llamadas asignará el canal 0 al primer participante que hable.
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. Solo para archivos sin mezclar: especifique la afinidad del 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);
La respuesta de la API StartAsync
contiene el recordingId
de la sesión de grabación.
3. Detenga la sesión de grabación mediante la API "stop"
Use el recordingId
recibido en respuesta a start
.
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. Pause la sesión de grabación mediante la API "pause"
Use el recordingId
recibido en respuesta a start
.
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. Reanude la sesión de grabación mediante la API "ResumeAsync"
Use el recordingId
recibido en respuesta a start
.
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. Descarga del archivo de grabación mediante la API "DownloadToAsync"
Use un webhook Azure Event Grid u otra acción desencadenada debería utilizarse para notificar sus servicios cuando los elementos multimedia grabados ya se puedan descargar.
Se publica una notificación Microsoft.Communication.RecordingFileStatusUpdated
de Event Grid cuando una grabación está lista para recuperarla, normalmente unos minutos después de que se haya completado el proceso de grabación (por ejemplo, finalizó la reunión o se detuvo la grabación). Las notificaciones de eventos de grabación incluyen los elementos contentLocation
y metadataLocation
, que se usan para recuperar los elementos multimedia grabados y un archivo de metadatos de la grabación.
A continuación encontrará un ejemplo del 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 la API downloadToPath
para descargar los elementos multimedia grabados.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
El elemento downloadLocation
de la grabación se puede recuperar del atributo contentLocation
de recordingChunk
. El método DownloadToAsync
descarga el contenido en el nombre de archivo proporcionado.
7. Elimine el contenido de grabación mediante la API "DeleteAsync"
Use la API delete
para eliminar el contenido de grabación (por ejemplo, elementos multimedia grabados, metadatos).
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
Limpieza de recursos
Si quiere limpiar y quitar una suscripción a Communication Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él. Obtenga más información sobre la limpieza de recursos.
Pasos siguientes
Para más información, consulte los siguientes artículos.
- Descargue nuestras aplicaciones de ejemplo de grabación de llamadas de Java, Python y JavaScript.
- Más información sobre la grabación de llamadas
- Más información sobre la automatización de llamadas