This commit is contained in:
Your Name
2026-04-17 09:47:17 +08:00
parent fd44feaf09
commit 398f91bc55
280 changed files with 2536 additions and 808 deletions
+348
View File
@@ -0,0 +1,348 @@
# 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 后,录制文件将直接存储到对象存储桶,成本更低,管理更简单!