Udostępnij za pośrednictwem


Szybki start: rejestrowanie wywołań

W tym artykule opisano nagrywanie połączeń głosowych i wideo. Aby rozpocząć korzystanie z interfejsów API nagrywania połączeń, musisz mieć wywołanie. Aby utworzyć środowisko wywoływania przez użytkownika końcowego, upewnij się, że znasz zestaw SDK klienta wywołującego i automatyzację wywołań.

Przykładowy kod

Przykładową aplikację można pobrać z usługi GitHub

Wymagania wstępne

  • Potrzebujesz konta platformy Azure z aktywną subskrypcją.
  • Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
  • Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
  • Pobieranie zestawu .NET SDK

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId. Istnieje kilka metod, których można użyć do pobrania serverCallId w zależności od scenariusza:

Scenariusze automatyzacji wywołań

W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId:

  1. Po ustanowieniu wywołania zwraca serverCallId on właściwość jako właściwość CallConnected zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK.

  2. Po odebraniu wywołania lub wywołaniu jest zwracana serverCallId odpowiednio właściwość jako odpowiedź interfejsu AnswerCallResult API lub CreateCallResult .

Scenariusze wywoływania zestawu SDK

W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId metodę getServerCallId przy użyciu metody wywołania . Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . Dlatego należy utworzyć klienta usługi Call Automation.

Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient obiektu.

CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");

2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu API "StartAsync"

Użyj odebranego serverCallId podczas inicjowania połączenia.

  • Użyj RecordingContent polecenia , aby przekazać typ zawartości nagrania. Użyj witryny AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj polecenia MIXED lub UNMIXED.
  • Użyj RecordingFormat polecenia , aby przekazać format nagrania. Użyj witryny 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. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store

Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.

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. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"

Uwaga

Nagrania należy wznowić w celu wygenerowania pliku nagrywania.

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. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0

Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.

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 Tylko dla opcji Unmixed — Określ koligację kanału

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);

StartAsync Odpowiedź interfejsu API zawiera recordingId sesję nagrywania.

3. Zatrzymaj sesję nagrywania przy użyciu StopAsync interfejsu API

Użyj odebranych recordingId w odpowiedzi na StartAsync.

var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);

4. Wstrzymaj sesję nagrywania przy użyciu PauseAsync interfejsu API

Użyj odebranych recordingId w odpowiedzi na StartAsync.

var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);

5. Wznów sesję nagrywania przy użyciu ResumeAsync interfejsu API

Użyj odebranych recordingId w odpowiedzi na StartAsync.

var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);

6. Pobieranie pliku nagrywania przy użyciu interfejsu DownloadToAsync API

Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.

Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu przetwarzania nagrania (np. po zakończeniu spotkania lub zatrzymaniu nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocationmetadataLocation, których można użyć do pobrania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Przykład schematu zdarzeń:

{
    "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
}

Użyj interfejsu DownloadToAsync API, aby pobrać nagrane nośniki.

var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);

Pobierz element downloadLocation dla nagrania z contentLocation atrybutu recordingChunk. DownloadToAsync Użyj metody , aby pobrać zawartość do podanej nazwy pliku.

7. Usuwanie zawartości nagrywania przy użyciu DeleteAsync interfejsu API

Użyj DeleteAsync interfejsu API, aby usunąć zawartość nagrywania (np. zarejestrowane nośniki i metadane).

var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);

Przykładowy kod

Przykładową aplikację można pobrać z usługi GitHub

Wymagania wstępne

  • Potrzebujesz konta platformy Azure z aktywną subskrypcją.
  • Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
  • Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
  • Pobieranie zestawu Java SDK

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId . Istnieje kilka metod, których można użyć do pobrania serverCallId w zależności od scenariusza:

Scenariusze automatyzacji wywołań

