如何用P2P技术为SRS媒体服务器节省带宽成本

这篇具有很好参考价值的文章主要介绍了如何用P2P技术为SRS媒体服务器节省带宽成本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    直播流的重要性在当今社会已无需多言,动辄上百万人同时在线的直播场景也已屡见不鲜。随着越来越多的观众收看直播,如何有效降低带宽成本,提升播放体验已成为各大视频厂商和创业者共同面对的技术难题。假设有 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地址。    如何用P2P技术为SRS媒体服务器节省带宽成本,流媒体,WebRTC,CDN,p2p,服务器,webrtc,cdn

    推流的内容可以是媒体源,也可以是显示器采集等,完成配置后点击开始直播,如果一切顺利的话,生成的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。

如何用P2P技术为SRS媒体服务器节省带宽成本,流媒体,WebRTC,CDN,p2p,服务器,webrtc,cdn

如何用P2P技术为SRS媒体服务器节省带宽成本,流媒体,WebRTC,CDN,p2p,服务器,webrtc,cdn 

    系统每天会提供25GB的免费流量,足够测试使用。完成以上操作后,就可以正式上线啦,撒花。管理后台还有很多实用功能,比如实时飞线图、历史趋势图、用户地理分布图等等,这里就留给你自己探索啦。

    关于能节省的带宽成本,这里无法给出具体的数值,因为受所在区域、同时观看同一个流的用户数、流的参数等各种因素影响,根据后台统计平均可以达到的效率在60%到90%之间,这里效率是指通过P2P下载的有效数据量占总有效数据量的百分比。当然,我们技术客服哥哥会悉心指导您优化参数,尽量达到最好的效果,所以有任何问题别忘了在我们官网右下角点击客服咨询哦。相信有P2P技术的加持,再加上其他优化,比如直播转码或者H.265编码等,带宽成本将不再成为限制您业务成长的瓶颈! 文章来源地址https://www.toymoban.com/news/detail-837185.html

到了这里,关于如何用P2P技术为SRS媒体服务器节省带宽成本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合

    前言 随着互联网的发展,流媒体视频内容日趋增多,已经成为互联网信息的主要承载方式。相对传统的文字,图片等传统WEB应用,流媒体具有高数据量,高带宽、高访问量和高服务质量要求的特点,而现阶段互联网“尽力而为”的特点决定了在现有网络架构下大规模流媒体应

    2024年02月11日
    浏览(48)
  • 区块链核心技术-P2P网络

    点对点网络是区块链中核心的技术之一,主要关注的方面是为区块链提供一个稳定的网络结构,用于广播未被打包的交易(交易池中的交易)以及共识过的区块,部分共识算法也需要点对点的网络支撑(如PBFT),另外一个辅助功能,如以太坊的消息网络,也需要点对点网络的

    2023年04月17日
    浏览(57)
  • 基于 P2P 技术的 Android 局域网内设备通信实践

    Android 局域网内的多设备通信方式有多种,其中常见的方式有: 基于 TCP/UDP 的 Socket 通信 基于 Bluetooth 的近场通信 基于 Wifi 的 Wi-Fi Direct 连接 基于第三方框架的通信,如 MQTT、Websocket 等 每种方式都有其适用范围,下面分别介绍一下它们的示例代码、优劣势。 Socket 是 TCP/UDP 套

    2024年02月08日
    浏览(48)
  • 转载: 又拍云【PrismCDN 】低延时的P2P HLS直播技术实践

    低延时的P2P HLS直播技术实践 本文是第二部分《PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘》 [首页 Open Talk NO.41 | 2018 音视频技术沙龙·深圳站 低延时 WebP2P 直播技术实践 https://opentalk-blog.b0.upaiyun.com/prod/2018-06-12/aa2e26500fc0b2eba14939746aed4d15]() 讲师简介 又拍云 PrismCDN 项目

    2024年02月09日
    浏览(47)
  • 搭建SRS流媒体服务器

    一、获取 SRS git clone https://github.com/ossrs/srs cd srs/trunk 二、编译SRS ./configure make 三、编写SRS配置文件(我的这个文件是原始的,未修改) vim conf/srs.conf 四、启动SRS ./objs/srs -c conf/srs.conf 五、启动ip摄像头进行推流 手机下载一个ip摄像头软件,然后设置中修改RTMP推流地址 rtmp://你的阿里

    2024年02月16日
    浏览(48)
  • 区块链(8):p2p去中心化之websoket服务端实现业务逻辑

    1 业务逻辑 例如 peer1和peer2之间相互通信 peer1通过onopen{ write(Mesage(QUERY_LATEST))} 向peer2发送消息“我要最新的区块”。 peer2通过onMessage收到消息,通过handleMessage方法对消息进行处理。 handleMessage根据消息类型进行处理 RESPONSE_BLOCKCHAIN:返回区块链,RESPONSE_BLOCKCHAIN处理进入handleB

    2024年02月08日
    浏览(47)
  • Wi-Fi Direct:在 Android 上构建基于 P2P 技术的局域网通信

    在 Android 应用中实现局域网内设备通信,可以使用 P2P(Peer-to-Peer)技术来实现。P2P 技术使得设备之间可以直接相互通信,而不必通过服务器或者其他中介设备。在 Android 中,你可以使用 Wi-Fi Direct 技术来实现 P2P 通信。 下面是一个简单的示例,演示如何在 Android 应用程序中使

    2024年02月08日
    浏览(51)
  • SRS流媒体服务器——Forward集群搭建和源码分析

    Forward集群原理 RTMP流转发(Forward)部署实例 Forward集群源码分析 Forward 表示向前、前头的、发送等意思。 在SRS中可以理解为把Master节点获得直播流⼴播(转发)给所有的Slave节点,master节点由多少路直播流,那么在每个slave节点也会多少路直播流。 注:在SRS中还有另外⼀种集

    2023年04月11日
    浏览(100)
  • SRS流媒体服务器——SRS4.0 WebRTC一对一通话环境搭建与逻辑分析

    环境搭建 SRS4.0 WebRTC1对1通话逻辑分析 1. 安装go语⾔环境 在Go语⾔官⽹找到对应的安装包(Downloads - The Go Programming Language) 下载和解析(使用的是阿里云的Ubuntu系统): 3.需要配置 GOROOT 和 PATH环境变量,在/etc/profile中配置。 4. 然后使用 source /etc/profile 命令使配置文件生效,就

    2023年04月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包