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/