基于SRS的直播服务开发

2023-11-11 21:04:22 spring 编辑:黎为乐




基于SRS的直播服务开发
摘要
SRS是一个高性能的开源流媒体服务器,主要用于直播、点播和视频会议等应用场景。SRS支持多种流媒体协议,包括RTMP、HTTP-FLV、HLS和HTTP-TS,具有高性能、低延迟、低资源消耗等优点。SRS也支持多种推流方式,包括RTMP推流、HLS推流、FLV推流等,同时支持推流鉴权、推流录制、推流转码等功能。
基于SRS直播服务的开发可以实现一个完整的直播系统,包括直播推流、直播转码、直播分发和直播播放等功能。本文则是对SRS进行二次开发,如实现自定义的推流鉴权、录制、转码等功能,及快速构建高性能、低延迟、可靠稳定的直播系统,满足用户对高质量直播的需求。
关键词:SRS,推流,拉流

目录
基于SRS的直播服务开发 2
摘要 2
1、绪论 3
2、 需求分析 4
3、 项目设计 4
2.1项目架构图 4
2.2 RTMP协议及SRS服务介绍 4
2.3 基于spring的接口开发 5
2.4接口的测试与展示 8
4、结论 10
5、参考书目及文献 11




1、绪论
直播服务是一种在线实时视频直播的服务,通常由主播或者直播平台提供。随着互联网技术的不断发展,直播服务已经成为一种越来越受欢迎的娱乐和交流方式。它可以让用户在网络上观看到实时发生的事件,比如演唱会、电竞比赛、直播课堂等等。它的意义在于打破了传统视频播放的时间和空间限制,让用户可以随时随地、即时观看到自己感兴趣的内容。直播服务的另一个重要意义在于互动性,它让观众与主播之间可以进行实时互动,比如弹幕互动、礼物打赏等等。这种互动性增强了用户对内容的参与感和沉浸感,也促进了观众与主播之间的互动和交流。此外,直播服务也为创作者提供了一个全新的创作平台,让他们可以更直接地与观众交流和沟通,获取更多的反馈和支持,从而进一步激发他们的创作热情和灵感,同时也为他们带来了更广泛的社交影响力和商业价值。
直播服务的背景可以追溯到视频共享网站的出现,比如YouTube。随着智能手机和高速移动网络的普及,人们开始用手机拍摄和分享视频。这种趋势逐渐演变成直播服务的形式。最早的直播服务可以追溯到2007年,当时的直播服务还非常简单,只能在电脑上观看。
随着技术的进步,直播服务不断发展,逐渐扩展到智能手机和平板电脑等移动设备上。这使得直播服务的用户群体越来越庞大,吸引了更多的主播和观众。同时,直播服务也成为了一种商业模式,各大直播平台开始与品牌商和广告商合作,为主播和平台带来商业利益。
在市面上,已经有许多的直播平台,然而为什么我们需要自己开发一套直播系统,其原因在于自己开发一套直播系统能够满足个性化定制的需求,可以根据企业或个人的实际情况进行功能和设计的定制,提供更好的用户体验和功能扩展性;同时可以更好地掌握用户数据,保证数据隐私和安全,提高平台的稳定性和安全性;此外,自己开发一套直播系统可以降低成本,避免支付第三方平台的服务费用,也有利于提升品牌形象和商业价值。
本篇介绍的是一个基于SRS(Simple-RTMP-Server)直播服务的自主研发直播系统。该直播系统采用了SRS作为底层技术支持,并且针对不同的直播场景和需求进行了二次开发,实现了更加稳定、高效的直播服务。在本直播系统中,我们结合SRS的优点,实现了多种推流方式,包括RTMP推流、HLS推流、FLV推流等,同时支持推流鉴权、推流录制等功能,实现了自定义的推流鉴权、录制、转码等功能。
综上所述,本直播系统基于SRS直播服务的二次开发,实现了更加稳定、高效的直播服务,并且具有广泛的应用前景。在后续的论文中,我们将对该直播系统的设计和实现进行详细的介绍和分析。
2、需求分析
用户需求:了解目标用户群体的需求和使用场景,例如他们喜欢观看什么类型的直播内容、希望在直播中获得怎样的互动体验等等。
直播平台功能需求:确定直播平台所需要的基本功能,例如直播推流、视频播放、互动功能、用户管理等等,还需要根据用户需求来添加更多的个性化功能。
直播平台性能需求:确定直播平台的性能需求,例如稳定性、容错能力、扩展性、性能响应等等。这些需求需要考虑到用户的使用场景和流量规模。
直播平台的技术需求:确定所需技术方案,例如直播推流和视频播放的协议、互动功能的实现方式、用户管理的技术方案等等。
直播平台的安全需求:确定直播平台的安全需求,例如用户数据的加密、用户认证、防止DDoS攻击等等。
业务模式需求:确定直播平台的商业模式,例如广告投放、虚拟商品销售、会员制等等。
3、项目设计
2.1项目架构图

