Angular Web应用如何集成MS Teams通话录制功能?
Azure Communication Services + Angular 集成 Teams 通话录制解决方案
前置依赖确认
你需要先确认已经完成以下配置,否则录制功能无法正常触发:
- 你的Azure Communication Services(以下简称ACS)资源已经和目标Teams租户完成互操作授权,租户管理员已经同意了你申请的
Calls.AccessMedia.All、TeamsRecording.ReadWrite.All等应用级权限 - ACS资源已经升级到支持Teams互操作的付费层级,免费层级不支持通话录制功能
- 你已经在ACS侧配置了Event Grid事件订阅,用于接收通话状态、录制状态的实时回调
核心实现步骤
1. 后端服务实现录制控制逻辑
注意:录制启停、权限校验的逻辑必须放在后端实现,禁止在前端直接存储Azure密钥或调用Graph/ACS管理API,避免权限泄露
- 通话建立成功后,后端先获取当前通话的唯一
callId,如果是ACS与Teams互通的通话,需要将ACS侧的通话ID和Teams侧的通话ID做映射存储 - 提供录制启停接口给前端调用,接口内部调用Graph API的通话录制接口完成操作,成功后返回对应的
recordingId - 监听Event Grid推送的录制状态事件,将
录制启动中、录制中、录制完成、存储完成等状态同步到前端,同时在录制完成后将录制文件的存储路径(你可以配置存在Azure Blob或者Teams关联的SharePoint/OneDrive)存入你的业务数据库
2. Angular 前端实现
前端只负责和用户交互,不需要处理复杂的录制逻辑:
- 页面上增加录制启停按钮、录制状态展示组件
- 调用你自己的后端接口触发录制启停,不要直接调用Azure的官方API
- 通过WebSocket/SignalR监听后端推送的录制状态变更,实时更新UI,录制完成后给用户提供录制文件的查看/下载入口
代码示例
Angular 前端录制服务示例
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { SignalRService } from './signalr.service'; // 你自己实现的实时通讯服务 @Injectable({ providedIn: 'root' }) export class TeamsRecordingService { constructor(private http: HttpClient, private signalRService: SignalRService) {} // 触发开始录制 startRecording(callId: string) { return this.http.post<{ recordingId: string }>('/api/acs/recording/start', { callId }); } // 触发结束录制 stopRecording(recordingId: string) { return this.http.post('/api/acs/recording/stop', { recordingId }); } // 订阅录制状态变更 getRecordingStateObservable() { return this.signalRService.onEvent<{ state: string, recordingId: string }>('recordingStateChanged'); } }
后端录制启停逻辑示例(以C#为例)
// 初始化带应用权限的Graph客户端 var scopes = new[] { "https://graph.microsoft.com/.default" }; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(credential, scopes); // 开始录制逻辑 var startRecordingBody = new StartRecordingPostRequestBody { RecordingStateCallbackUri = new Uri("你的Event Grid回调地址") }; var recordingOperation = await graphClient.Communications.Calls[callId].Recordings.Start.PostAsync(startRecordingBody); return recordingOperation.Id; // 返回生成的recordingId
合规注意事项
- 所有录制操作必须提前获得所有通话参与方的明确同意,部分国家/地区有明确的法律法规要求必须告知参与方通话正在被录制,违反可能会产生合规风险
- 录制文件的存储、访问、删除需要符合你所在行业的数据安全合规要求,比如GDPR、等保2.0等
内容的提问来源于stack exchange,提问作者user16991217
相关产品推荐
相关产品推荐

