当前位置: 首页 > news >正文

构建直播平台大体的流程

✅ 直播流程完整链路(基于 SRS + OBS + 前后端)


🧍‍♂️ 用户操作流程:

  1. 用户登录系统(前端)

    • 系统中校验用户身份(JWT 等)

    • 后端可能校验权限,比如“是否有开播资格”

  2. 用户点击“我要开播”

    • 前端调用后端接口,例如:POST /api/live/apply

    • 后端生成并返回推流地址 + 推流码(Key)

      • 示例返回:

        { "livePushUrl": "rtmp://your-srs-ip/live/room123", "livePushSecret": "abc123" // 有些平台把推流码单独拆开 }

  3. 前端展示推流地址 + 推流码

    • 前端展示给用户复制:

      推流地址: rtmp://your-srs-ip/live 推流码(StreamName): room123?token=abc123

  4. 用户打开 OBS

    • 进入设置 > 推流

      • 服务:自定义

      • 推流地址:rtmp://your-srs-ip/live

      • 串流密钥(推流码):room123?token=abc123

    • 开始推流


📡 技术流程图(你可以参考这个思维路径):

[用户点击我要开播]↓
[前端调用后端接口生成推流地址]↓
[后端生成 RTMP 地址和推流密钥]↓
[前端展示推流地址+密钥]↓
[用户复制地址/密钥到 OBS 开始推流]↓
[OBS 推流至 SRS 流媒体服务器]↓
[SRS 接收 RTMP 流并转为 FLV/HLS 等格式]↓
[用户/观众端 前端播放器(flv.js)拉取播放地址,播放视频流]

🎬 观众端播放流程:

  1. 前端页面通过 flv.jsvideo.js 拉取播放地址,比如:

    http://your-srs-ip/live/room123.flv

  2. 播放器组件 flv.js 将流绑定在 <video> 标签上

  3. 用户看到直播画面


🧠 小贴士(进阶要点)

环节补充说明
推流地址一般是 rtmp://ip/live/房间号,后面可附加签名参数防盗链
推流码(stream key)可作为 URL 的查询参数,便于权限控制
播放地址一般用 .flv.m3u8,给前端播放器使用
OBS只要填写好推流地址和 key,就能推流成功
SRS可配置是否开启 flv/hls/webrtc 输出,是否验证签名等

前端组件页面

<template><div class="live-play-wrapper"><div class="player-header"><h2>直播播放</h2><p v-if="!url" class="error-text">⚠️ 当前无有效直播地址</p></div><div class="player-container" v-if="url"><videoref="videoElement"id="videoElement"controlsautoplaymutedwidth="100%"height="100%"class="video-player"></video></div><div v-else class="no-url-placeholder"><p>请等待推流或联系管理员开启直播</p></div></div>
</template><script>
import flvjs from "flv.js";export default {name: "LivePlay",props: {url: {type: String,required: false,default: "",},},data() {return {flvPlayer: null,};},watch: {url(newUrl) {console.log("播放地址变化:", newUrl);this.destroyPlayer();if (newUrl) {this.initPlayer(newUrl);}},},mounted() {if (this.url) {this.initPlayer(this.url);}},beforeDestroy() {this.destroyPlayer();},methods: {initPlayer(playUrl) {if (flvjs.isSupported()) {const video = this.$refs.videoElement;this.flvPlayer = flvjs.createPlayer({type: "flv",url: playUrl,isLive: true,});this.flvPlayer.attachMediaElement(video);this.flvPlayer.load();this.flvPlayer.play().catch((err) => {console.error("播放失败", err);});// 监听播放错误this.flvPlayer.on(flvjs.Events.ERROR, (errType, errDetail) => {console.error("FLV 播放出错", errType, errDetail);// 可选:自动重连// setTimeout(() => this.initPlayer(playUrl), 3000);});} else {console.warn("浏览器不支持 flv.js 播放");}},destroyPlayer() {if (this.flvPlayer) {this.flvPlayer.destroy();this.flvPlayer = null;}},},
};
</script><style scoped>
.live-play-wrapper {width: 100%;max-width: 960px;margin: 0 auto;padding: 20px;
}
.player-header {text-align: center;margin-bottom: 15px;
}
.error-text {color: red;font-weight: bold;
}
.player-container {border: 2px solid #ccc;border-radius: 10px;overflow: hidden;background: #000;height: 540px;
}
.video-player {width: 100%;height: 100%;background-color: #000;
}
.no-url-placeholder {text-align: center;font-size: 16px;color: #999;margin-top: 30px;
}
</style>

使用组件标签

<LivePlay :url="'http://your-srs-server/live/room123.flv'" />

http://www.lryc.cn/news/592378.html

相关文章:

  • Netty封装Websocket并实现动态路由
  • 在git中同时配置gitcode和github访问权限
  • 微信小程序 wx.request() 的封装
  • 【图像处理基石】什么是CCM?
  • 解决 Selenium 页面跳转过快导致的内容获取问题:从原理到实践
  • 填坑 | React Context原理
  • 29、鸿蒙Harmony Next开发:深浅色适配和应用主题换肤
  • 私有服务器AI智能体搭建配置选择记录
  • 苍穹外卖项目日记(day12)
  • 再探Java多线程Ⅱ --- (创建方式+等待唤醒+Lock锁)
  • 【论文蒸馏】Recent Advances in Speech Language Models: A Survey
  • 《设计模式之禅》笔记摘录 - 8.命令模式
  • 企业如何让内部视频仅限公司官网或指定域名播放?
  • 2025年SEVC SCI2区,利用增强粒子群算法(MR-MPSO)优化MapReduce效率和降低复杂性,深度解析+性能实测
  • 某邮生活旋转验证码逆向
  • 5W8-3D牢游戏超级大集合[2012年6月] 地址 + 解压密码
  • Python绘制数据(二)
  • C语言实战:超级玛丽游戏
  • 工业数据集成中间件工具OPC Router详细介绍
  • 大模型格式
  • sky-take-out项目Mybatis的使用
  • AE电源MDX 5K 10K 15K 20K 25K 30K手侧操作使用说明
  • 【Linux】环境基础与开发工具的使用
  • 数据结构--JDK17新增语法和顺序表
  • blender如何队列渲染多个工程文件的动画?
  • 集训Demo4
  • 本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)
  • 【playwright篇】教程(十六)[macOS+playwright相关问题]
  • ClickHouse物化视图避坑指南:原理、数据迁移与优化
  • IntelliJ IDEA大括号格式设置:换行改行尾