# TRTC 录制存储迁移:VOD → COS ## 变更说明 将 TRTC 云端录制的存储方式从**腾讯云点播(VOD)**改为**对象存储(COS)**。 ## 修改内容 ### File: `server/app/common/service/TrtcCloudRecordingService.php` #### 1. 存储配置变更 **Before (VOD):** ```php $tencentVod = new \TencentCloud\Trtc\V20190722\Models\TencentVod(); $tencentVod->ExpireTime = 0; $tencentVod->MediaType = 0; $tencentVod->UserDefineRecordId = $prefix; $tencentVod->SubAppId = $vodSubApp; $cloudVod = new \TencentCloud\Trtc\V20190722\Models\CloudVod(); $cloudVod->TencentVod = $tencentVod; $storage = new \TencentCloud\Trtc\V20190722\Models\StorageParams(); $storage->CloudVod = $cloudVod; ``` **After (COS):** ```php $cloudStorage = new \TencentCloud\Trtc\V20190722\Models\CloudStorage(); $cloudStorage->Vendor = 0; // 0=腾讯云 $cloudStorage->Region = 'ap-guangzhou'; $cloudStorage->Bucket = 'your-bucket-name'; $cloudStorage->Prefix = 'trtc-recording/'; $storage = new \TencentCloud\Trtc\V20190722\Models\StorageParams(); $storage->CloudStorage = $cloudStorage; ``` #### 2. 更新日志信息 - 日志中标注存储类型为 COS - 记录 bucket、region、prefix 等信息 - 更新提示信息 #### 3. 更新路径清理函数 - 允许路径中包含 `/` 字符(COS 路径分隔符) - 从 `sanitizeVodUserDefineRecordId` 改为支持 COS 路径格式 ## 配置要求 ### 必需配置项 在 `config/trtc.php` 或 `.env` 中添加以下配置: ```php // config/trtc.php return [ // ... 其他配置 ... // COS 存储配置 'recording_cos_vendor' => 0, // 0=腾讯云 'recording_cos_region' => env('TRTC_RECORDING_COS_REGION', 'ap-guangzhou'), 'recording_cos_bucket' => env('TRTC_RECORDING_COS_BUCKET', ''), 'recording_cos_prefix' => env('TRTC_RECORDING_COS_PREFIX', 'trtc-recording/'), ]; ``` ### .env 配置示例 ```env # TRTC 录制 COS 存储配置 TRTC_RECORDING_COS_REGION=ap-guangzhou TRTC_RECORDING_COS_BUCKET=your-bucket-1234567890 TRTC_RECORDING_COS_PREFIX=trtc-recording/ ``` ## COS Bucket 准备 ### 1. 创建 COS 存储桶 1. 登录 [腾讯云 COS 控制台](https://console.cloud.tencent.com/cos) 2. 创建存储桶 - 名称:例如 `trtc-recording-1234567890` - 地域:选择与 TRTC 应用相同或就近的地域 - 访问权限:私有读写(推荐) ### 2. 配置 CORS(如需前端访问) 如果需要前端直接访问录制文件,配置 CORS 规则: ```json { "CORSRules": [ { "AllowedOrigins": ["*"], "AllowedMethods": ["GET", "HEAD"], "AllowedHeaders": ["*"], "ExposeHeaders": [], "MaxAgeSeconds": 3600 } ] } ``` ### 3. 配置生命周期(可选) 设置自动删除过期录制文件: - 规则名称:`auto-delete-old-recordings` - 应用范围:前缀 `trtc-recording/` - 删除策略:创建后 30 天删除 ## 存储路径结构 ### 默认路径格式 ``` bucket-name/ └── trtc-recording/ ├── room_123_20240101_120000.mp4 ├── room_456_20240101_130000.mp4 └── ... ``` ### 自定义前缀路径 如果传入 `$vodUserDefineRecordId` 参数: ``` bucket-name/ └── custom-prefix/ ├── file1.mp4 ├── file2.mp4 └── ... ``` ## 文件命名规则 COS 存储的文件名由 TRTC 自动生成,通常包含: - 房间号 - 时间戳 - 用户 ID(单流录制) - 文件格式(.mp4) 示例: ``` trtc-recording/sdkappid_roomid_userid_timestamp.mp4 ``` ## 权限配置 ### TRTC 服务需要的 COS 权限 确保 TRTC 服务有权限写入 COS: 1. **方式一:使用主账号密钥**(不推荐生产环境) - 使用主账号的 SecretId 和 SecretKey 2. **方式二:使用子账号密钥**(推荐) - 创建子账号 - 授予 COS 写入权限策略: ```json { "version": "2.0", "statement": [ { "effect": "allow", "action": [ "cos:PutObject", "cos:PostObject", "cos:InitiateMultipartUpload", "cos:UploadPart", "cos:CompleteMultipartUpload" ], "resource": [ "qcs::cos:ap-guangzhou:uid/1234567890:your-bucket-1234567890/*" ] } ] } ``` 3. **方式三:使用服务角色**(最佳实践) - 为 TRTC 服务创建角色 - 授予角色 COS 写入权限 - TRTC 自动使用角色权限 ## 对比:VOD vs COS | 特性 | VOD(点播) | COS(对象存储) | |------|------------|----------------| | **存储成本** | 较高 | 较低 | | **功能** | 媒体处理、转码、播放 | 纯存储 | | **访问方式** | 点播 API/播放器 | HTTP/HTTPS 直接访问 | | **适用场景** | 需要转码、加密、播放统计 | 简单存储和下载 | | **计费** | 存储+流量+转码 | 存储+流量 | | **管理** | 媒资管理系统 | 文件管理 | ## 迁移步骤 ### 1. 准备 COS 存储桶 按照上述"COS Bucket 准备"步骤创建并配置存储桶 ### 2. 更新配置文件 在 `.env` 中添加 COS 配置项 ### 3. 部署代码 部署更新后的 `TrtcCloudRecordingService.php` ### 4. 测试录制 1. 发起一次测试录制 2. 检查 COS 控制台是否有文件上传 3. 验证文件可以正常下载和播放 ### 5. 监控日志 查看日志确认录制状态: ``` CreateCloudRecording mix (COS) DescribeCloudRecording(合流校验-COS) ``` ## 获取录制文件 ### 方式一:COS 控制台 1. 登录 COS 控制台 2. 进入对应存储桶 3. 浏览 `trtc-recording/` 目录 4. 下载或获取文件 URL ### 方式二:COS SDK ```php use Qcloud\Cos\Client; $cosClient = new Client([ 'region' => 'ap-guangzhou', 'credentials' => [ 'secretId' => 'your-secret-id', 'secretKey' => 'your-secret-key', ], ]); // 列出录制文件 $result = $cosClient->listObjects([ 'Bucket' => 'your-bucket-1234567890', 'Prefix' => 'trtc-recording/', ]); foreach ($result['Contents'] as $file) { echo $file['Key'] . "\n"; } ``` ### 方式三:生成临时访问 URL ```php $url = $cosClient->getObjectUrl( 'your-bucket-1234567890', 'trtc-recording/file.mp4', '+10 minutes' // URL 有效期 ); ``` ## 回调通知 ### COS 事件通知 可以配置 COS 事件通知,在文件上传完成时触发回调: 1. 在 COS 控制台配置事件通知 2. 选择事件类型:`cos:ObjectCreated:*` 3. 配置回调 URL 4. 接收通知并处理 ### 回调数据示例 ```json { "Records": [ { "event": { "eventName": "cos:ObjectCreated:Put", "eventTime": "2024-01-01T12:00:00Z" }, "cos": { "cosObject": { "key": "trtc-recording/room_123_20240101_120000.mp4", "size": 12345678, "url": "https://bucket.cos.ap-guangzhou.myqcloud.com/..." } } } ] } ``` ## 故障排查 ### 问题1:录制文件未上传到 COS **检查项:** - COS Bucket 名称是否正确 - Region 是否匹配 - TRTC 服务是否有 COS 写入权限 - 查看日志中的错误信息 ### 问题2:无法访问录制文件 **检查项:** - Bucket 访问权限设置 - 文件路径是否正确 - 是否需要签名 URL ### 问题3:录制状态一直是 Idle **检查项:** - RoomIdType 是否与客户端一致 - 房间内是否有用户推流 - 网络连接是否正常 ## 成本估算 ### COS 存储成本(以广州地域为例) **存储费用:** - 标准存储:0.118 元/GB/月 - 低频存储:0.08 元/GB/月 **流量费用:** - 外网下行流量:0.5 元/GB - CDN 回源流量:0.15 元/GB **示例计算:** - 每天录制 10 小时,每小时 500MB - 月存储量:10 × 30 × 0.5 = 150GB - 月存储费用:150 × 0.118 = 17.7 元 - 月流量(假设下载 50GB):50 × 0.5 = 25 元 - **月总费用:约 42.7 元** ## 相关文档 - [TRTC 云端录制](https://cloud.tencent.com/document/product/647/16823) - [COS 对象存储](https://cloud.tencent.com/document/product/436) - [COS PHP SDK](https://cloud.tencent.com/document/product/436/12266) ## 总结 ✅ 存储方式从 VOD 改为 COS ✅ 降低存储成本 ✅ 简化文件管理 ✅ 支持自定义路径前缀 ✅ 更新日志和提示信息 ✅ 需要配置 COS Bucket 和权限 迁移到 COS 后,录制文件将直接存储到对象存储桶,成本更低,管理更简单!