W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId:

  1. Po utworzeniu serverCallId wywołania element jest zwracany jako właściwość CallConnected zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK.

  2. Po udzieleniu odpowiedzi na wywołanie lub wywołaniu serverCallId element jest zwracany odpowiednio jako właściwość odpowiedzi interfejsu AnswerCallResult API lub CreateCallResult .

Scenariusze wywoływania zestawu SDK

W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId metodę getServerCallId przy użyciu metody wywołania .

Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . Dlatego należy utworzyć klienta usługi Call Automation.

Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient obiektu.

CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
            .connectionString("<acsConnectionString>")
            .buildClient();

2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu startWithResponse API

Użyj odebranego serverCallId podczas inicjowania połączenia.

  • Użyj RecordingContent polecenia , aby przekazać typ zawartości nagrania. Użyj witryny AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj polecenia MIXED lub UNMIXED.
  • Użyj RecordingFormat polecenia , aby przekazać format nagrania. Użyj witryny 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. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store

Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.

        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. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu StartAsync interfejsu API

Uwaga

Nagrania należy wznowić, aby można było wygenerować plik nagrywania.

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. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0

Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.

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 Tylko dla opcji Unmixed — Określ koligację kanału

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);

startWithResponse Odpowiedź interfejsu API zawiera recordingId sesję nagrywania.

3. Zatrzymaj sesję nagrywania przy użyciu stopWithResponse interfejsu API

Użyj odebranych recordingId w odpowiedzi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
               .stopWithResponse(response.getValue().getRecordingId(), null);

4. Wstrzymaj sesję nagrywania przy użyciu pauseWithResponse interfejsu API

Użyj odebranych recordingId w odpowiedzi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
              .pauseWithResponse(response.getValue().getRecordingId(), null);

5. Wznów sesję nagrywania przy użyciu resumeWithResponse interfejsu API

Użyj odebranych recordingId w odpowiedzi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
               .resumeWithResponse(response.getValue().getRecordingId(), null);

6. Pobieranie pliku nagrywania przy użyciu interfejsu downloadToWithResponse API

Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.

Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (np. zakończenie spotkania lub zatrzymanie nagrywania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocationmetadataLocation, których można użyć do pobrania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniższy kod jest przykładem schematu zdarzeń.

{
    "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
}

Użyj downloadToWithResponse metody CallRecording klasy, aby pobrać nagrane nośniki. Poniżej przedstawiono obsługiwane parametry dla downloadToWithResponse metody:

  • contentLocation: adres URL usług Azure Communication Services, pod którym znajduje się zawartość.
  • destinationPath : Lokalizacja pliku.
  • parallelDownloadOptions: opcjonalny ParallelDownloadOptions obiekt modyfikując sposób działania pobierania równoległego.
  • overwrite: prawda, aby zastąpić plik, jeśli istnieje.
  • context: Kontekst reprezentujący kontekst żądania.
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);

Lokalizację zawartości i identyfikatory dokumentów dla plików nagrywania można pobrać odpowiednio z contentLocation pól i documentId dla każdego recordingChunkelementu .

7. Usuwanie zawartości nagrywania przy użyciu deleteWithResponse interfejsu API

Użyj deleteWithResponse metody CallRecording klasy, aby usunąć zarejestrowane nośniki. Obsługiwane parametry dla deleteWithResponse metody:

  • deleteLocation: adres URL usług Azure Communication Services, pod którym znajduje się zawartość do usunięcia.
  • context: Kontekst reprezentujący kontekst żądania.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

Lokalizację usuwania nagrania można pobrać z deleteLocation pola zdarzenia usługi Event Grid.

Przykładowy kod

Przykładową aplikację można pobrać z usługi GitHub

Wymagania wstępne

  • Potrzebujesz konta platformy Azure z aktywną subskrypcją.
  • Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
  • Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
  • Python 3.7+.

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId. Istnieje kilka metod, których można użyć do pobrania serverCallId w zależności od scenariusza:

Scenariusze automatyzacji wywołań

  • W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId:
    1. Po utworzeniu serverCallId wywołania element jest zwracany jako właściwość CallConnected zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Call Automation SDK.
    2. Po udzieleniu odpowiedzi na wywołanie lub wywołaniu zwraca serverCallId ona odpowiednio właściwość jako właściwość odpowiedzi interfejsu AnswerCallResult API lub CreateCallResult .

Scenariusze wywoływania zestawu SDK

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . W związku z tym należy utworzyć klienta usługi Call Automation.

Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient obiektu.

call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")

2. Rozpocznij sesję nagrywania start_recording interfejsu API

Użyj odebranego serverCallId podczas inicjowania połączenia.

  • Użyj RecordingContent polecenia , aby przekazać typ zawartości nagrania. Użyj witryny AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj polecenia MIXED lub UNMIXED.
  • Użyj RecordingFormat polecenia , aby przekazać format nagrania. Użyj witryny 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. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store

Rozpocznij nagrywanie przy użyciu własnej usługi Azure Blob Storage zdefiniowanej w celu przechowywania pliku nagrywania po zakończeniu nagrywania.

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. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"

Uwaga

Nagrania należy wznowić w celu wygenerowania pliku nagrywania.

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. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0

Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.

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 Tylko dla opcji Unmixed — Określ koligację kanału

_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])

StartAsync Odpowiedź interfejsu API zawiera recordingId sesję nagrywania.

3. Zatrzymaj sesję nagrywania przy użyciu interfejsu API "stop_recording"

Użyj odebranych recording_id w odpowiedzi na start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

4. Wstrzymywanie sesji nagrywania przy użyciu interfejsu API "pause_recording"

Użyj odebranych recording_id w odpowiedzi na start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

5. Wznów sesję nagrywania przy użyciu interfejsu API "resume_recording"

Użyj odebranych recording_id w odpowiedzi na start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Pobieranie pliku nagrywania przy użyciu interfejsu API "download_recording"

Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.

Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (na przykład zakończenie spotkania lub zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocationmetadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniższy kod jest przykładem schematu zdarzeń.

{
    "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
}

Użyj interfejsu download_recording API, aby pobrać nagrane nośniki.

response = recording_data = call_automation_client.download_recording(content_location)

with open("<file_name>", "wb") as binary_file:
    binary_file.write(recording_data.read())

Element downloadLocation dla nagrania można pobrać z contentLocation atrybutu recordingChunk. download_recording Użyj metody , aby pobrać zawartość do bajtów.

7. Usuwanie zawartości nagrywania przy użyciu interfejsu API "delete_recording"

Użyj delete_recording interfejsu API do usuwania zawartości nagrywania, takiej jak zarejestrowane nośniki i metadane.

response = call_automation_client.delete_recording(delete_location);

Przykładowy kod

Przykładową aplikację można pobrać z usługi GitHub

Wymagania wstępne

  • Potrzebujesz konta platformy Azure z aktywną subskrypcją.
  • Wdróż zasób usługi komunikacji. Zarejestruj parametry połączenia zasobu.
  • Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
  • Node.js wersji Active LTS i Maintenance LTS (zalecane wersje 8.11.1 i 10.14.1)

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie elementu do inicjowania nagrywania serverCallId. Istnieje kilka metod, których można użyć do pobrania serverCallId w zależności od scenariusza:

Scenariusze automatyzacji wywołań

  • W przypadku korzystania z automatyzacji wywołań dostępne są dwie opcje pobierania elementu serverCallId:
    1. Po utworzeniu serverCallId wywołania element jest zwracany jako właściwość CallConnected zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu Sdk usługi Call Automation.
    2. Po udzieleniu odpowiedzi na wywołanie lub wywołaniu zwraca serverCallId ona odpowiednio właściwość jako właściwość odpowiedzi interfejsu AnswerCallResult API lub CreateCallResult .

Scenariusze wywoływania zestawu SDK

W przypadku używania zestawu SDK klienta wywołującego można pobrać serverCallId metodę getServerCallId przy użyciu metody wywołania .

Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać identyfikator serverCallId z zestawu SDK wywołującego klienta.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API rejestrowania wywołań są częścią bibliotek usługi Azure Communication Services Call Automation . W związku z tym należy utworzyć klienta usługi Call Automation.

Aby utworzyć klienta automatyzacji wywołań, użyj parametry połączenia usług komunikacyjnych i przekaż go do CallAutomationClient obiektu.

const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");

2. Rozpocznij sesję nagrywania za pomocą polecenia StartRecordingOptions przy użyciu interfejsu API "StartAsync"

Użyj odebranego serverCallId podczas inicjowania połączenia.

  • Użyj RecordingContent polecenia , aby przekazać typ zawartości nagrania. Użyj witryny AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj polecenia MIXED lub UNMIXED.
  • Użyj RecordingFormat polecenia , aby przekazać format nagrania. Użyj witryny 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. Rozpoczynanie nagrywania — Bring Your Own Azure Blob Store

Rozpocznij nagrywanie przy użyciu wyznaczonej usługi Azure Blob Storage w celu przechowywania zarejestrowanego pliku po zakończeniu nagrywania.

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. Rozpocznij sesję nagrywania z włączonym trybem wstrzymania przy użyciu interfejsu API "StartAsync"

Uwaga

Nagrania należy wznowić w celu wygenerowania pliku nagrywania.

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. Tylko w przypadku opcji Unmixed — określ użytkownika w kanale 0

Aby utworzyć niemieszone pliki nagrywania dźwięku, możesz użyć AudioChannelParticipantOrdering funkcji , aby określić, który użytkownik ma być nagrywany w kanale 0. Reszta uczestników jest przypisywana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , funkcja Call Recording przypisuje kanał 0 do pierwszego uczestnika mówiącego.

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 Tylko dla opcji Unmixed — Określ koligację kanału

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);

