更新
This commit is contained in:
@@ -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 后,录制文件将直接存储到对象存储桶,成本更低,管理更简单!
|
||||
Reference in New Issue
Block a user