你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通话录制概述

通话记录提供一组用于开始、停止、暂停和恢复记录的 API,使你能够记录 Azure 通信服务中提供的多个通话场景。 无论是 PSTN、WebRTC 还是 SIP 通话,都可以从服务器端业务逻辑访问这些 API。 此外,告知服务器应用程序开始录制的用户操作可以触发录制。

根据你的业务需求,可以将通话记录用于不同的 Azure 通信服务通话实现。

例如,可以录制 1:1 或 1:N 音视频通话:

显示正在记录的通话的示意图。

此外,还可以使用通话记录来记录由通话自动化管理的复杂 PSTN 或 VoIP 入站和出站通话工作流。

无论如何建立通话,使用通话记录都能够生成混合或非混合媒体文件,这些文件会在内置临时存储中存储 24 小时。 可以检索文件,并将其移动到你自己的 Azure Blob 存储(自带存储)或你选择的存储解决方案。 通话录制支持所有 Azure 通信服务数据区域。

显示通话记录体系结构的示意图。

支持业务需求的通话记录

通话记录支持多种媒体输出和内容类型,以解决业务需求和用例需求。 对于保存记录、会议笔记、指导和培训,甚至合规性和遵从性等场景,可以使用混合格式。 或者,可以使用非混合音频格式来解决质量保证用例或更复杂场景的需求,例如高级分析或基于 AI(人工智能)的复杂通话后流程。

视频

渠道类型 内容格式 解决方法 采样率 比特率 数据速率 输出 说明
混合 mp4 1920x1080,16 FPS(每秒帧数) 16 kHz 1 mbps 7.5 MB/分钟* 单个文件,单个通道 默认 3x3(最活跃发言者)平铺排列的混合视频,支持显示名称

音频

渠道类型 内容格式 采样率 比特率 数据速率 输出 说明
混合 mp3 16 kHz 48 kbps 0.36 MB/分钟* 单个文件,单个通道 所有参与者的混合音频
混合 wav 16 kHz 256 kbps 1.92 MB/分钟 单个文件,单个通道 所有参与者的混合音频
unmixed wav 16 kHz 256 kbps 每通道 1.92 MB/分钟* 单个文件,最多 5 个 wav 通道 非混合音频,每个通道一个参与者,最多 5 个通道

[*NOTE] Mp3 和 Mp4 格式使用有损压缩,导致比特率可变;因此,前面的表中的数据速率值反映了理论最大值。 WAV 格式是未压缩的并且比特率是固定的,因此数据速率计算是准确的。

使用我们的通话记录 API 来完全控制录制内容

可以使用通话记录 API 通过内部业务逻辑触发器(例如创建群组通话并记录对话的应用程序)来管理记录内容。 此外,告知服务器应用程序开始录制的用户操作可以触发录制。 通话记录 API 专门使用 serverCallId 来启动记录。 若要了解如何获取 serverCallId,请查看通话记录快速入门。 当开始记录时,将返回 recordingId,然后可将其用于后续操作(如暂停和继续)。

操作 操作对象 评论
开始记录 serverCallId 返回 recordingId
获取录制状态 recordingId 返回 RecordingStateResult
暂停录制 recordingId 通过暂停和恢复通话录制,可以跳过录制通话或会议的某一部分,并继续录制到单个文件。
继续录制 recordingId 恢复暂停的录制操作。 内容与暂停前的内容包含在同一文件中。
停止录制 recordingId 停止录制,并启动最终媒体处理以便文件下载。

事件网格通知

通话记录使用 Azure 事件网格为你提供与媒体和元数据相关的通知。

注意

Azure 通信服务为录像提供短期媒体存储。 记录在 24 小时内可供下载。 24 小时后,记录不再可用。

通常在记录过程完成(例如会议结束,记录停止)后几分钟可检索记录,此时会发布事件网格通知 Microsoft.Communication.RecordingFileStatusUpdated。 录制事件通知包括 contentLocationmetadataLocation,用于检索录制的媒体和录制元数据文件。

通知架构引用

{
    "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}/recordingId/{recordingId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for retrieving from storage
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                    "metadataLocation": <string>,  // url of the metadata for this chunk
                    "contentLocation": <string>,   // url of the mp4, mp3, or wav for this chunk
                    "deleteLocation": <string>     // url of the mp4, mp3, or wav to delete this chunk
                }
            ]
        },
        "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
}

元数据架构参考

{
  "resourceId": <string>,           // stable resource id of the Azure Communication Services resource recording
  "callId": <string>,               // id of the call
  "chunkDocumentId": <string>,      // object identifier for the chunk this metadata corresponds to
  "chunkIndex": <number>,           // index of this chunk with respect to all chunks in the recording
  "chunkStartTime": <string>,       // ISO 8601 datetime for the start time of the chunk this metadata corresponds to
  "chunkDuration": <number>,        // [Chunk duration has a maximum of 4 hours] duration of the chunk this metadata corresponds to in milliseconds
  "pauseResumeIntervals": [
              "startTime": <string>,          // ISO 8601 datetime for the time at which the recording was paused
              "duration": <number>            // duration of the pause in the recording in milliseconds
                          ],
  "recordingInfo": {
               "contentType": <string>,        // content type of recording, e.g. audio/audioVideo
               "channelType": <string>,        // channel type of recording, e.g. mixed/unmixed
               "format": <string>,             // format of the recording, e.g. mp4/mp3/wav
               "audioConfiguration": {
                   "sampleRate": <number>,       // sample rate for audio recording
                   "bitRate": <number>,          // bitrate for audio recording
                   "channels": <number>          // number of audio channels in output recording
                                     },
               "videoConfiguration": {
                   "longerSideLength": <number>,        // longerSideLength for video recording
                   "shorterSideLength": <number>,       // shorterSideLength for video recording
                   "frameRate": <number>,               // frameRate for video recording
                   "bitRate": <number>                  // bitrate for video recording
                                     }
                    },
  "participants": [
    {
      "participantId": <string>,    // participant identifier of a participant captured in the recording
      "channel": <number>           // channel the participant was assigned to if the recording is unmixed
    }
  ]
}

法规和隐私问题

许多国家/地区都有适用于通话记录的法律和法规。 PSTN、语音通话和视频通话通常要求用户同意记录其通话。 您有责任依法使用通话录音功能。 您必须以遵循适用于各参与者的法律的方式,获得录制的通信内容所涉及的各方的同意。

针对个人数据维护的法规要求能够导出用户数据。 为了满足这些要求,记录元数据文件在 participants 数组中包含每个通话参与者的 participantId。 可以将 participants 数组中的 Azure 通信服务用户身份与内部用户身份进行交叉引用,以标识通话参与者。

后续步骤

下面是一些你可能感兴趣的文章: