无需亚马逊S3、GCP或Azure,使用LiveKit Egress实现通话录制的技术方案问询
嘿,这个问题我太熟了!完全不用依赖三大云存储,不管是本地硬盘还是自托管的存储方案都能搞定LiveKit的通话录制,给你拆解两个实用方案,附代码和配置细节,保证你能快速上手。
方案一:本地文件系统存储(适合测试/小团队场景)
如果你只是做测试或者团队规模小,直接把录制文件存在服务器本地是最省事的,核心就是让LiveKit Egress服务能读写宿主机的目录。
步骤1:配置Egress服务
首先准备一个egress-config.yaml配置文件,指定本地存储路径:
api_key: 你的LiveKit API密钥 api_secret: 你的LiveKit API秘钥 ws_url: ws://你的LiveKit服务器地址:7880 storage: type: local local: directory: /recordings # 容器内的路径,后面要挂载到宿主机
然后用Docker启动Egress服务,记得把宿主机的目录挂载到容器里:
docker run -d \ --name livekit-egress \ --network host \ -v /宿主机的录制存储目录:/recordings \ -e LIVEKIT_EGRESS_CONFIG="$(cat egress-config.yaml)" \ livekit/egress:latest
注意:要确保宿主机目录的权限足够,Egress容器的用户能读写这个目录,不然会出现写入失败的情况。
步骤2:发起通话录制请求
用Curl或者LiveKit的SDK发起录制请求,指定存储类型为local:
curl -X POST "http://你的LiveKit服务器地址:7880/egress/start-room-recording" \ -H "Authorization: Bearer $(echo -n "你的API密钥:你的API秘钥" | base64)" \ -H "Content-Type: application/json" \ -d '{ "room_name": "你要录制的房间名", "output": { "file": { "filename": "room-recording-$(date +%Y%m%d%H%M%S).mp4", "storage": { "type": "local" } } } }'
执行完这个请求,等录制结束后,就能在你宿主机挂载的目录里找到录制好的MP4文件了。
方案二:自托管兼容S3的存储(MinIO,生产环境首选)
如果需要更稳定、可扩展的存储,推荐用MinIO——这是一个开源的兼容S3 API的对象存储,完全自托管,不需要依赖任何云厂商,配置和S3几乎一样,但控制权全在你手里。
步骤1:部署MinIO
先启动MinIO服务,用Docker最方便,记得挂载持久化存储目录:
docker run -d \ --name minio \ -p 9000:9000 \ -p 9001:9001 \ -v /宿主机的MinIO存储目录:/data \ minio/minio server /data --console-address ":9001"
启动后,你可以通过http://你的MinIO服务器地址:9001访问控制台,默认账号密码是minioadmin/minioadmin,记得改成安全的账号密码。
步骤2:配置Egress对接MinIO
修改egress-config.yaml,把存储类型改成s3,但endpoint指向你的MinIO地址:
api_key: 你的LiveKit API密钥 api_secret: 你的LiveKit API秘钥 ws_url: ws://你的LiveKit服务器地址:7880 storage: type: s3 s3: access_key: minioadmin # MinIO的账号 secret: minioadmin # MinIO的密码 endpoint: http://你的MinIO服务器地址:9000 bucket: livekit-recordings # 提前在MinIO控制台创建好这个桶 region: us-east-1 # MinIO不强制要求,随便填一个就行
然后重启Egress服务,让配置生效。
步骤3:发起录制请求
和本地存储的请求类似,只是存储类型不需要特别指定(因为Egress已经默认用MinIO了),或者也可以在请求里明确指定:
curl -X POST "http://你的LiveKit服务器地址:7880/egress/start-room-recording" \ -H "Authorization: Bearer $(echo -n "你的API密钥:你的API秘钥" | base64)" \ -H "Content-Type: application/json" \ -d '{ "room_name": "你要录制的房间名", "output": { "file": { "filename": "room-recording-$(date +%Y%m%d%H%M%S).mp4" } } }'
录制完成后,你可以在MinIO的控制台里找到对应的录制文件,也可以用MinIO的CLI工具mc来管理文件。
完整配置&测试流程
- 确保LiveKit Server已经正常运行,能创建房间和进行通话。
- 按照上面的方案配置Egress服务和存储后端。
- 创建一个测试房间,发起通话。
- 用Curl或者SDK发起录制请求,查看Egress的日志确认录制正常启动。
- 结束通话后,检查存储后端是否生成了录制文件。
注意事项
- 本地存储的局限性:如果是多节点的LiveKit集群,本地存储只能存在单个节点上,不适合分布式场景;另外要定期清理旧的录制文件,避免磁盘占满。
- MinIO的优化:生产环境要配置MinIO的集群模式,保证高可用;还要设置桶的生命周期规则,自动清理过期的录制文件。
- Egress版本匹配:要确保LiveKit Server和Egress服务的版本一致,不然可能出现API不兼容的问题。
备注:内容来源于stack exchange,提问作者Suyash Konduskar

