You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:57:01