StartAsync Odpowiedź interfejsu API zawiera recordingId sesję nagrywania.

3. Zatrzymaj sesję nagrywania przy użyciu interfejsu API "stop"

Użyj odebranych recordingId w odpowiedzi na start.

var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);

4. Wstrzymaj sesję nagrywania przy użyciu interfejsu API wstrzymania

Użyj odebranych recordingId w odpowiedzi na start.

var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);

5. Wznów sesję nagrywania przy użyciu interfejsu API "ResumeAsync"

Użyj odebranych recordingId w odpowiedzi na start.

var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);

6. Pobieranie pliku nagrywania przy użyciu interfejsu API "DownloadToAsync"

Użyj elementu webhook usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane nośniki są gotowe do pobrania.

Powiadomienie Microsoft.Communication.RecordingFileStatusUpdated usługi Event Grid jest publikowane, gdy nagranie jest gotowe do pobrania, zazwyczaj kilka minut po zakończeniu procesu nagrywania (na przykład zakończenie spotkania lub zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocationmetadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniższy kod jest przykładem schematu zdarzeń.

{
    "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
}

Użyj interfejsu downloadToPath API, aby pobrać nagrane nośniki.

var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);

Element downloadLocation dla nagrania można pobrać z contentLocation atrybutu recordingChunk. DownloadToAsync Użyj metody , aby pobrać zawartość do podanej nazwy pliku.

7. Usuwanie zawartości nagrywania przy użyciu interfejsu API "DeleteAsync"

Użyj delete interfejsu API do usuwania zawartości nagrywania (na przykład zarejestrowanego nośnika, metadanych)

var response = await callAutomationClient.getCallRecording().delete(deleteLocation);

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Komunikacyjnych, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Dowiedz się więcej o czyszczeniu zasobów.

Następne kroki

Aby uzyskać więcej informacji, zobacz następujące artykuły: