Compartir a través de


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:

  1. Cuando se establece una llamada, devuelve un serverCallId como una propiedad del evento CallConnected después de establecer una llamada. Aprenda a obtener el evento CallConnected desde el SDK de Automatización de llamadas.

  2. Cuando responde a la llamada o se crea una llamada, devuelve el serverCallId como una propiedad de las respuestas de LA API de AnswerCallResult o CreateCallResult, 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. Use AUDIO.
  • Use RecordingChannel para pasar el tipo de canal de grabación. Utilice MIXED o UNMIXED.
  • Use RecordingFormat 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

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:

  1. Una vez creada una llamada, se devuelve un serverCallId como propiedad del evento CallConnected después de establecer 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

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. Use AUDIO.
  • Use RecordingChannel para pasar el tipo de canal de grabación. Utilice MIXED o UNMIXED.
  • Use RecordingFormat 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

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 de ParallelDownloadOptions 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:
    1. Una vez creada una llamada, se devuelve un serverCallId como propiedad del evento CallConnected después de establecer 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 crea una llamada, devuelve el serverCallId como una propiedad de las respuestas de api de 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, 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. Use AUDIO.
  • Use RecordingChannel para pasar el tipo de canal de grabación. Utilice MIXED o UNMIXED.
  • Use RecordingFormat 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.

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:
    1. Una vez creada una llamada, se devuelve un serverCallId como propiedad del evento CallConnected después de establecer una llamada. Obtenga información sobre cómo Obtener un evento CallConnected desde el SDK de Automatización de llamadas.
    2. Una vez que responda a la llamada o se crea una llamada, devuelve el serverCallId como una propiedad de las respuestas de API de AnswerCallResult o CreateCallResult 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 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. Use AUDIO.
  • Use RecordingChannel para pasar el tipo de canal de grabación. Utilice MIXED o UNMIXED.
  • Use RecordingFormat 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

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: