资讯详情

资讯详情

星逐赛事APP开发实录:直播间推拉流与实时交互系统架构方案

今年体育直播赛道持续火热世界杯、五大联赛流量巨大。我们投入三个月时间从零开发了星逐赛事APP目前已上架苹果商店源码覆盖H5和APP双端。下面重点谈直播间推拉流和实时交互系统的技术实现方案。一、直播推拉流整体架构直播功能是体育赛事APP的核心技术链路涉及推流端、服务端、播放端三个环节。推流端主播通过OBS或手机App推流使用RTMP协议将视频流发送到流媒体服务器。推流地址格式为rtmp://domain/live/{streamKey}streamKey由后端动态生成每次推流不同防止盗推。流媒体服务端采用ZLMediaKit作为流媒体服务器负责接收RTMP推流、实时转码、HLS切片分发。ZLMediaKit是国产开源流媒体方案性能优秀文档友好非常适合国内直播项目。播放端用户通过HLS协议从CDN拉流观看。HLS兼容性最好几乎所有浏览器和播放器都支持延迟控制在3-5秒。二、推流端技术实现2.1 推流地址生成与鉴权推流地址由后端动态生成确保每次推流唯一性javapublic String generateStreamKey(Long userId) { String streamKey UUID.randomUUID().toString().replace(-, ); redisTemplate.opsForValue().set(stream: streamKey, userId, 24, TimeUnit.HOURS); return streamKey; }推流地址rtmp://domain/live/{streamKey}推流时流媒体服务器回调后端接口校验streamKey合法性同时校验用户是否有推流权限。验证不通过则拒绝推流有效防止盗推。2.2 推流端编码配置编码标准H.264是主流选择兼容性最好。推流码率建议2000-4000Kbps分辨率720P或1080P帧率30fps。关键帧策略GOPGroup of Pictures大小设2-4秒平衡首屏加载速度和编码效率。推流协议RTMP是推流端最常用的协议延迟低、兼容性好。同时也支持SRT协议作为备选在弱网环境下自动切换以保证推流稳定。三、服务端流媒体处理3.1 ZLMediaKit核心配置流媒体服务器的关键配置项ini[rtmp] port1935 [hls] segDuration4 # 切片时长4秒 segNum3 # 缓存数量3个 hlsPath/var/www/hls/ [hook] on_publishhttp://backend/api/callback/publish on_unpublishhttp://backend/api/callback/unpublish on_record_mp4http://backend/api/callback/record切片时长是影响延迟的关键参数。4秒切片延迟控制在3-5秒平衡了实时性和兼容性。3.2 多清晰度转码为适应不同网络环境服务端对源流进行实时转码输出多档清晰度清晰度分辨率码率适用场景原画源分辨率源码率高端设备1080P1920×10802-4Mbps主流手机720P1280×7201.5-2Mbps中端设备480P854×480800Kbps弱网环境转码是计算密集型任务通过GPU加速可大幅提升转码效率。四、播放端实现4.1 H5播放器基于hls.js封装播放器支持HLS协议播放javascriptimport Hls from hls.js; export class LivePlayer { constructor(videoElement) { this.video videoElement; this.hls new Hls({ enableWorker: true, lowLatencyMode: true, fragLoadingTimeOut: 10000 }); this.hls.attachMedia(this.video); } load(url) { this.hls.loadSource(url); this.hls.on(Hls.Events.MANIFEST_PARSED, () { this.video.play(); }); } destroy() { this.hls.destroy(); } }4.2 Android端播放器使用ExoPlayer官方播放器框架支持HLS、DASH等多种协议javaprivate void initPlayer() { player new ExoPlayer.Builder(context) .setMediaSourceFactory(new HlsMediaSource.Factory(dataSourceFactory)) .build(); playerView.setPlayer(player); } private void loadStream(String url) { HlsMediaSource hlsSource new HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(true) .createMediaSource(MediaItem.fromUri(url)); player.setMediaSource(hlsSource); player.prepare(); player.setPlayWhenReady(true); }4.3 iOS端播放器使用AVPlayer系统原生播放框架objectivec- (void)initPlayer { AVPlayerItem *item [AVPlayerItem playerItemWithURL:[NSURL URLWithString:self.streamURL]]; self.player [AVPlayer playerWithPlayerItem:item]; self.playerLayer [AVPlayerLayer playerLayerWithPlayer:self.player]; self.playerLayer.frame self.videoView.bounds; [self.videoView.layer addSublayer:self.playerLayer]; [self.player play]; }五、实时交互系统5.1 WebSocket连接管理弹幕、在线人数、礼物等实时互动功能基于WebSocket实现javaComponent ServerEndpoint(/ws/live/{roomId}) public class LiveWebSocket { private static final MapString, SetSession roomSessions new ConcurrentHashMap(); OnOpen public void onOpen(Session session, PathParam(roomId) String roomId) { roomSessions.computeIfAbsent(roomId, k - ConcurrentHashMap.newKeySet()).add(session); } OnMessage public void onMessage(String message, PathParam(roomId) String roomId) { // 广播给同房间所有用户 broadcast(roomId, message); } }5.2 分布式跨节点广播分布式部署时用户连接分散在不同服务器。通过Redis Pub/Sub实现跨节点消息广播任一节点收到消息后发布到Redis频道所有订阅了该频道的节点收到消息各节点推送给连接到本机的用户5.3 弹幕限流按用户IP和userId双维度限流每秒消息数超过阈值返回429javaprivate boolean checkRateLimit(Long userId, String roomId) { String key rate:danmaku: userId : roomId : LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyyMMddHHmmss)); Long count redisTemplate.opsForValue().increment(key); if (count 1) { redisTemplate.expire(key, 1, TimeUnit.SECONDS); } return count 3; // 每秒最多3条 }六、多线路CDN容灾为保证直播流高可用配置多条CDN线路线路提供商角色主线路阿里云默认分发备线路1腾讯云主线路故障时切换备线路2网宿极端情况备用播放器每5秒检测当前线路加载速度加载时间超过3秒触发自动切换。切换过程无缝衔接用户无感知。七、踩坑记录与解决方案坑1HLS延迟过高默认10秒切片导致延迟10-15秒。解决方案切片时长从10秒调到4秒播放器buffer从6秒降到2秒延迟降至3-5秒。坑2WebSocket跨节点推送单机正常部署多台服务器后消息无法跨节点推送。解决方案Redis Pub/Sub做消息广播。坑3推流防盗链推流地址固定导致被盗推。解决方案streamKey动态生成流媒体服务器回调后端验证token合法性。八、总结星逐赛事APP的直播系统基于以下技术方案实现推流端RTMP协议 动态streamKey鉴权 H.264编码服务端ZLMediaKit流媒体服务器 HLS切片分发 多清晰度转码播放端HLS协议 hls.js(H5)/ExoPlayer(Android)/AVPlayer(iOS)实时交互WebSocket长连接 Redis Pub/Sub跨节点广播分发加速多线路CDN容灾 智能调度
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →