Compartir vía


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:
    1. Cuando se crea una llamada, se devuelve un serverCallId con el evento CallConnected una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.
    2. Una vez que responda a la llamada o se cree una llamada, serverCallId se devuelve como propiedad de las respuestas de API AnswerCallResult o CreateCallResult respectivamente.

Escenarios del SDK 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:
    1. Cuando se crea una llamada, se devuelve un serverCallId con el evento CallConnected una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.
    2. Una vez que responda a la llamada o se cree una llamada, serverCallId se devuelve como propiedad de las respuestas de API AnswerCallResult o CreateCallResult respectivamente.

Escenarios del SDK 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:
    1. Cuando se crea una llamada, se devuelve un serverCallId con el evento CallConnected una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.
    2. Una vez que responda a la llamada o se cree una llamada, serverCallId se devuelve como propiedad de las respuestas de API AnswerCallResult o CreateCallResult respectivamente.

Escenarios del SDK 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:
    1. Cuando se crea una llamada, se devuelve un serverCallId con el evento CallConnected una vez establecida una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.
    2. Una vez que responda a la llamada o se cree una llamada, serverCallId se devuelve como propiedad de las respuestas de API AnswerCallResult o CreateCallResult respectivamente.

Escenarios del SDK 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.