直播流的重要性在当今社会已无需多言,动辄上百万人同时在线的直播场景也已屡见不鲜。随着越来越多的观众收看直播,如何有效降低带宽成本,提升播放体验已成为各大视频厂商和创业者共同面对的技术难题。假设有 10,000 名观众观看相同 1Mbps 比特率流的直播场景,所需带宽将达到惊人的 10Gbps,虽然可以通过直播转码或者H.265编码来缓解,但会耗费更多CPU成本,而且节省效果并没有非常显著,那我们是否可以转变思维,在分发环节上下功夫呢?
我们都知道家庭带宽成本是远小于商用带宽的,而且在大部分时间里用户的上行带宽都是闲置着的,如果能把这部分资源利用起来,让收看同一个直播流的终端设备,以某种拓扑结构互相连接,共享直播流数据,将为解决这一难题提供一种几乎零成本的方案。当然由于直播流的实时性,要做到一种接近理论最优的效果,同时还要考虑各种临界条件,保证整个系统的稳定性,是一个不小的工程。自己从头开发耗时耗力,一般中小规模的企业,直接接入SaaS服务也许是更为明智的选择。
本文将以SRS媒体服务器和HLS协议为例,手把手演示如何接入SwarmCloud的P2P流媒体加速引擎,用不到一杯咖啡的时间,轻松节省 70%以上带宽成本。
关于演示的服务器,本文采用的是腾讯云的轻量应用服务器,您也可以使用其他任何服务器。首先是安装docker,网上有很多教程,这里不再赘述。由于SRS默认的HLS配置不太适合P2P分发(主要是因为单个切片文件过大),我们可以自己创建一个hls.conf,并且通过文件挂载目录的方式映射到docker中。
mkdir conf && touch ./conf/hls.conf
编辑hls.conf文件,直接粘贴以下代码:
# the config for srs to delivery hls
# @see https://ossrs.net/lts/zh-cn/docs/v4/doc/sample-hls
# @see full.conf for detail config.
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 4;
hls_window 60;
}
}
稍微解释一下,hls_fragment表示单个切片的时长是4秒,hls_window表示一个播放列表的总的ts切片时长是60s,其他配置可以查看SRS官方文档。保存文件后,开始用docker启动SRS:
sudo docker run -p 1935:1935 -p 8080:8080 -v "$(pwd)"/conf:/usr/local/srs/conf \
-d registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 \
./objs/srs -c conf/hls.conf
这段命令跟官方给出的区别是不再使用默认配置,而是挂载我们刚才创建的hls.conf。启动SRS成功后,我们可以开始用OBS推流,配置如下图所示,其中打马赛克的部分是服务器的IP地址。
推流的内容可以是媒体源,也可以是显示器采集等,完成配置后点击开始直播,如果一切顺利的话,生成的m3u8地址如下:
http://xx.xx.xx.xx:8080/live/livestream.m3u8
成功完成服务端配置后,我们终于可以开始在播放器集成P2P插件了。这里以西瓜播放器(https://h5player.bytedance.com)为例,其他播放器的集成方法可以参考官方文档(https://www.cdnbye.com/cn/web-hls/players.html)。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,minimal-ui">
<meta name="referrer" content="no-referrer">
<style type="text/css">
html, body {width:100%;height:100%;margin:auto;overflow: hidden;}
body {display:flex;}
#mse {flex:auto;}
</style>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/xgplayer@3.0.12/dist/index.min.css">
<script type="text/javascript">
window.addEventListener('resize',function(){document.getElementById('mse').style.height=window.innerHeight+'px';});
</script>
</head>
<body>
<div id="mse"></div>
<script src="//cdn.jsdelivr.net/npm/xgplayer@3.0.12/dist/index.min.js" charset="utf-8"></script>
<script src="//cdn.jsdelivr.net/npm/xgplayer-hls.js@3.0.12/dist/index.min.js" charset="utf-8"></script>
<script src="//cdn.jsdelivr.net/npm/swarmcloud-hls@latest/dist/p2p-engine.min.js"></script>
<script type="text/javascript">
var p2pConfig = {
live: true,
// trackerZone: 'hk', // if using Hongkong tracker
// trackerZone: 'us', // if using USA tracker
// token: YOUR_TOKEN
// Other p2pConfig options if applicable
}
P2PEngineHls.tryRegisterServiceWorker(p2pConfig).then(() => {
var player = new window.Player({
id: 'mse',
isLive: true,
url: 'http://xx.xx.xx.xx:8080/live/livestream.m3u8', // 这里替换成您的播放地址
autoplay: true,
playsinline: true,
height: window.innerHeight,
width: window.innerWidth,
plugins: P2pEngineHls.isMSESupported() ? [window.HlsJsPlugin] : [],
hlsJsPlugin: {
hlsOpts: {
maxBufferSize: 0, // Highly recommended setting in live mode
maxBufferLength: 10, // Highly recommended setting in live mode
liveSyncDurationCount: 6, // Highly recommended setting in live mode
}
}
});
const events = window.Player.Events;
[events.READY, events.URL_CHANGE].forEach(event => {
player.on(event, () => {
if (P2pEngineHls.isMSESupported()) {
p2pConfig.hlsjsInstance = player.getPlugin("HlsJsPlugin").hls; // set hlsjs instance to SDK
new P2pEngineHls(p2pConfig)
}
})
})
})
</script>
</body>
</html>
这里简单解释下,通过script标签引入js库"p2p-engine.min.js",之后再播放器完成准备后获取hls.js实例,并且实例化P2pEngineHls并传入p2pConfig:
[events.READY, events.URL_CHANGE].forEach(event => {
player.on(event, () => {
if (P2pEngineHls.isMSESupported()) {
p2pConfig.hlsjsInstance = player.getPlugin("HlsJsPlugin").hls; // set hlsjs instance to SDK
new P2pEngineHls(p2pConfig)
}
})
})
在locolhost打开2个tab,就可以看到有p2p效果了。但如果要部署到线上,还需要在SwarmCloud管理后台绑定域名,方法也很简单,访问https://dash.cdnbye.com,可用区选择欧洲(可以在p2pConfig的trackerZone字段配置别的可用区),然后输入邮箱密码完成注册。注册成功后会跳转到主界面,在这里会提示你绑定域名,点击跳转后根据指示操作即可,需要注意的是这里绑定的域名是播放器所在域名,并不是流地址的域名。如果是原生应用(安卓或者iOS)则选择创建APP并输入APP的bundle ID。
系统每天会提供25GB的免费流量,足够测试使用。完成以上操作后,就可以正式上线啦,撒花。管理后台还有很多实用功能,比如实时飞线图、历史趋势图、用户地理分布图等等,这里就留给你自己探索啦。文章来源:https://www.toymoban.com/news/detail-837185.html
关于能节省的带宽成本,这里无法给出具体的数值,因为受所在区域、同时观看同一个流的用户数、流的参数等各种因素影响,根据后台统计平均可以达到的效率在60%到90%之间,这里效率是指通过P2P下载的有效数据量占总有效数据量的百分比。当然,我们技术客服哥哥会悉心指导您优化参数,尽量达到最好的效果,所以有任何问题别忘了在我们官网右下角点击客服咨询哦。相信有P2P技术的加持,再加上其他优化,比如直播转码或者H.265编码等,带宽成本将不再成为限制您业务成长的瓶颈! 文章来源地址https://www.toymoban.com/news/detail-837185.html
到了这里,关于如何用P2P技术为SRS媒体服务器节省带宽成本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!