Inicio rápido de grabación de llamadas
En este artículo se describe la grabación de llamadas para llamadas de voz y videollamadas. Para empezar a usar las API de grabación de llamadas, debe tener una llamada en curso. Para crear la experiencia de llamada del usuario final, asegúrese de que está familiarizado con SDK de cliente de llamadas y Automatización de llamadas.
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 establece una llamada, devuelve un
serverCallId
como una propiedad del eventoCallConnected
después de establecer una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.Cuando responde a la llamada o se crea una llamada, devuelve el
serverCallId
como una propiedad de las respuestas de LA API deAnswerCallResult
oCreateCallResult
, respectivamente.
Escenarios del SDK de llamada
Al usar el SDK de cliente de llamada, puede recuperar serverCallId
mediante el método getServerCallId
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 lo tanto, debe crear un cliente de Automatización de llamadas.
Para crear un cliente de automatización de llamadas, use la cadena de conexión de Communication Services y pásela al objeto 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.
- Use
RecordingContent
para pasar el tipo de contenido de grabación. UseAUDIO
. - Use
RecordingChannel
para pasar el tipo de canal de grabación. UtiliceMIXED
oUNMIXED
. - Use
RecordingFormat
para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Empiece a grabar con Azure Blob Storage designado para almacenar el archivo grabado 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>"))
ExternalStorage = new BlobStorage(new Uri("<Insert Container / Blob Uri>"))
};
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. Detener la sesión de grabación mediante StopAsync
API
Use el recordingId
recibido en respuesta a StartAsync
.
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. Pausar la sesión de grabación mediante PauseAsync
API
Use el recordingId
recibido en respuesta a StartAsync
.
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. Reanudación de la sesión de grabación mediante ResumeAsync
API
Use el recordingId
recibido en respuesta a StartAsync
.
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. Descarga del archivo de grabación mediante DownloadToAsync
API
Use una Azure Event Grid webhook u otra acción desencadenada para notificar a los servicios cuando el medio grabado esté listo para su descarga.
Una notificación de Event Grid Microsoft.Communication.RecordingFileStatusUpdated
se publica cuando una grabación está lista para su recuperación, normalmente unos minutos después de que la grabación termine de procesarse (por ejemplo, cuando finaliza la reunión o se detiene una grabación). Las notificaciones de eventos de grabación incluyen contentLocation
y metadataLocation
, que puede usar para recuperar medios grabados y un archivo de metadatos de 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 DownloadToAsync
API para descargar los medios grabados.
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
Capture el downloadLocation
de la grabación del atributo contentLocation
del recordingChunk
. Use el método DownloadToAsync
para descargar el contenido en un nombre de archivo proporcionado.
7. Eliminación del contenido de grabación mediante DeleteAsync
API
Use DeleteAsync
API para eliminar el contenido de la grabación (como medios grabados y 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 comenzar
Las API de grabación de llamadas usan exclusivamente el 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
:
Una vez creada una llamada, se devuelve un
serverCallId
como propiedad del eventoCallConnected
después de establecer 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.
Escenarios del SDK de llamada
Al usar el SDK de cliente de llamada, puede recuperar serverCallId
mediante el método getServerCallId
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 lo tanto, debe crear un cliente de Automatización de llamadas.
Para crear un cliente de automatización de llamadas, use la cadena de conexión de Communication Services y pásela al objeto CallAutomationClient
.
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. Iniciar sesión de grabación con StartRecordingOptions mediante startWithResponse
API
Use el serverCallId
recibido durante el inicio de la llamada.
- Use
RecordingContent
para pasar el tipo de contenido de grabación. UseAUDIO
. - Use
RecordingChannel
para pasar el tipo de canal de grabación. UtiliceMIXED
oUNMIXED
. - Use
RecordingFormat
para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Empiece a grabar con Azure Blob Storage designado para almacenar el archivo grabado 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>"))
.setExternalStorage(new BlobStorage("<Insert Container / Blob Uri>"));
// //start recording
RecordingStateResult result = callRecording.start(recordingOptions);
2.2. Inicio de la sesión de grabación con el modo pausado habilitado mediante StartAsync
API
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. Detener la sesión de grabación mediante stopWithResponse
API
Use el recordingId
recibido en respuesta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. Pausar la sesión de grabación mediante pauseWithResponse
API
Use el recordingId
recibido en respuesta a startWithResponse
.
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. Reanudación de la sesión de grabación mediante resumeWithResponse
API
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 downloadToWithResponse
API
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.
Una notificación de Event Grid Microsoft.Communication.RecordingFileStatusUpdated
se publica cuando una grabación está lista para su recuperación, normalmente unos minutos después de que se complete el proceso de grabación (como finales de reunión o paradas de grabación). Las notificaciones de eventos de grabación incluyen contentLocation
y metadataLocation
, que puede usar para recuperar medios grabados y un archivo de metadatos de grabación.
El código siguiente es 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 downloadToWithResponse
método de CallRecording
clase para descargar el medio grabado. 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 deParallelDownloadOptions
opcional para modificar cómo funciona 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. Eliminación del contenido de grabación mediante deleteWithResponse
API
Use deleteWithResponse
método de CallRecording
clase para eliminar los medios grabados. Parámetros admitidos para deleteWithResponse
método:
-
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
:- Una vez creada una llamada, se devuelve un
serverCallId
como propiedad del eventoCallConnected
después de establecer 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 crea una llamada, devuelve el
serverCallId
como una propiedad de las respuestas de api deAnswerCallResult
oCreateCallResult
respectivamente.
- Una vez creada 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, use la cadena de conexión de Communication Services y pásela al objeto 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.
- Use
RecordingContent
para pasar el tipo de contenido de grabación. UseAUDIO
. - Use
RecordingChannel
para pasar el tipo de canal de grabación. UtiliceMIXED
oUNMIXED
. - Use
RecordingFormat
para pasar el formato de la grabación. 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 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.
Una notificación de Event Grid Microsoft.Communication.RecordingFileStatusUpdated
se publica cuando una grabación está lista para su recuperación, normalmente unos minutos después de que se complete el proceso de grabación (como la reunión finalizada o la grabación detenida). 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.
El código siguiente es 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 download_recording
API para descargar los medios 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
. Use el método download_recording
para descargar el contenido en bytes.
7. Elimine el contenido de grabación mediante la API "delete_recording"
Use delete_recording
API para eliminar el contenido de grabación, como medios grabados y 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
:- Una vez creada una llamada, se devuelve un
serverCallId
como propiedad del eventoCallConnected
después de establecer una llamada. Obtenga información sobre cómo Obtener un evento CallConnected desde el SDK de Automatización de llamadas. - Una vez que responda a la llamada o se crea una llamada, devuelve el
serverCallId
como una propiedad de las respuestas de API deAnswerCallResult
oCreateCallResult
respectivamente.
- Una vez creada una llamada, se devuelve un
Escenarios del SDK de llamada
Al usar el SDK de cliente de llamada, puede recuperar serverCallId
mediante el método getServerCallId
en la llamada.
Use este ejemplo para obtener información sobre cómo Obtener un 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, use la cadena de conexión de Communication Services y pásela al objeto 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.
- Use
RecordingContent
para pasar el tipo de contenido de grabación. UseAUDIO
. - Use
RecordingChannel
para pasar el tipo de canal de grabación. UtiliceMIXED
oUNMIXED
. - Use
RecordingFormat
para pasar el formato de la grabación. 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 grabación: Traiga su propio Azure Blob Storage
Empiece a grabar con Azure Blob Storage designado para almacenar el archivo grabado 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.
Una notificación de Event Grid Microsoft.Communication.RecordingFileStatusUpdated
se publica cuando una grabación está lista para su recuperación, normalmente unos minutos después de que se complete el proceso de grabación (como la reunión finalizada o la grabación detenida). 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.
El código siguiente es 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 downloadToPath
API para descargar los medios grabados.
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
El elemento downloadLocation
de la grabación se puede recuperar del atributo contentLocation
de recordingChunk
. Use el método DownloadToAsync
para descargar el contenido en un 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
Vea los siguientes artículos para más información:
- Descargue nuestra Java, Pythony JavaScript aplicaciones de ejemplo de grabación de llamadas.
- Más información sobre la grabación de llamadas.
- Más información sobre la automatización de llamadas.