直播系统推拉流原理概述
直播系统的核心功能是实现主播端视频采集后的实时传输,以及观众端的实时观看。整个过程主要包含:推流、服务器处理、拉流三个环节。
直播系统架构
核心概念解析
1. 推流(Push)
推流是指主播端将视频数据传输到服务器的过程。主要使用
RTMP 协议(Real Time Messaging Protocol)。
比如可能有如下推流 URL 的生成逻辑:
12345678910111213public static String generatePushUrl(String pushDomain, String pushKey, String appName, String streamName, long expireTime) { String pushUrl = ""; // 推流域名未开启鉴权功能的情况下 if (StringUtils.isBlank(pushKey)) { pushUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName; } else { long timeStamp = System.currentTimeMillis() / 1000L + expireTime; String stringToMd5 = "/" + appName + "/" + streamName + "-" + Long.toString(timeStamp) + "-0-0-" + pushKey; String authKey = md5(stringToMd5); pushUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName + "?auth_key=" + Long.toString(timeStamp) + "-0-0-" + authKey; } return pushUrl;}
推流地址的组成部分: - rtmp:// - 协议 - pushDomain - 推流域名 -
appName - 应用名称 - streamName - 流名称 - auth_key -
鉴权参数(可选)
2. 拉流(Pull)
拉流是观众观看直播的过程。支持多种协议: - RTMP:延迟低(1-3秒) -
HTTP-FLV:延迟适中(2-5秒) - HLS(m3u8):延迟较高(5-30秒)
123456789101112131415// FLV 格式public static String generalPullUrlFlv(String pullDomain, String pullKey, String appName, String streamName, long expireTime) { if (StringUtils.isBlank(pullKey)) { return "http://" + pullDomain + "/" + appName + "/" + streamName + ".flv"; } // ... 鉴权逻辑}// HLS 格式public static String generalPullUrlHls(String pullDomain, String pullKey, String appName, String streamName, long expireTime) { if (StringUtils.isBlank(pullKey)) { return "http://" + pullDomain + "/" + appName + "/" + streamName + ".m3u8"; } // ... 鉴权逻辑}
直播流程
主播开播:
系统生成唯一的 streamId
生成带鉴权的推流地址
主播端推流软件(如 OBS)开始推流
服务器处理:
流媒体服务器接收推流
进行转码、录制等处理
将流分发到 CDN 节点
观众观看:
获取对应格式的拉流地址
通过播放器拉取直播流
实现实时观看
实现建议
选择合适的流媒体服务器:
商业云服务:阿里云直播、腾讯云直播
开源方案:SRS、Nginx-RTMP
根据业务场景选择协议:
普通直播:HTTP-FLV
低延迟场景:RTMP
移动端兼容性要求高:HLS
关注关键指标:
延迟控制
卡顿率
首屏时间
带宽成本
安全鉴权:
防盗链机制
许可协议
本文采用 署名-非商业性使用-相同方式共享
4.0 国际 许可协议,转载请注明出处。
分享文章