2.2 RTMP协议及SRS服务介绍
RTMP(Real-Time Messaging Protocol)是Adobe公司开发的实时消息传输协议,主要用于在互联网上传输音视频流和数据流。RTMP协议通过TCP传输,具有可靠性和稳定性,同时支持多种音视频编码格式和多种流媒体协议。它主要分为三个部分:握手、命令和数据传输。该协议已经成为实时音视频传输领域的重要协议,被广泛应用于直播、视频会议、游戏等领域。
SRS(Simple-RTMP-Server)是一个开源的流媒体服务器,由中国的开源社区旗下的ossrs.net团队维护。它支持RTMP、HLS、FLV等多种流媒体协议,可以用于搭建实时音视频直播系统、视频点播系统等。它采用了事件驱动、单线程、协程的设计理念,具有高性能、低延迟、低资源消耗等优点。它支持基于URL的鉴权方式、推流录制、多路复用等特性,可以满足各种直播场景的需求。同时,SRS还提供了丰富的API接口,支持自定义的开发和扩展。它的部署和配置十分简单,可以在Linux和Windows等多种操作系统上运行。同时也支持集群部署,可以通过多个服务器实现负载均衡和高可用性。
总之,SRS是一个功能丰富、性能高效、易于扩展的流媒体服务器,非常适合用于搭建实时音视频直播系统和视频点播系统。
2.3 基于spring的接口开发
2.2.1数据模型
用户表:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uuid` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`role` tinyint(4) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uuid`(`uuid`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
直播间表:
DROP TABLE IF EXISTS `live`;
CREATE TABLE `live` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uuid` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`push_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`push_token` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`ban` tinyint(4) UNSIGNED ZEROFILL NOT NULL DEFAULT 0000,
`client_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
`stream_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uuid`(`uuid`) USING BTREE,
UNIQUE INDEX `push_code`(`push_code`) USING BTREE,
CONSTRAINT `live_ibfk_1` FOREIGN KEY (`uuid`) REFERENCES `user` (`uuid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2.2.2权限校验JWT
JWT (JSON Web Token) 是一种用于在网络应用之间传递信息的安全方式。它使用 JSON 对象作为载荷,将声明(claims)以及签名(signature)组合在一起,生成一个安全令牌(token),用于认证和授权。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含了指定使用 JWT 签名的算法,载荷则包含了需要传递的信息(称为声明),签名则使用指定算法将头部和载荷加密生成的一段字符串。其工作方式如下:
1.用户通过身份验证成功后,服务器生成一个包含用户信息的 JWT。
2.服务器将 JWT 发送给客户端,客户端将其保存在本地。
3.客户端每次向服务器发送请求时,都需要将 JWT 包含在请求头中。
4.服务器验证 JWT 是否有效,并根据其中包含的声明来授权。

核心代码:
//token生成
public static String getToken(Map<String,String> payload){
// 指定token过期时间为7天
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 7);

JWTCreator.Builder builder = JWT.create();
// 构建payload
payload.forEach(builder::withClaim);
// 指定过期时间和签名算法
return builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));
}
//解析token
public static DecodedJWT decode(String token){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
return jwtVerifier.verify(token);
}

2.2.3 接收回调信息
srs是一个高可用的直播服务器,我们则采用Http回调的方式对该服务器做二次开发,定制自己的需求。通过修改srs的配置文件,来设置不同事件的回调地址,如on_publish(客户端发布流),on_unpublish(客户端停止流),on_dvr(DVR录制关闭一个flv文件)。
对srs服务的配置:
http_hooks {
enabled on;
on_publish http://srs-callback:8085/api/v1/streams;
on_unpublish http://srs-callback:8085/api/v1/streams;
on_play http://srs-callback:8085/api/v1/sessions;
on_stop http://srs-callback:8085/api/v1/sessions;
on_dvr http://srs-callback:8085/api/v1/dvr;
}
dvr {
enabled on;
dvr_apply all;
dvr_path ./objs/nginx/dvr/[app]/[stream]-[timestamp].mp4;
dvr_plan session;
time_jitter full;
}
上述的http://srs-callback:8085/api/v1/xxx为回调地址,在发布流的时候会将发布流的客户端信息及服务端信息以post的方式向该地址发出请求。我们只需做好对该回调信息接收及处理,对客户端的推流作鉴权、限流,保存用户的直播状态。用户需要通过给出的推流地址向srs服务器(rtmp://live.com/livestream)上推流,并携带推流码及token,通过推流码来区分不同的直播,token则用来作鉴权,对错误的token作断流操作。
核心代码如下:
String param=object.getString("param");
String[] params =param.substring(1).split("&");
if (!(params.length==1&& params[0].startsWith("token"))){
result.setCode(2);
return result.toString();
}
QueryWrapper<Live> liveQueryWrapper=new QueryWrapper<>();
Map<String,String> map=new HashMap<>();
map.put("push_code",stream_url);
map.put("push_token",params[0].substring(6));
liveQueryWrapper.allEq(map);

