热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[流媒体]通读SRS后的总结文档以及搭建直播平台的初次尝试

“SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。”—winlin通读了simplertmpserver的2.0release版本的

“SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。”—winlin
           
            通读了simple rtmp server的2.0release 版本的wiki。从整体上,对simple rtmp server有了比较全面的认识,也根据wiki中的介绍,将simple rtmp server的一些demo跑通,体验了一下SRS部署的简单快速,但是由于手头机器有限,并不能体会SRS的集群部署性能,比较遗憾。
          Simple rtmp server,根据名称就能够知道,整个流媒体服务器的基础就是Real Time Messageing Protocol(RTMP),这是一种设计用来进行实时数据通讯的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间,进行音视频数据通信。为了能够支持IOS跟一些没有Flash播放器的机器,SRS有增加了HLS跟HTTP-FLV支持。其中HLS,指的是http live streaming ,是Apple公司的动态码率自适应技术,主要用于IOS,Mac OS X系统中。特色是拥有m3u8索引文件,然后将视频源切成特定大小的ts切片。基本上,SRS支持的流媒体协议就包括RTMP,HLS,HTTP-FLV。包括RTSP,RTMP变种协议等这些协议,在开源的SRS2.0Release版本中,还没有支持。
          SRS在支持三种协议的同时,也有着丰富的流媒体服务器所具备的功能,比如转码/转封装/采集,内部提供实验版本的http服务器,设置有内存、CPU等分析日志功能,低延迟属性设置功能,还能够实现与CDN对接,具备部署成RTMP分发集群或者HTTP-FLV分发集群的能力,还设立有vhost,可以在一个集群中支持多用户操作,并且,SRS还支持在不中断服务的情况下应用新的配置。
         
          说了那么多,都是纸上谈兵,没有什么卵用,所以,我利用元旦这两天假期,搭建了一个直播平台。平台具有以下功能:
1、 支持RTMP/HLS/HTTP-FLV
2、 支持转码,提供1080P,720P,D1和原始视频源这四种模式流
3、 支持RTMP分发集群
4、 支持将不同种类的流拉到srs中作为rtmp流分发
 
          主流详细的配置文件
1、 布置最基本的RTMP服务器

listen                          1935; #设置主流监听端口max_connections       1000; #设置最大链接数

2、 布置主流

pid                   ./objs/build.home.work.master.pid; # 设置主流PID文件srs_log_file        ./objs/build.home.work.master.log; # 设置主流log文件

3、 布置http server

