Udostępnij za pośrednictwem


Przewodnik Szybki start dotyczący nagrywania połączeń

Ten przewodnik Szybki start ułatwia rozpoczęcie pracy z rejestrowaniem połączeń głosowych i wideo. Aby rozpocząć korzystanie z interfejsów API nagrywania połączeń, musisz mieć wywołanie. Upewnij się, że znasz wywoływanie zestawu SDK klienta i/lub Wywołanie automatyzacji w celu utworzenia środowiska wywoływania przez użytkownika końcowego.

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 utworzeniu serverCallId wywołania element jest zwracany jako właściwość CallConnected zdarzenia po nawiązaniu wywołania. Dowiedz się, jak pobrać połączenie Połączenie ed zdarzenie 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

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ń, należy użyć usług komunikacyjnych parametry połączenia i przekazać 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.

  • Funkcja RecordingContent służy do przekazywania typu zawartości nagrywania. Używanie dźwięku
  • Funkcja RecordingChannel służy do przekazywania typu kanału nagrywania. Użyj mieszanych lub nie mieszanych.
  • Format RecordingFormat służy do przekazywania formatu nagrania. Użyj 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 własnej usługi Azure Blob Storage zdefiniowanej w celu przechowywania pliku nagrywania 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>"))
};
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 interfejsu API "StopAsync"

Użyj odebranego recordingId elementu w odpowiedzi na .StartAsync

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

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

Użyj odebranego recordingId elementu w odpowiedzi na .StartAsync

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

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

Użyj odebranego recordingId elementu w odpowiedzi na .StartAsync

var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(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, zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation metadataLocation, które są używane do pobierania 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 DownloadToAsync interfejsu API do pobierania zarejestrowanych multimediów.

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

Element downloadLocation dla nagrania można pobrać z contentLocation atrybutu recordingChunk. DownloadToAsync metoda pobiera zawartość do podanej nazwy pliku.

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

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

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ć połączenie Połączenie ed zdarzenie 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

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żyjesz usługi Communication Services parametry połączenia i przekażesz go do CallAutomationClient obiektu.

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

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

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

  • Funkcja RecordingContent służy do przekazywania typu zawartości nagrywania. Używanie dźwięku
  • Funkcja RecordingChannel służy do przekazywania typu kanału nagrywania. Użyj MIXED lub UNMIXED.
  • Format RecordingFormat służy do przekazywania formatu nagrania. Użyj programu 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 sesję nagrywania z własną usługą Azure Blob Storage, aby zapisać plik nagrywania 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>"));
 
       // //start recording
       RecordingStateResult result = callRecording.start(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>"))
                    .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 zostanie przypisana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , nagranie połączenia przypisze 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 interfejsu API "stopWithResponse"

Użyj odebranego recordingId elementu w odpowiedzi na .startWithResponse

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

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

Użyj odebranego recordingId elementu w odpowiedzi na .startWithResponse

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

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

Użyj odebranego recordingId elementu w odpowiedzi na .startWithResponse

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

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

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, zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation metadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniżej przedstawiono 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 downloadToWithResponse metody CallRecording klasy do pobierania zarejestrowanych multimediów. 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 obiekt ParallelDownloadOptions, aby zmodyfikować 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. Usuń zawartość nagrywania przy użyciu interfejsu API "deleteWithResponse".

Użyj deleteWithResponse metody CallRecording klasy do usuwania nagranego nośnika. Poniżej przedstawiono 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ć połączenie Połączenie ed zdarzenie 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

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żyjesz usługi Communication Services parametry połączenia i przekażesz 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.

  • Funkcja RecordingContent służy do przekazywania typu zawartości nagrywania. Używanie dźwięku
  • Funkcja RecordingChannel służy do przekazywania typu kanału nagrywania. Użyj mieszanych lub nie mieszanych.
  • Format RecordingFormat służy do przekazywania formatu nagrania. Użyj 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 zostanie przypisana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , nagranie połączenia przypisze 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 odebranego recording_id elementu 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 odebranego recording_id elementu 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 odebranego recording_id elementu 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, zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation metadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniżej przedstawiono 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 download_recording interfejsu API do pobierania zarejestrowanych multimediów.

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 metoda pobiera 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 (na przykład zarejestrowanego nośnika, metadanych)

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ć połączenie Połączenie ed zdarzenie 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

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żyjesz usługi Communication Services parametry połączenia i przekażesz 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.

  • Funkcja RecordingContent służy do przekazywania typu zawartości nagrywania. Używanie dźwięku
  • Funkcja RecordingChannel służy do przekazywania typu kanału nagrywania. Użyj mieszanych lub nie mieszanych.
  • Format RecordingFormat służy do przekazywania formatu nagrania. Użyj 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 własnej usługi Azure Blob Storage zdefiniowanej w celu przechowywania pliku nagrywania 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 zostanie przypisana do kanału, gdy mówią. Jeśli używasz funkcji RecordingChannel.Unmixed , ale nie używasz AudioChannelParticipantOrderingfunkcji , nagranie połączenia przypisze 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 odebranego recordingId elementu w odpowiedzi na .start

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

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

Użyj odebranego recordingId elementu w odpowiedzi na .start

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

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

Użyj odebranego recordingId elementu 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, zatrzymanie nagrania). Rejestrowanie powiadomień o zdarzeniach obejmuje i contentLocation metadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych nagrywania.

Poniżej przedstawiono 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 downloadToPath interfejsu API do pobierania zarejestrowanych multimediów.

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

Element downloadLocation dla nagrania można pobrać z contentLocation atrybutu recordingChunk. DownloadToAsync metoda pobierz 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: