你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
通话记录快速入门
本快速入门帮助你开始为语音和视频通话使用通话记录功能。 若要开始使用通话记录 API,必须正在进行通话。 确保熟悉通话客户端 SDK 和/或通话自动化,以构建最终用户通话体验。
代码示例
可以从 GitHub 下载示例应用
先决条件
- 需要一个具有活动订阅的 Azure 帐户。
- 部署一个通信服务资源。 记录资源连接字符串。
- 通过 Azure 事件网格订阅事件。
- 下载 .NET SDK
开始之前
通话记录 API 专门使用 serverCallId
来启动记录。 根据你的方案,可以使用多种方法提取 serverCallId
:
通话自动化方案
- 使用通话自动化时,可以采用两种做法来获取
serverCallId
:- 创建通话后,会在建立通话后将
serverCallId
作为CallConnected
事件的属性返回。 了解如何从通话自动化 SDK 获取 CallConnected 事件。 - 在应答通话或创建通话后,
serverCallId
将分别作为AnswerCallResult
或CreateCallResult
API 响应的属性返回。
- 创建通话后,会在建立通话后将
通话 SDK 方案
- 使用通话客户端 SDK 时,可以通过对通话使用
getServerCallId
方法来检索serverCallId
。 使用此示例了解如何从通话客户端 SDK 获取 serverCallId。
让我们从几个简单的步骤开始!
1. 创建通话自动化客户端
通话记录 API 是 Azure 通信服务通话自动化库的一部分。 因此,需要创建通话自动化客户端。
若要创建通话自动化客户端,需使用通信服务连接字符串并将其传递给 CallAutomationClient
对象。
CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");
2. 使用“StartAsync”API 通过 StartRecordingOptions 启动记录会话
使用在发起通话期间收到的 serverCallId
。
- RecordingContent 用于传递录制内容类型。 使用音频
- RecordingChannel 用于传递录制频道类型。 使用混合或未混合音频。
- RecordingFormat 用于传递录制格式。 使用 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. 开始录制 - 自带 Azure Blob 存储
使用自己的 Azure Blob 存储开始录制,该存储定义为在录制完成后存储录制文件。
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. 使用“StartAsync”API 启用暂停模式开始录制会话
注意
录制需要恢复才能生成录制文件。
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. 仅适用于未混合音频 - 在通道 0 上指定用户
若要生成未混合音频录制文件,可以使用 AudioChannelParticipantOrdering
功能来指定要在通道 0 上录制的用户。 其余参与者会在讲话时被分配到某个通道。 如果使用 RecordingChannel.Unmixed
而不使用 AudioChannelParticipantOrdering
,则通话记录会将通道 0 分配给通话中的首个参与者。
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。 仅适用于未混合音频 - 指定通道相关性
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
API 响应包含记录会话的 recordingId
。
3. 使用“StopAsync”API 停止录制会话
使用在 StartAsync
的响应中收到的 recordingId
。
var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);
4. 使用“PauseAsync”API 暂停录制会话
使用在 StartAsync
的响应中收到的 recordingId
。
var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);
5. 使用“ResumeAsync”API 恢复录制会话
使用在 StartAsync
的响应中收到的 recordingId
。
var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);
6. 使用“DownloadToAsync”API 下载记录文件
当记录的媒体可供下载时,请使用 Azure 事件网格 Webhook 或其他触发的操作来通知服务。
通常在录制过程完成(例如会议结束,录制停止)后几分钟可检索录像,此时会发布事件网格通知 Microsoft.Communication.RecordingFileStatusUpdated
。 录制事件通知包括 contentLocation
和 metadataLocation
,用于检索录制的媒体和录制元数据文件。
事件架构的一个示例:
{
"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
}
使用 DownloadToAsync
API 下载记录的媒体。
var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);
可以从 recordingChunk
的 contentLocation
属性提取录制内容的 downloadLocation
。 DownloadToAsync
方法将内容下载到提供的文件名中。
7. 使用“DeleteAsync”API 删除录制内容
使用 DeleteAsync
API 来删除录制内容(例如录制的媒体、元数据)
var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);
代码示例
可以从 GitHub 下载示例应用
先决条件
- 需要一个具有活动订阅的 Azure 帐户。
- 部署一个通信服务资源。 记录资源连接字符串。
- 通过 Azure 事件网格订阅事件。
- 下载 Java SDK
开始之前
通话记录 API 专门使用 serverCallId
来启动记录。 根据你的方案,可以使用多种方法提取 serverCallId
:
通话自动化方案
- 使用通话自动化时,可以采用两种做法来获取
serverCallId
:- 创建通话后,会在建立通话后将
serverCallId
作为CallConnected
事件的属性返回。 了解如何从通话自动化 SDK 获取 CallConnected 事件。 - 在应答通话或创建通话后,
serverCallId
将分别作为AnswerCallResult
或CreateCallResult
API 响应的属性返回。
- 创建通话后,会在建立通话后将
通话 SDK 方案
- 使用通话客户端 SDK 时,可以通过对通话使用
getServerCallId
方法来检索serverCallId
。 使用此示例了解如何从通话客户端 SDK 获取 serverCallId。
让我们从几个简单的步骤开始!
1. 创建通话自动化客户端
通话记录 API 是 Azure 通信服务通话自动化库的一部分。 因此,需要创建通话自动化客户端。
若要创建通话自动化客户端,需使用通信服务连接字符串并将其传递给 CallAutomationClient
对象。
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<acsConnectionString>")
.buildClient();
2. 使用“startWithResponse”API 通过 StartRecordingOptions 启动记录会话
使用在发起通话期间收到的 serverCallId
。
- RecordingContent 用于传递录制内容类型。 使用音频
- RecordingChannel 用于传递录制频道类型。 使用混合或未混合音频。
- RecordingFormat 用于传递录制格式。 使用 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. 开始录制 - 自带 Azure Blob 存储
使用自己的 Azure Blob 存储开始录制会话,该存储在录制完成后存储录制文件。
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. 使用“StartAsync”API 启用暂停模式开始录制会话
注意
录制需要恢复才能生成录制文件。
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. 仅适用于未混合音频 - 在通道 0 上指定用户
若要生成未混合音频录制文件,可以使用 AudioChannelParticipantOrdering
功能来指定要在通道 0 上录制的用户。 其余参与者会在讲话时被分配到某个通道。 如果使用 RecordingChannel.Unmixed
而不使用 AudioChannelParticipantOrdering
,则通话记录会将通道 0 分配给通话中的首个参与者。
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。 仅适用于未混合音频 - 指定通道相关性
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
API 响应包含记录会话的 recordingId
。
3. 使用“stopWithResponse”API 停止录制会话
使用在 startWithResponse
的响应中收到的 recordingId
。
Response<Void> response = callAutomationClient.getCallRecording()
.stopWithResponse(response.getValue().getRecordingId(), null);
4. 使用“pauseWithResponse”API 暂停录制会话
使用在 startWithResponse
的响应中收到的 recordingId
。
Response<Void> response = callAutomationClient.getCallRecording()
.pauseWithResponse(response.getValue().getRecordingId(), null);
5. 使用“resumeWithResponse”API 恢复录制会话
使用在 startWithResponse
的响应中收到的 recordingId
。
Response<Void> response = callAutomationClient.getCallRecording()
.resumeWithResponse(response.getValue().getRecordingId(), null);
6. 使用“downloadToWithResponse”API 下载记录文件
当记录的媒体可供下载时,请使用 Azure 事件网格 Webhook 或其他触发的操作来通知服务。
通常在录制过程完成(例如会议结束,录制停止)后几分钟可检索录像,此时会发布事件网格通知 Microsoft.Communication.RecordingFileStatusUpdated
。 录制事件通知包括 contentLocation
和 metadataLocation
,用于检索录制的媒体和录制元数据文件。
下面是事件架构的示例。
{
"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
}
使用 CallRecording
类的 downloadToWithResponse
方法下载记录的媒体。 下面是 downloadToWithResponse
方法支持的参数:
contentLocation
:Azure 通信服务内容的 URL。destinationPath
:文件位置。parallelDownloadOptions
:可选的 ParallelDownloadOptions 对象,用于修改并行下载的工作方式。overwrite
:如果为 True,则会覆盖文件(如果该文件存在)。context
:表示请求上下文的上下文。
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);
对于每个 recordingChunk
,可以分别从 contentLocation
和 documentId
字段提取记录文件的内容位置和文档 ID。
7. 使用“deleteWithResponse”API 删除录制内容。
使用 CallRecording
类的 deleteWithResponse
方法删除录制的媒体。 下面是 deleteWithResponse
方法支持的参数:
deleteLocation
:要删除的内容所在的 Azure 通信服务 URL。context
:表示请求上下文的上下文。
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);
可以从事件网格事件的 deleteLocation
字段中提取用于删除录制内容的位置。
代码示例
可以从 GitHub 下载示例应用
先决条件
- 需要一个具有活动订阅的 Azure 帐户。
- 部署一个通信服务资源。 记录资源连接字符串。
- 通过 Azure 事件网格订阅事件。
- Python 3.7+。
开始之前
通话记录 API 专门使用 serverCallId
来启动记录。 根据你的方案,可以使用多种方法提取 serverCallId
:
通话自动化方案
- 使用通话自动化时,可以采用两种做法来获取
serverCallId
:- 创建通话后,会在建立通话后将
serverCallId
作为CallConnected
事件的属性返回。 了解如何从通话自动化 SDK 获取 CallConnected 事件。 - 在应答通话或创建通话后,
serverCallId
将分别作为AnswerCallResult
或CreateCallResult
API 响应的属性返回。
- 创建通话后,会在建立通话后将
通话 SDK 方案
- 使用通话客户端 SDK 时,可以通过对通话使用
server_call_id
变量来检索serverCallId
。 使用此示例了解如何从通话客户端 SDK 获取 serverCallId。
让我们从几个简单的步骤开始!
1. 创建通话自动化客户端
通话记录 API 是 Azure 通信服务通话自动化库的一部分。 因此,需要创建通话自动化客户端。
若要创建通话自动化客户端,需使用通信服务连接字符串并将其传递给 CallAutomationClient
对象。
call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")
2. 使用“start_recording”API 开始录制会话
使用在发起通话期间收到的 serverCallId
。
- RecordingContent 用于传递录制内容类型。 使用音频
- RecordingChannel 用于传递录制频道类型。 使用混合或未混合音频。
- RecordingFormat 用于传递录制格式。 使用 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. 开始录制 - 自带 Azure Blob 存储
使用自己的 Azure Blob 存储开始录制,该存储定义为在录制完成后存储录制文件。
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. 使用“StartAsync”API 启用暂停模式开始录制会话
注意
录制需要恢复才能生成录制文件。
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. 仅适用于未混合音频 - 在通道 0 上指定用户
若要生成未混合音频录制文件,可以使用 AudioChannelParticipantOrdering
功能来指定要在通道 0 上录制的用户。 其余参与者会在讲话时被分配到某个通道。 如果使用 RecordingChannel.Unmixed
而不使用 AudioChannelParticipantOrdering
,则通话记录会将通道 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>",
audio_channel_participant_ordering=[CommunicationUserIdentifier(id="<ACS_USER_MRI>")])
2.4。 仅适用于未混合音频 - 指定通道相关性
_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
API 响应包含记录会话的 recordingId
。
3. 使用“stop_recording”API 停止录制会话
使用在 start_recording
的响应中收到的 recording_id
。
stop_recording = call_automation_client.stop_recording(recording_id = recording_id)
4. 使用“pause_recording”API 暂停录制会话
使用在 start_recording
的响应中收到的 recording_id
。
pause_recording = call_automation_client.pause_recording(recording_id = recording_id)
5. 使用“resume_recording”API 恢复录制会话
使用在 start_recording
的响应中收到的 recording_id
。
resume_recording = call_automation_client.resume_recording(recording_id = recording_id)
6. 使用“download_recording”API 下载录制文件
当记录的媒体可供下载时,请使用 Azure 事件网格 Webhook 或其他触发的操作来通知服务。
通常在录制过程完成(例如会议结束,录制停止)后几分钟可检索录像,此时会发布事件网格通知 Microsoft.Communication.RecordingFileStatusUpdated
。 录制事件通知包括 contentLocation
和 metadataLocation
,用于检索录制的媒体和录制元数据文件。
下面是事件架构的示例。
{
"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
}
使用 download_recording
API 下载记录的媒体。
response = recording_data = call_automation_client.download_recording(content_location)
with open("<file_name>", "wb") as binary_file:
binary_file.write(recording_data.read())
可以从 recordingChunk
的 contentLocation
属性提取录制内容的 downloadLocation
。 download_recording
方法可将内容下载为字节。
7. 使用“delete_recording”API 删除录制内容
使用 delete_recording
API 来删除录制内容(例如录制的媒体、元数据)
response = call_automation_client.delete_recording(delete_location);
代码示例
可以从 GitHub 下载示例应用
先决条件
- 需要一个具有活动订阅的 Azure 帐户。
- 部署一个通信服务资源。 记录资源连接字符串。
- 通过 Azure 事件网格订阅事件。
- Node.js 活动 LTS 和维护 LTS 版本(建议使用 8.11.1 和 10.14.1)
开始之前
通话记录 API 专门使用 serverCallId
来启动记录。 根据你的方案,可以使用多种方法提取 serverCallId
:
通话自动化方案
- 使用通话自动化时,可以采用两种做法来获取
serverCallId
:- 创建通话后,会在建立通话后将
serverCallId
作为CallConnected
事件的属性返回。 了解如何从通话自动化 SDK 获取 CallConnected 事件。 - 在应答通话或创建通话后,
serverCallId
将分别作为AnswerCallResult
或CreateCallResult
API 响应的属性返回。
- 创建通话后,会在建立通话后将
通话 SDK 方案
- 使用通话客户端 SDK 时,可以通过对通话使用
getServerCallId
方法来检索serverCallId
。 使用此示例了解如何从通话客户端 SDK 获取 serverCallId。
让我们从几个简单的步骤开始!
1. 创建通话自动化客户端
通话记录 API 是 Azure 通信服务通话自动化库的一部分。 因此,需要创建通话自动化客户端。
若要创建通话自动化客户端,需使用通信服务连接字符串并将其传递给 CallAutomationClient
对象。
const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");
2. 使用“StartAsync”API 通过 StartRecordingOptions 启动记录会话
使用在发起通话期间收到的 serverCallId
。
- RecordingContent 用于传递录制内容类型。 使用音频
- RecordingChannel 用于传递录制频道类型。 使用混合或未混合音频。
- RecordingFormat 用于传递录制格式。 使用 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. 开始录制 - 自带 Azure Blob 存储
使用自己的 Azure Blob 存储开始录制,该存储定义为在录制完成后存储录制文件。
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. 使用“StartAsync”API 启用暂停模式开始录制会话
注意
录制需要恢复才能生成录制文件。
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. 仅适用于未混合音频 - 在通道 0 上指定用户
若要生成未混合音频录制文件,可以使用 AudioChannelParticipantOrdering
功能来指定要在通道 0 上录制的用户。 其余参与者会在讲话时被分配到某个通道。 如果使用 RecordingChannel.Unmixed
而不使用 AudioChannelParticipantOrdering
,则通话记录会将通道 0 分配给通话中的首个参与者。
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。 仅适用于未混合音频 - 指定通道相关性
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
API 响应包含记录会话的 recordingId
。
3. 使用“stop”API 停止录制会话
使用在 start
的响应中收到的 recordingId
。
var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);
4. 使用“pause”API 暂停录制会话
使用在 start
的响应中收到的 recordingId
。
var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);
5. 使用“ResumeAsync”API 恢复录制会话
使用在 start
的响应中收到的 recordingId
。
var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);
6. 使用“DownloadToAsync”API 下载记录文件
当记录的媒体可供下载时,请使用 Azure 事件网格 Webhook 或其他触发的操作来通知服务。
通常在录制过程完成(例如会议结束,录制停止)后几分钟可检索录像,此时会发布事件网格通知 Microsoft.Communication.RecordingFileStatusUpdated
。 录制事件通知包括 contentLocation
和 metadataLocation
,用于检索录制的媒体和录制元数据文件。
下面是事件架构的示例。
{
"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
}
使用 downloadToPath
API 下载记录的媒体。
var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);
可以从 recordingChunk
的 contentLocation
属性提取录制内容的 downloadLocation
。 DownloadToAsync
方法将内容下载到提供的文件名中。
7. 使用“DeleteAsync”API 删除录制内容
使用 delete
API 来删除录制内容(例如录制的媒体、元数据)
var response = await callAutomationClient.getCallRecording().delete(deleteLocation);
清理资源
如果想要清理并删除通信服务订阅,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。 了解有关清理资源的详细信息。
后续步骤
有关详细信息,请参阅以下文章:
- 下载 Java、Python 和 JavaScript 通话录制示例应用
- 详细了解通话录制
- 详细了解通话自动化