http_server {               enabled       on; # 启用http server,这里我并没有使用srs中内置的http server,而是采用nginxlisten           8080; # 设定http监听端口dir               ./objs/nginx/html; # 设置nginx启动的app目录}

4、 布置vhost

vhost __defaultVhost__

5、 布置hls服务器

hls{enabled                 on; # 启动hls服务器hls_fragment         10; # 设置hls切片的最大数量hls_window           60; # 设置hls切片的播放窗口时间限制hls_path                ./objs/nginx/html; # 设置使用hls的App的path,这里我使用了srs提供的app}

6、 布置HTTP-FLV服务器

http_remux {enabled     on; # 启动HTTP-FLV服务器mount       [vhost]/[app]/[stream].flv; # 设定挂靠的flv文件hstrs         on; #启动hstrs}

7、 布置拉流

ingest ingest_livestream { #启动拉流,这里只是一个尝试enabled                 on; #启动额外的拉流input{#设定拉流type            file;#设定拉流的类型url               ./doc/source.200kbps.768x320.flv; # 设定拉流的url}ffmpeg                  ./objs/ffmpeg/bin/ffmpeg; #启动ffmpeg作为拉流的工具engine { #将拉流绑定到主流监听enabled                 on;output                  rtmp://127.0.0.01:[port]/live?vhost=[vhost]/ingest_livestream;#设置拉流的访问地址}}

8、 布置转码引擎

transcode {enabled       on; # 开启转码引擎ffmpeg        ./objs/ffmpeg/bin/ffmpeg; #设定转码工具为ffmpeg
a. 1080Pengine super_profile{enabled                 on; # 开启转码引擎vfilter {}vcodec                  libx264; #设定video 的编码工具vbitrate                 1024; # 设定码率vfps                       20;# 设定帧率vwidth                   1920; # 设定图像宽vheight                 1080; # 设定图像高vthreads                4; # 设定转码threadsvprofile                 main; # 设置转码profilevpreset                  medium;# 设置转码质量vparams{}acodec                  libfdk_aac; # 设定audio的编码工具abitrate                 70; # 设定码率asample_rate         44100; # 设定采样率achannels              2; # 设定声道aparams {}output                  rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出}
b. 720Pengine high_profile{enabled                 on; # 开启转码引擎vfilter {}vcodec                  libx264; #设定video 的编码工具vbitrate                 700; # 设定码率vfps                       20;# 设定帧率vwidth                   1280; # 设定图像宽vheight                 720; # 设定图像高vthreads                4; # 设定转码threadsvprofile                 main; # 设置转码profilevpreset                  medium;# 设置转码质量vparams{}acodec                  libfdk_aac; # 设定audio的编码工具abitrate                 70; # 设定码率asample_rate         44100; # 设定采样率achannels              2; # 设定声道aparams {}output                  rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出}
c. D1engine normal_profile{enabled                 on; # 开启转码引擎vfilter {}vcodec                  libx264; #设定video 的编码工具vbitrate                 500; # 设定码率vfps                       20;# 设定帧率vwidth                   704; # 设定图像宽vheight                 576; # 设定图像高vthreads                4; # 设定转码threadsvprofile                 main; # 设置转码profilevpreset                  medium;# 设置转码质量vparams{}acodec                  libfdk_aac; # 设定audio的编码工具abitrate                 70; # 设定码率asample_rate         44100; # 设定采样率achannels              2; # 设定声道aparams {}output                  rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出}边缘流配置,这里使用一个edge流作为例子

1、 基本RTMP服务器

listen                          19350;#设定监听端口max_connections       1000;# 设定最大链接数

2、 Edge配置

pid                             ./objs/build.home.work.slave.pid;# 设定PID文件srs_log_file                 ./objs/build.home.work.slave.log;# 设定log文件

3、 Vhost

vhost __defaultVhost__

4、 设定主流

mode                         remote;# 设定为remoteorigin                         127.0.0.1:1935; # 绑定主流的IP端口

5、 布置转码引擎,与主流的转码引擎一直,不再赘述,唯一不同的就是在访问时,我们要访问19350这个端口。
 
推流命令:ffmpeg -re -i 1.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.100/live/livestream
搭建完成后,对应不同流的访问地址(服务器地址为192.168.1.100):
主流:
1、 原始RTMP流:rtmp://192.168.1.100:1935/live/livestream
2、 1080P RTMP 流:rtmp://192.168.1.100:1935/live/livestream_super_profile
3、 720P RTMP流:rtmp://192.168.1.100:1935/live/livestream_high_profile
4、 D1 RTMP流:rtmp://192.168.1.100:1935/live/livestream_normal_profile
试验用CDN的edge流:
1、 原始RTMP流:rtmp://192.168.1.100:19350/live/livestream
2、 1080P RTMP 流:rtmp://192.168.1.100:19350/live/livestream_super_profile
3、 720P RTMP流:rtmp://192.168.1.100:19350/live/livestream_high_profile
4、 D1 RTMP流:rtmp://192.168.1.100:19350/live/livestream_normal_profile
HLS流:
http://192.168.1.100:8080/live/livestream.m3u8
HTTP-FLV 流:
http://192.168.1.100:8080/live/livestream.flv
试验用拉流到srs的访问流:
rtmp://192.168.1.100:1935/live/ingest_livestream



推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
  • 大家好,我是李白。本文将分享一个从零开始的全栈项目,涵盖了设计、前端、后端和服务端的全面学习过程。通过这个项目,我希望能够帮助初学者更好地理解和掌握全栈开发的技术栈。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
author-avatar
wu勿望我_957
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有