Udostępnij za pośrednictwem


Szybkie wprowadzenie: rejestrowanie połączeń

W tym artykule opisano nagrywanie połączeń głosowych i wideo. Aby rozpocząć korzystanie z interfejsów API nagrywania połączeń, musisz mieć połączenie. Aby zbudować doświadczenie połączeń dla użytkownika końcowego, upewnij się, że znasz zestaw SDK klienta wywołującego i Automatyzacja połączeń.

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.
  • Pobierz .NET SDK

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie serverCallId do inicjowania nagrywania. 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 funkcji automatyzacji połączeń masz dwie opcje, aby uzyskać serverCallId:

  1. Gdy ustanowisz połączenie, zwraca serverCallId jako właściwość zdarzenia CallConnected po nawiązaniu połączenia. Dowiedz się, jak uzyskać zdarzenie CallConnected z zestawu SDK Call Automation.

  2. Po odebraniu połączenia lub utworzeniu połączenia odpowiednia właściwość serverCallId jest zwracana jako część odpowiedzi API interfejsu AnswerCallResult lub CreateCallResult.

Scenariusze użycia zestawu SDK

W przypadku korzystania z SDK klienta dzwoniącego można pobrać serverCallId przy użyciu metody getServerCallId dla połączenia. Skorzystaj z tego przykładu, aby dowiedzieć się, jak pobrać serverCallId z SDK klienta wywołującego.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

API nagrywania połączeń 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 AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj MIXED lub UNMIXED.
  • Użyj RecordingFormat, aby przekazać format 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 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>"))
};
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 w momencie, gdy zaczynają 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);

Odpowiedź interfejsu API StartAsync zawiera recordingId dotyczące sesji nagrywania.

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

Użyj elementu recordingId, który otrzymano w odpowiedzi na StartAsync.

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

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

Użyj recordingId odebranego w odpowiedzi na StartAsync.

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

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

Użyj odebranego recordingId w odpowiedzi na StartAsync.

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

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

Użyj webhook Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić usługi, gdy zarejestrowane pliki multimedialne 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 materiały.

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

Pobierz element downloadLocation dotyczący nagrania z atrybutu contentLocation obiektu recordingChunk. Użyj metody DownloadToAsync , 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.
  • Pobierz Java SDK

Przed rozpoczęciem

Interfejsy API rejestrowania wywołań używają wyłącznie elementu serverCallId do inicjowania nagrywania. 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 wywołania, element serverCallId jest zwracany jako właściwość zdarzenia CallConnected, po ustanowieniu połączenia. 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 użycia zestawu SDK

W przypadku używania Calling Client SDK można pobrać serverCallId za pomocą metody getServerCallId w wywołaniu.

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

API rejestrowania wywołań są częścią bibliotek 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 MIXED lub UNMIXED.
  • Użyj RecordingFormat polecenia , aby przekazać format nagrania. Użyj 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>"));
 
       // //start recording
       RecordingStateResult result = callRecording.start(recordingOptions);

2.2. Rozpocznij sesję nagrywania, używając StartAsync API, z włączonym trybem wstrzymania.

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 w miarę jak 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 recordingId otrzymanego 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 recordingId otrzymanego 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 recordingId, które otrzymano 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 webhooku usługi Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić swoje usługi, gdy zapisany materiał jest gotowy 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 metody downloadToWithResponse klasy CallRecording, aby pobrać nagrany materiał. 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 do modyfikacji działania pobierania równoległego.
  • overwrite: Wartość "prawda" powoduje zastąpienie pliku, 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ć z pól contentLocation i documentId odpowiednio dla każdego elementu recordingChunk.

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. Zapisz ciąg połączenia zasobu.
  • Subskrybowanie zdarzeń za pośrednictwem usługi Azure Event Grid.
  • Python 3.7+.

Przed rozpoczęciem

API rejestrowania połączeń używają wyłącznie serverCallId do inicjowania nagrywania. 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 połączeń masz dwie opcje, aby uzyskać serverCallId:
    1. Po utworzeniu wywołania, serverCallId jest zwracane jako właściwość zdarzenia CallConnected, po nawiązaniu połączenia. Dowiedz się, jak uzyskać zdarzenie CallConnected z zestawu Call Automation SDK.
    2. Gdy odpowiesz na połączenie lub zostanie utworzone połączenie, zwraca serverCallId jako właściwość w odpowiedziach API AnswerCallResult lub CreateCallResult.

Scenariusze wywoływania zestawu SDK

  • Podczas korzystania z SDK klientów połączeń możesz pobrać serverCallId przy użyciu zmiennej server_call_id w połączeniu. Skorzystaj z tego przykładu, aby dowiedzieć się, jak uzyskać serverCallId w SDK klienta wywołującego.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API nagrywania 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 za pomocą interfejsu start_recording API

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

  • Użyj RecordingContent polecenia , aby przekazać typ zawartości nagrania. Użyj AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj polecenia MIXED lub UNMIXED.
  • Użyj polecenia RecordingFormat, aby przekazać format 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 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 recording_id, które otrzymano 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 recording_id otrzymanego 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 recording_id, który został odebrany 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 webhooka Azure Event Grid lub innej wyzwolonej akcji, aby powiadomić swoje usługi, gdy nagrania multimedialne 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). Powiadomienia o zdarzeniach rejestrowania obejmują contentLocation i metadataLocation, 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 download_recording API, aby pobrać nagrany materiał.

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 uzyskać z atrybutu contentLocation elementu recordingChunk. Użyj metody download_recording, 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 nagrania, 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. Zapisz connection string 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 serverCallId do inicjowania nagrywania. Istnieje kilka metod, których można użyć do pobrania serverCallId w zależności od scenariusza:

Scenariusze automatyzacji wywołań

  • Podczas korzystania z Call Automation, masz dwie opcje uzyskania serverCallId:
    1. Po utworzeniu wywołania, element serverCallId jest zwracany jako właściwość CallConnected zdarzenia po nawiązaniu połączenia. Dowiedz się, jak pobrać zdarzenie CallConnected z zestawu SDK usługi Call Automation.
    2. Po odebraniu połączenia lub jego utworzeniu, zwraca serverCallId jako właściwość odpowiedzi interfejsu API AnswerCallResult lub CreateCallResult, odpowiednio.

Scenariusze użycia zestawu SDK

Korzystając z SDK klienta do wykonywania połączeń, możesz pobrać serverCallId przy użyciu metody getServerCallId na wywołaniu.

Skorzystaj z tego przykładu, aby dowiedzieć się, jak przy pomocy Calling Client SDK uzyskać identyfikator serverCallId.

Zacznijmy od kilku prostych kroków.

1. Tworzenie klienta usługi Call Automation

Interfejsy API do nagrywania rozmów 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 AUDIO.
  • Użyj RecordingChannel polecenia , aby przekazać typ kanału nagrywania. Użyj MIXED lub UNMIXED.
  • Użyj RecordingFormat, aby przekazać format 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. Rozpocznij nagrywanie — Skorzystaj z własnego 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 zawartość sesji nagrywania.

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

Użyj odebranego recordingId w odpowiedzi na start.

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

4. Wstrzymaj sesję nagrywania używając API 'pause'

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 odebranego recordingId w odpowiedzi na start.

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

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

Użyj webhooka z usługi Azure Event Grid lub innego wyzwolonego działania, aby powiadomić swoje usługi, gdy zarejestrowane media będą 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 contentLocation i metadataLocation, które są używane do pobierania zarówno zarejestrowanego nośnika, jak i pliku metadanych rejestrowania.

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 downloadToPath API, aby pobrać nagrane materiały.

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

Element downloadLocation dla nagrania można pobrać z contentLocation atrybutu recordingChunk. Użyj metody DownloadToAsync, 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 nagrania (na przykład nagranego materiału, 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: