西瓜视频播放器SRS实现直播方案
直播作为近几年比较火的方向,吸引了像我这样的小白不断在音视频的边缘不断试探。"宇宙的尽头是直播",不论是娱乐直播还是直播带货,都已经成为现在人们生活中不可获取的一部分。 今天我们就来实现一个直播的 demo,我们来看一下整个直播的过程:
SRS 流媒体服务器
为了方便我推荐使用云 SRS,可以基于宝塔一键部署,如果没有云服务器可以根据官方 github 自行编译(难度较大,不推荐新手选择此方式)。 在宝塔的软件商店中搜索 SRS(免费的,如果显示购买直接点击购买即可),点击安装
插件包安装完成之后打开,安装云 SRS,这个过程比较耗时,耐心等待……
安装完成之后需要等待几分钟,云 SRS 内部的依赖启动需要一定的时间,等启动完成之后打开管理面板,设置管理员密码之后,进入系统设置菜单,找到 OpenAPI 选项,我们的后端服务需要根据这两个接口来获取串流秘钥。
后端服务
这边的业务服务器我们使用 Node 来实现,在这个过程中负责客户端鉴权以及获取串流秘钥,这里我选用 Midway(全凭个人喜好,可以选择任何其他的框架 Express、Koa、nest 等)。 我们这里提供两个接口: 主播获取推流地址和串流秘钥; 获取房间信息(最主要是 streamKey)
C++音视频学习资料免费获取方法:关注音视频开发T哥 ,点击正在跳转即可免费获取2023年最新 C++音视频开发进阶独家免费学习大礼包!
获取串流秘钥
使用 ApiSecret 从云 SRS 的 OpenAPI来获取秘钥,过程如下
以下是代码实现(忽略实体、配置等部分,只展示流程) @Controller("/anchor") export class AnchorController { @Inject() ctx: Context; @Inject() roomService: RoomService; @Inject() anchorService: AnchorService; @Inject("short-uuid") short; @Config("srs") srs; // 配置了服务器 IP 和 ApiSecret // 判断主播身份 validateAnchor(user: UserModel) { if (!user || user.role !== UserRole.ANCHOR) // 如果没有用户(可能被冻结或者注销)或者没有权限抛出异常 throw new CustomError( INSUFFICIENT_PERMISSIONS.CODE_1, INSUFFICIENT_PERMISSIONS.MSG_1 ); } // 生成向直播间串流秘钥(限制主播身份) @Post("/streamKey") async createStreamKey() { const userId = this.ctx.state.user.uid; const user = await this.anchorService.getAnchorWithRoom(userId); // 身份判断 this.validateAnchor(user); // 将主播关联的直播间进行串流秘钥重置 const key = this.short.generate(); const room = user.liveRoom; room.streamKey = key; // 保存新的串流秘钥 await this.roomService.saveRoom(room); // 获取 token (makeHttpRequest 相当于 fetch, 做请求用) const token = await makeHttpRequest( "http://" + this.srs.url + "/terraform/v1/mgmt/secret/token", { method: "POST", dataType: "json", contentType: "json", data: { apiSecret: this.srs.apiSecret, }, } ); // 使用 token 获取 secret const srsSecret = await makeHttpRequest( "http://" + this.srs.url + "/terraform/v1/hooks/srs/secret/query", { method: "POST", dataType: "json", contentType: "json", data: { token: token.data.data.token, }, } ); return { url: "rtmp://" + this.srs.url + "/live/", key, secret: srsSecret.data.data.publish, }; } }
主播每次获取串流密钥会进行重置,防止泄露。 获取直播间信息
获取直播间信息相对简单,只需要查询数据返回即可 @Controller("/live") export class LiveController { @Inject() ctx: Context; @Inject() roomService: RoomService; // 获取直播间相关数据 @Get("/room/:roomId") async getRoomById(@Param("roomId") room: string) { const res: any = await this.roomService.getRoomById(room); if (!res) { throw new CustomError(ROOM_NOT_FOUND.CODE, ROOM_NOT_FOUND.MSG); } // 粉丝数量取值 res.fans = res.fans.length; return res; } }xgplayer(西瓜播放器)
播放器我当初对比过 MuiPlayer 和 xgPlayer,最终选择了西瓜(背靠大厂、集成度更高)。 我们使用 http-flv 的形式来进行推拉流,所以我们需要同时安装 xgplayer 和 xgplayer-flv $ pnpm add xgplayer xgplayer-flv
前端框架层面我使用了 Vue3,代码如下(只是播放器相关部分,不是最终成品的代码) 成品展示
主播面板获取推流码,复制到 OBS 中开始推流
观众进入直播间获取直播流进行播放
作者:枫景 链接:https://juejin.cn/post/7152397283248570404
#音视频开发##程序员##把地球的故事讲给宇宙#
供销社,曾经熟悉过的照片?供销合作社成立之初最基本的职能就是供和销。新中国成立之初国民经济基础薄弱商品流通阻塞,需要供销合作社来组织城乡流通恢复经济。而当下,供销合作社在商品集散分销方面仍然发挥着重要作用,
土耳其历史教科书声称建立过十六个强大政权并建立我国三个朝代土耳其是西亚国家中野心最大的一个,土耳其梦想建立一个包括整个西亚和中亚的国家,因此,土耳其通过历史教科书告诉土耳其人土耳其在历史上曾经建立过十六个强大政权,每一个政权的疆域都很辽阔
诗仙李白的传奇与事实(之二)李白不是胡人国学大师陈寅恪在李太白氏族之疑问中提出,李白是胡人。论据有出生于西域长得像胡人,因为魏颢曾写过李白是眸子炯然,哆如饿虎行为举止像胡人,作诗调侃孔圣人,不参加科举,像胡人一样喜欢胡姬
真实的唐伯虎,有点惨唐寅,字伯虎,故以唐伯虎闻名于民间,明朝苏州人。生于成化六年二月初四(1470年3月6日),死于嘉靖二年十二月初二(1524年1月7日)。出身商人家庭,父亲唐广德经营一家酒肆,虽生
你们知道吗为什么把妻子出轨的男人叫戴绿帽子在中国男性最怕戴的帽子是绿帽子这是因为绿帽子一词在中国文化氛围中带有歧义的文化色彩。但是,在中国古代早期很多地方并没有侮辱性的意思。关于绿帽子的传言有很多说法不一,要想解开这个谜团
明穆宗在位六年,沉迷媚药,为何史书对他的评价却极高?明明是兄弟中最不起眼的一个,也是与皇位最没有缘分的一个,但是他却靠躺赢站在了权力之巅。登基多年朱载坖不仅落得了勤政爱民的好名声,而且还解决了很多他老爹来了都解决不了的棘手问题,但是
民国牛人,北大任期最长的校长,晚年却在情字上栽了跟头在我见过的一些女士中,你是最使我心动的人1960年,72岁的蒋梦鳞,经人介绍,认识了徐娘半老,风韵犹存的53岁交际花徐贤乐,从此情根深重,非她不娶,闹得沸沸扬扬,成为当时岛内的焦点
14年的侵华,日本究竟用了多少生命来填补,让人泪目的真实数字二战是人类历史上最大的一次灾难,战争蔓延至全球各个国家。它给全世界的人民带来了惨痛的灾难,它无时无刻不在提醒着人们追求和平,反对战争。日本,一个国土面积不大且领土狭长的国家。在明治
如果张作霖未被炸死是否还会有九一八前序你们要去九一八呀?,哎,其实也没什么,日本人要是没炸死张作霖就根本不会有九一八。张大帅一死全完了,临死前让张学良回来,他这个不争气的儿子竟然听蒋介石的话不与抵抗。张大帅下面的一
被关14年的疯老头,千辛万苦逃回家,妻子却问你是谁?1947年,山东阳谷县一户农户家,一个蓬头垢面的老头不停地敲着门。只见他脚着草鞋一身破烂衣裤,漏出的手臂和后背上全是一道道伤疤,不知过了多久,门被缓缓打开,一妇人从里面探出身来,看
日本民族的侵略性日本民族的侵略性消失了吗?那种病态疯狂和强烈攻击性消失了吗?不仅没有,反而一直存在。只要日本的文化不曾改变,这个民族病态的侵略性就会一直存在下去。在上个世纪那场席卷全球的大战中,德