热门标签 | 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



推荐阅读
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • mybatis 详解(七)一对一、一对多、多对多
    mybatis详解(七)------一 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • web页面报表js下载,web报表软件 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • 在构建 Caffe 时,可能会遇到与 Protobuf 版本不兼容导致的链接错误。本文将详细介绍这些错误及其解决方案。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 本文介绍了如何使用Aspose库将Office文件(如Word、PowerPoint)转换为HTML文件,并详细说明了在转换过程中可能出现的乱码问题及其解决方案。 ... [详细]
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社区 版权所有