2.2.4回放的加载与播放
直播平台的回放功能是非常重要的,它能够帮助用户在错过直播时仍能观看内容,提高观众的观看体验和参与度,设计一个好的直播回放功能可以提高用户体验,增加用户粘性。SRS为开发者提供了回放存储的服务,我们只需要设置直播存放的路径及其文件格式,在直播结束后,向配置好的回调地址发送回放文件信息。对于回放视频的播放,我们创建了一个控制器,用于获取某个用户的所有直播录像文件名称,该录像有着时间信息,可以使得开发者定制自己的功能。再其次是对录像文件的播放,核心代码如下:
@GetMapping("/getDvr/{filename}")
public void getPlayResource(HttpServletRequest request, HttpServletResponse response, @PathVariable String filename) throws Exception {
Path path = Paths.get(url + filename);
LoggerFactory.getLogger(this.getClass()).info(url + filename);
if (Files.exists(path)) {
String mimeType = Files.probeContentType(path);
if (!StringUtils.isEmpty(mimeType)) {
response.setContentType(mimeType);
}
request.setAttribute(MedioHttpRequestHandler.ATTR_FILE, path);
medioHttpRequestHandler.handleRequest(request, response);
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
}
}



2.4接口的测试与展示
接口的调用使用.NET完成,它是一个由微软开发的开源框架,用于构建Windows桌面、Web和移动应用程序。它提供了一个包含多种编程语言的开发环境,包括C#、Visual Basic、F#、C++和Python等。.NET提供了许多功能强大的类库,可以帮助开发人员快速构建高性能、可靠、安全和跨平台的应用程序。其次,拉流使用的VLC播放器的组件,VLC播放器是一款免费、开源、跨平台的多媒体播放器,可以播放各种音频和视频格式,包括DVD、CD、VCD、网络流媒体等。它被广泛使用,因为它支持几乎所有的多媒体文件格式,甚至可以播放一些损坏或不完整的文件。VLC是一个功能强大的多媒体播放器,适用于播放几乎所有的音频和视频格式。它不仅易于使用,而且功能丰富,是一个非常优秀的免费开源软件。
.NET对VLC播放器的调用,在NuGet包管理器安装Vlc.DotNet.Core,Vlc.DotNet.Interc以及Vlc.DotNet.Forms,并设置VLC播放器的lib文件夹,文件夹内容为libvlc.dll,libvlccore.dll及其plugins文件夹的所有文件。
C#代码:
var currentAssembly = Assembly.GetEntryAssembly();
var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;

if (currentDirectory == null)
return;
if (IntPtr.Size == 4)
e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc-32\"));
else
e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc-64\"));

if (!e.VlcLibDirectory.Exists)
{
var folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
folderBrowserDialog.Description = "Select Vlc libraries folder.";
folderBrowserDialog.RootFolder = Environment.SpecialFolder.Desktop;
folderBrowserDialog.ShowNewFolderButton = true;
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
e.VlcLibDirectory = new DirectoryInfo(folderBrowserDialog.SelectedPath);
}
}
拉流
、查看回放(推流时没有给出画面)

获取推流码

4、项目总结
本文介绍了基于SRS的直播服务开发的过程和相关内容。该服务使用RTMP协议作为视频流传输协议,利用SRS作为视频流服务器进行开发。同时,使用Spring框架开发接口,包括数据模型的设计、权限校验、接收回调信息、回放加载与播放等功能,并进行了接口的测试和展示。本文结论如下:
首先,使用SRS作为视频流服务器可以快速搭建一个直播服务,实现视频流的推送和拉取功能。同时,SRS还提供了多种视频编码格式和多种转码方式,能够满足不同客户端和网络环境的需求。
其次,使用Spring框架进行接口开发,能够快速实现接口功能,并具有良好的可扩展性和灵活性。其中,数据模型的设计需要结合实际业务需求进行设计,能够有效地管理数据。权限校验使用JWT技术能够实现安全的用户认证和授权。接收回调信息可以实现对直播状态的监控和处理。回放的加载与播放能够提供优质的用户体验。
最后,通过对接口进行测试和展示,可以验证接口的正确性和可用性。同时,通过收集用户反馈和需求,可以不断优化和改进直播服务的功能和性能。
综上所述,基于SRS的直播服务开发,能够快速搭建一个可靠、高效、安全的直播服务,能够满足不同客户的需求,并具有良好的可扩展性和灵活性。通过不断优化和改进,可以提高直播服务的质量和用户体验,为客户提供更好的服务。
5、参考书目及文献
[1]Json Web Token. (2022). JWT.IO. [Online]. Available: https://jwt.io/
[2]SRS. (2022). SRS: SRS文档. [Online]. Available:
https://ossrs.net/lts/zh-cn/docs/v4/doc/introduction
[3]SpringFramework.(2021).SpringFrameworkReferenceDocumentation.[Online].Available:https://spring.io/

©AHIEC人工智能工作室 2021

地址:安徽省合肥市包河区梁园路安徽工业经济职业技术学院现代科教中心101室

创作者信息:

皖ICP备20011723号-2