自研直播系统-直播系统实战

发布于:2024-07-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

1 流媒体基础

本文教程下载地址

https://download.csdn.net/download/a254939392/89505918

点击下载

1.1 流媒体

	流媒体(Streaming Media)技术是指将一连串的媒体数据压缩后,以流的方式在网络中分段传送,实现在网络上实时传输影音以供观赏的一种技术。 [2] 流媒体实际指的是一种新的媒体传送方式,有声音流、视频流、文本流、图像流、动画流等,而非一种新的媒体。 [2] 流媒体文件格式是支持采用流式传输及播放的媒体格式。常用格式有:RA:实时声音;RM:实时视频或音频的实时媒体;RT:实时文本;RP:实时图像;SMII.:同步的多重数据类型综合设计文件;SWF:real flash和shockwavc flash动面文件;RPM: HTMI。文件的插件;[RAM](https://baike.baidu.com/item/RAM/144481):流媒体的源文件,是包含RA、RM、SMIIJ文件地址(URL地址)的文本文件;CSF:一种类似媒体容器的文件格式,可以将非常多的媒体格式包含在其中,而不仅仅限于音、视频。quicktime,mov,asf,[wmv](https://baike.baidu.com/item/wmv/1195900),wma,avi,mpeg,mpg,dat,mts; aam多媒体教学课件格式,可将authorware生成的文件压缩为aam和aas流式文件播放	

1.2 流式传输方式

在网络上传输音、视频信息有两个方式:下载和流式传输。
	下载:就是把音、视频文件完全下载到本机后开始播放,它的特点是必须等到视频文件下载完成方可播放,播放等待时间较长,无法去播放还未下载的部分视频	流式传输:就是客户端通过链接视频服务器实时传输音、视频信息,实现“边下载边播放”。

流式传输是指通过网络传送媒体(音频、视频等)技术的总称。
实现流式传输主要有两种方式:顺序流式传输( progressive streaming)和实时流式传输( real time streaming)

1.2.1 顺序流式传输

	顺序流式传输是顺序下载,用户在观看在线媒体的同时下载文件,在这一过程中,用户只能观看下载完的部分,而不能直接观看未下载部分。也就是说,用户总是在一段延时后才能看到服务器传送过来的信息。由于标准的HTTP服务器就可以发送这种形式的文件,它经常被称为HTTP流式传输。
	由于顺序流式传输能够较好地保证节目播放的质量,因此比较适合在网站上发布的、可供用户点播的、高质量的视频。 
顺序流式文件是放在标准HTTP或FTP服务器上,易于管理,基本上与防火墙无关。顺序流式传输不适合长片段和有随机访问要求的视频,如:讲座、演说与演示。它也不支持现场广播

1.2.2 实时流式传输

	实时流式传输必须保证匹配连接带宽,使媒体可以被实时观看到。在观看过程中用户可以任意观看媒体前面或后面的内容,但在这种传输方式中,如果网络传输状况不理想,则收到的图像质量就会比较差实时流式传输需要特定服务器,如 Quick Time Streaming Server、 Realserver或 Windows Media server。这些服务器允许对媒体发送进行更多级别的控制,因而系统设置、管理比标准HTTP服务器更复杂。
	实时流式传输还需要特殊网络协议,如:RTSP( realtime streaming protocol)或MMS(microsoft media server)。在有防火墙时,有时会对这些协议进行屏闭,导致用户不能看到一些地点的实时内容,实时流式传输总是实时传送,因此特别适合现场事件
	#常见的实时流式传输协议有RTSP、RTMP、RSVP 等

1.3 流媒体传输协议

(rtp/rtcp/rtsp/rtmp/mms/hls)

常用的 rtmp 与hls http-flv

1.3.1 rtmp协议

RTMP(Real Time Messaging Protocol)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。它有三种变种:
(1)工作在TCP之上的明文协议,使用端口1935;
(2)RTMPT封装在HTTP请求之中,可穿越防火墙;
(3)RTMPS类似RTMPT,但使用的是HTTPS连接。
RTMP视频播放的特点:
(1)RTMP协议是采用实时的流式传输,所以不会缓存文件到客户端,这种特性说明用户想下载RTMP协议下的视频是比较难的;
(2)视频流可以随便拖动,既可以从任意时间点向服务器发送请求进行播放,并不需要视频有关键帧。相比而言,HTTP协议下视频需要有关键帧才可以随意拖动。
(3)RTMP协议支持点播/回放(通俗点将就是支持把flv,f4v,mp4文件放在RTMP服务器,客户端可以直接播放),直播(边录制视频边播放)。
RTMP环境的架设:
因为该协议是adobe公司开发的,所以最初服务器端架设的环境是FMS(Flash Media Server),该软件为收费软件,价格昂贵。后来,开源软件red5的推出,使rtmp协议的架设成本大大缩小,但是在性能方面不如fms的稳定。此外,wowza虽然是收费的,但价格比较适中。

1.3.2 HLS协议

	HTTP Live Streaming(HLS)是苹果公司实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用于iOS系统。`HLS点播是分段HTTP点播,不同在于它的分段非常小。要实现HLS点播,重点在于对媒体文件分段,目前有不少开源工具可以使用。

相对于常见的流媒体直播协议,HLS直播最大的不同在于,直播客户端获取到的并不是一个完整的数据流,HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

`原理就是把整个流分成一个个小小的基于Http的文件来下载,这样可以以不同的速率来下载同样的源(码流自适应),最开始会先去下载一个m3u8,这是一个playList,找到可以用的流,
'HLS协议规定:
1)封装格式是TS
2)视频编码格式是H264,音频是MP3/AAC/AC3

HLS的工作方式是:将视频拆分成若干ts格式的小文件,通过m3u8格式的索引文件对这些ts小文件建立索引。一般
10秒一个ts文件,播放器连接m3u8文件播放,当快进时通过m3u8即可找到对应的索引文件,并去下载对应的ts文
件,从而实现快进、快退以近实时 的方式播放视频。
IOS、Android设备、及各大浏览器都支持HLS协议。

1.3.3 RTSP协议

RTSP(Real Time Streaming Protocol):实时流传送协议,是用来控制声音或影像的多媒体串流协议, 由RealNetworks和Netscape共同提出的;

1.3.4 视频流的对比

协议 httpflv rtmp hls dash
传输方式 http流 tcp流 http http
视频封装格式 flv flv tag Ts文件 Mp4 3gp webm
延时
数据分段 连续流 连续流 切片文件 切片文件
Html5播放 可通过html5解封包播放(flv.js) 不支持 可通过html5解封包播放(hls.js) 如果dash文件列表是mp4webm文件,可直接播放

1.4 视频编码(codec)

	所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo、微软公司的WMV以及Apple公司的QuickTime
视频编码的意义:	
	原始视频数据存储空间大,一个 1080P 的 7s 视频需要 817 MB
原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟。而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms ,可以满足实时传输的需求,所以从视频采集传感器采集来的原始视频势必要经过视频编码。
基本原理:
为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?核心思想就是去除冗余信息:
1)空间冗余:图像相邻像素之间有较强的相关性
2)时间冗余:视频序列的相邻图像之间内容相似
3)编码冗余:不同像素值出现的概率不同
4)视觉冗余:人的视觉系统对某些细节不敏感
5)知识冗余:规律性的结构可由先验知识和背景知识得到
编码器的选择:
视频编码器经历了数十年的发展,已经从开始的只支持帧内编码演进到现如今的 H.265 和 VP9 为代表的新一代编码器,下面是一些常见的视频编码器:
1)H.264/AVC
2)HEVC/H.265
3)VP8
4)VP9
5)FFmpeg
注:音频编码器有Mp3, AAC等。
视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
常用的视频编码格式如下。
H.262
H.264
H.265
#以上编码格式都是有版权的,但是可以免费使用
#还有几种无版权的视频编码格式。
VP8
VP9
AV1

音频编码

常用的音频编码格式
MP3
AAC

1.5 分辨率的规范

 标清: 480x320, 640x480 
 高清: 1024x720p 或 1920x1080i (隔行扫描) 
 全高清: 1920x1080p
 超()清: 3840x2160,7680x4320
 4K: 4K分辨率是1080p的4倍 3840×2160 = 1920×2×1080×2
 8K: 8K分辨率是4K的4倍 7680×4320 = 3840×2×2160×2
 
 ps:
 P:progressive,意思是逐行扫描,帧编码
 I:interlace,意思是隔行扫描,场编码
 #两者是视频编码里的编码方式,分辨率一样

美国消费电子协会(CEA)将4K的分辨率正式命名为Ultra HD(Ultra High-Definition)

https://www.cnblogs.com/chengfangming/p/4804958.html
http://service.ivideostar.com/bbs/thread-540-1-7.html

分辨率簡介:

分辨率,又称解析度、解像度,可以细分为显示分辨率、图像分辨率、打印分辨率和扫描分辨率等。
	显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。

通常情况下,图像的分辨率越高,所包含的像素就越多,图像就越清晰,印刷的质量也就越好。同时,它也会增加文件占用的存储空间

1.5.2 分辨率單位

	描述分辨率的单位有:dpi([点每英寸])、lpi(线每英寸)、ppi([像素每英寸])和[PPD](PPPixels Per Degree 角分辨率,像素每度)。但只有lpi是描述光学分辨率的尺度的。虽然dpi和ppi也属于分辨率范畴内的单位,但是他们的含义与lpi不同。而且lpi与dpi无法换算,只能凭经验估算。 [2] 

另外,ppi和dpi经常都会出现混用现象。但是他们所用的领域也存在区别。从技术角度说,“像素”只存在于电脑显示领域,而“点”只出现于打印或印刷领域


像素

像素即px,是画面中最小的点(单位色块)。分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。
分辨率可以分为两方面:屏幕分辨率和图像分辨率。
1. 屏幕分辨率:     
	例如,屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。    例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。
2. 图像分辨率:    
	例如,一张图片分辨率是500x200,也就是说这张图片在屏幕上按1:1放大时,水平方向有500个像素点(色块),垂直方向有200个像素点(色块)。    在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。(可以理解为图片的像素点和屏幕的像素点是一个一个对应的)。    但是,在屏幕上把图片超过100%放大时,为什么图片上像素色块也变的越大,其实是设备通过算法对图像进行了像素补足,我们把图片放的很大后看到的一块一块的方格子,虽然理解为一个图像像素,但是其实是已经补充了很多个屏幕像素;同理,把图片小于100%缩小时,也是通过算法将图片像素进行减少。      最后,虽然不同设备上像素块大小会不一样,但是同一台硬件设备上的屏幕分辨率、像素块大小是不会变的。PC电脑上之所以可以调整屏幕分辨率,其实也是通过算法转换了

1.6 码率

​ 码率又叫比特率即每秒传输的bit数,单位为bps(Bit Per Second),码率越大传送数据的速度越快。
​ 码率的计算公式是:文件大小(转成bit)/ 时长(秒)/1024 = kbps 即每秒传输千位数
​ 例如一个1M的视频,它的时长是10s,它的码率等于

1*1024*1024*8/10/1024 = 819Kbps

1.7 针速率 FPS

每秒传输帧数(Frames Per Second)

	FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数越多,所显示的动作就会越流畅。通常,要避免动作不流畅的'最低是30'。某些计算机视频格式,每秒只能提供15帧。
	FPS”也可以理解为我们常说的“刷新率(单位为Hz)”,例如我们常在CS游戏里说的“FPS值”。我们在装机选购显卡和显示器的时候,都会注意到“刷新率”。一般我们设置缺省刷新率都在75Hz(即75帧/秒)以上。例如:75Hz的刷新率刷也就是指屏幕一秒内只扫描75次,即75帧/秒。而当刷新率太低时我们肉眼都能感觉到屏幕的闪烁,不连贯,对图像显示效果和视觉感观产生不好的影响。
	电影以每秒24张画面的速度播放,也就是一秒钟内在屏幕上连续投射出24张静止画面。有关动画播放速度的单位是fps,其中的f就是英文单词Frame(画面、帧),p就是Per(每),s就是Second(秒)。用中文表达就是多少帧每秒,或每秒多少帧。电影是24fps,通常简称为24帧。

1.7.1 常见媒体的FPS帧率

电影:24fps
电视(PAL):25fps
电视(NTSC):30fps
CRT显示器:75Hz以上
液晶显示器:一般为60Hz

#在游戏过程中一般人能接受的最低FPS约为30Hz,基本流畅等级则需要>60Hz。

1.7 屏幕类型

普屏4:3  320*240 640*480 
宽屏16:9  480*272 640*360 672*378 720*480 1024*600 1280*720 1920*1080 

2 视频点播解决方案

3 视频直播解决方案

3.1 视频直播流程

采集 —>处理—>编码和封装—>推流到服务器—>服务器流分发—>播放器流播放

3.1.1 视频采集:

#音频采集
音频数据既能与图像结合组合成视频数据,也能以纯音频的方式采集播放,后者在很多成熟的应用场景如在线电台和语音电台等起着非常重要的作用。音频的采集过程主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。
音频采集和编码主要面临的挑战在于:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等。

#图像采集
将图像采集的图片结果组合成一组连续播放的动画,即构成视频中可肉眼观看的内容。图像的采集过程主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
图像由于其直观感受最强并且体积也比较大,构成了一个视频内容的主要部分。图像采集和编码面临的主要挑战在于:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等。

#视频采集
视频采集的采集源主要有摄像头采集、屏幕录制和从视频文件推流。

3.1.2 处理

视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。在主播和观众连麦场景中,主播需要和某个或者多个观众进行对话,并将对话结果实时分享给其他所有观众,连麦的处理也有部分工作在推流端完成。
处理环节中分为音频和视频处理,音频处理中具体包含混音、降噪和声音特效等处理,视频处理中包含美颜、水印、以及各种自定义滤镜等处理。

3.2 推流拉流环境搭建

#百度下载srs 
链接:https://pan.baidu.com/s/1vgHCHWZk5jZzZohAkcnIjA 
提取码:qtc9

#安装srs
cd srs-3.0release/
cd trunk/
./configure --full 
make -j 4

#启动
# /usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf
./objs/srs -c ./conf/srs.conf
# 配置文件编辑
[root@iZ2zeagh7rzys1mcssbjm3Z conf]# vim /data/srs-3.0release/trunk/conf/srs.conf

# main config for srs.
# @see full.conf for detail config.

#配置监听端口
listen              1935;
#最大连接数设置
max_connections     1000;
#日志配置
srs_log_tank        file;
srs_log_file        ./objs/srs.log;
http_api {
    enabled         on;
    listen          1985;
}
http_server {
    enabled         on;
    listen          7777;
    dir             ./objs/nginx/html;
}
stats {
    network         0;
    disk            sda sdb xvda xvdb;
}
#vhost __defaultVhost__ {
#}

vhost kn.pcc58.com {
	#配置hls协议
    hls {
    	#是否开启HLS,on:开启 off:关闭,默认是off 
        enabled       on;
        #hls存储方式
        	#disk:把m3u8/ts写到磁盘(默认)
        	#ram:发送m3u8/ts到内存,但是必须使用srs自带的http server进行分发。
       		#both, disk and ram。
        hls_storage     disk;
        #当hls写到磁盘时,指定写入的目录。  
        hls_path      ./objs/nginx/html;
        hls_fragment  10;
        #ts文件的数目:配置hls_window,指定m3u8中保存多少个切片,会自动清理旧的切片
        hls_window    60;
    }
    #http_flv 协议支持
    http_remux {
        enabled     on;
        mount [vhost]/[app]/[stream].flv;
        hstrs  on;
   }
}


3.3 DVR录制

​ SRS支持将RTMP流录制成flv文件

1、参考

https://github.com/ossrs/srs/wiki/v1_CN_DVR

2、录制配置

# main config for srs.
# @see full.conf for detail config.

listen              1935;
max_connections     1000;
srs_log_tank        file;
srs_log_file        ./objs/srs.log;
http_api {
    enabled         on;
    listen          1985;
}
http_server {
    enabled         on;
    listen          7777;
    dir             ./objs/nginx/html;
}
stats {
    network         0;
    disk            sda sdb xvda xvdb;
}
#vhost __defaultVhost__ {
#}

vhost kn.pcc58.com {
    hls{
    	enabled       on;
    	hls_storage     disk;
    	hls_path      ./objs/nginx/html;
    	hls_fragment  5;
    	hls_window    60;
    }
    #dvr 录制文件
    dvr {
        enabled      on;
        #配置文件路径名称
        dvr_path     ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
	    dvr_plan     session;
    }
}

DVR的计划即决定什么时候关闭flv文件,打开新的flv文件,主要的录制计划包括:

配置dvr_plan 参数

  • session:按照session来关闭flv文件,即编码器停止推流时关闭flv,整个session录制为一个flv。
  • segment:按照时间分段录制,flv文件时长配置为dvr_duration和dvr_wait_keyframe。注意:若不按关键帧切flv(即dvr_wait_keyframe配置为off),所以会导致后面的flv启动时会花屏。
  • time_jitter: 时间戳抖动算法。full使用完全的时间戳矫正;zero只是保证从0开始;off不矫正时间戳。

参考conf/dvr.segment.confconf/dvr.session.conf配置实例。

3 直播效果

​ 直播结束后会在服务器生成录播的文件。

示例: 112233.1592379301363.mp4 stream名称:112233 时间拖 mp4后缀

[root@iZ2zeagh7rzys1mcssbjm3Z live]# pwd
/data/srs-3.0release/trunk/objs/nginx/html/live
[root@iZ2zeagh7rzys1mcssbjm3Z live]# ls
'112233.1592379301363.mp4  112233-306.ts  112233-308.ts  112233-310.ts  112233-312.ts  112233-40.ts  112233-42.ts  112233-44.ts  112233-46.ts  112233.m3u8'  123-23.ts  123-25.ts  123-27.ts  123-29.ts  demo.html        livestream_ld.html
112233-305.ts             112233-307.ts  112233-309.ts  112233-311.ts  112233-39.ts   112233-41.ts  112233-43.ts  112233-45.ts  112233-47.ts  123-22.ts    123-24.ts  123-26.ts  123-28.ts  123.m3u8   livestream.html  livestream_sd.html
[root@iZ2zeagh7rzys1mcssbjm3Z live]# 


3.4 鉴权(HTTP回调和服务器定制)

​ SRS不支持服务器脚本(参考:服务器端脚本),服务器端定制有一个重要的替代功能,就是HTTP回调。譬如当客户端连接到SRS时,回调指定的http地址,这样可以实现验证功能。

参考地址:https://github.com/ossrs/srs/wiki/v1_CN_HTTPCallback#config-srs
  • 事件:发生该事件时,即回调指定的HTTP地址。
  • HTTP地址:可以支持多个,以空格分隔,SRS会依次回调这些接口。
  • 数据:SRS将数据POST到HTTP接口。
  • 返回值:SRS要求HTTP服务器返回HTTP200并且response内容为整数错误码(0表示成功),其他错误码会断开客户端连接。
#开启srs,callback 配置
http_hooks {
    enabled         on;
    on_connect      http://127.0.0.1:9005/api/connect;
    #on_publish     http://127.0.0.1:9005/api/pull_token;
}

1、Event列表

事件 数据 说明
on_connect { “action”: “on_connect”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “tcUrl”: “rtmp://x/x?key=xxx”, “pageUrl”: “http://x/x.html” } 当客户端连接到指定的vhost和app时
on_close { “action”: “on_close”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live” } 当客户端关闭连接,或者SRS主动关闭连接时
on_publish { “action”: “on_publish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” } 当客户端发布流时,譬如flash/FMLE方式推流到服务器
on_unpublish { “action”: “on_unpublish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” } 当客户端停止发布流时
on_play { “action”: “on_play”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” } 当客户端开始播放流时
on_stop { “action”: “on_stop”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “live”, “stream”: “livestream” } 当客户端停止播放时。备注:停止播放可能不会关闭连接,还能再继续播放。

2、鉴权服务

java示例代码:鉴权成功条件 httpcode 200 and 响应0

@PostMapping("/api/connect")
public int login(@RequestBody PushVo pushVo) {
    System.out.println("================");
    System.out.println(pushVo);
    //rtmp://kn.pcc58.com:1935/live?token=123213xxxxxtojke
    String token = pushVo.getTcUrl().split("?")[1];
    //token验证
    System.out.println("=========end=======");
    return 0;
}

3.5 http接口

参考文献:https://github.com/ossrs/srs/wiki/v1_CN_HTTPApi

​ SRS提供HTTP接口,供外部程序管理服务器,并支持跨域(js可以直接控制和获取服务器的各种信息)。

SRS的HTTP接口遵循最简单原则,主要包括:

  • 只提供json数据格式接口,要求请求和响应的数据全都是json。
  • 不提供html数据,譬如运行SRS后,浏览器打开HTTP接口或HTTP服务地址,看到的是json,不是html。
配置文件需要开启http-api:
# http-api.conf
listen              1935;
http_api {
    enabled         on;
    listen          1985;
}
vhost __defaultVhost__ {
}
访问api:浏览器打开地址http://127.0.0.1:1985/api/v1
{
	"code": 0,
	"server": 21063,
	"urls": {
		"versions": "the version of SRS",
		"summaries": "the summary(pid, argv, pwd, cpu, mem) of SRS",
		"rusages": "the rusage of SRS",
		"self_proc_stats": "the self process stats",
		"system_proc_stats": "the system process stats",
		"meminfos": "the meminfo of system",
		"authors": "the license, copyright, authors and contributors",
		"features": "the supported features of SRS",
		"requests": "the request itself, for http debug",
		"vhosts": "manage all vhosts or specified vhost",
		"streams": "manage all streams or specified stream",
		"clients": "manage all clients or specified client, default query top 10 clients",
		"raw": "raw api for srs, support CUID srs for instance the config",
		"clusters": "origin cluster server API"
	},
	"tests": {
		"requests": "show the request info",
		"errors": "always return an error 100",
		"redirects": "always redirect to /api/v1/test/errors",
		"[vhost]": "http vhost for http://error.srs.com:1985/api/v1/tests/errors"
	}
}
访问api:浏览器打开地址http://127.0.0.1:1985/api/v1/clients/

4 ffmpeg集成

4.1 ffmpeg简介

	FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"[1]  FFmpeg编码库可以使用GPU加速

FFmpeg有非常强大的功能 ,包括'视频采集功能、视频格式转换、视频抓图、给视频加水印'等。ffmpeg是用来转换不同格式的多媒体文件的一个命令行工具。


# 参考官方:http://ffmpeg.org/ffmpeg.html

4.2 ffmpeg 环境搭建

1 、下载

#官方下载
https://johnvansickle.com/ffmpeg/
#百度云盘下载
链接:https://pan.baidu.com/s/1BTuSYa_k_O9BEzYINUsMDw 
提取码:ng5o 
复制这段内容后打开百度网盘手机App,操作更方便哦

2、解压后使用

tar -xvf ffmpeg-release-amd64-static.tar.xz

4.3 ffmpeg命令使用

命令格式:

#命令格式:
    ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
    ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
    
    
    

通用选项

-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的。。。
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高质量设置
-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

视频选项

-b bitrate 设置比特率,缺省200kb/s

-r fps 设置帧频 缺省25

-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576

-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-croptop size 设置顶部切除带大小 像素单位

-cropbottom size –cropleft size –cropright size

-padtop size 设置顶部补齐的大小 像素单位

-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)

-vn 不做视频记录

-bt tolerance 设置视频码率容忍度kbit/s

-maxrate bitrate设置最大视频码率容忍度

-minrate bitreate 设置最小视频码率容忍度

-bufsize size 设置码率控制缓冲区大小

-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。

-sameq 使用同样视频质量作为源(VBR)

-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率

-passlogfile file 选择两遍的纪录文件名为file

高级选项

-g gop_size 设置图像组大小

-intra 仅适用帧内编码

-qscale q 使用固定的视频量化标度(VBR)

-qmin q 最小视频量化标度(VBR)

-qmax q 最大视频量化标度(VBR)

-qdiff q 量化标度间最大偏差 (VBR)

-qblur blur 视频量化标度柔化(VBR)

-qcomp compression 视频量化标度压缩(VBR)

-rc_init_cplx complexity 一遍编码的初始复杂度

-b_qfactor factor 在p和b帧间的qp因子

-i_qfactor factor 在p和i帧间的qp因子

-b_qoffset offset 在p和b帧间的qp偏差

-i_qoffset offset 在p和i帧间的qp偏差

-rc_eq equation 设置码率控制方程 默认tex^qComp

-rc_override override 特定间隔下的速率控制重载

-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full

-dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC

-idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM

-er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE

-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)

-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4

-mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD

-4mv 使用4个运动矢量 仅用于mpeg4

-part 使用数据划分 仅用于mpeg4

-bug param 绕过没有被自动监测到编码器的问题

-strict strictness 跟标准的严格性

-aic 使能高级帧内编码 h263+

-umv 使能无限运动矢量 h263+

-deinterlace 不采用交织方法

-interlace 强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大

-psnr 计算压缩帧的psnr

-vstats 输出视频编码统计到vstats_hhmmss.log

-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开

音频选项

-ab bitrate 设置音频码率

-ar freq 设置音频采样率

-ac channels 设置通道 缺省为1

-an 不使能音频纪录

-acodec codec 使用codec编解码

音视频捕获选项

-vd device 设置视频捕获设备。比如/dev/video0

-vc channel 设置视频捕获通道 DV1394专用

-tvstd standard 设置电视标准 NTSC PAL(SECAM)

-dv1394 设置DV1394捕获

-av device 设置音频设备 比如/dev/dsp

高级选项

-map file:stream 设置输入流映射

-debug 打印特定调试信息

-benchmark 为基准测试加入时间

-hex 倾倒每一个输入包

-bitexact 仅使用位精确算法 用于编解码测试

-ps size 设置包大小,以bits为单位

-re 以本地帧频读数据,主要用于模拟捕获设备

-loop 循环输入流。只工作于图像流,用于ffserver测试

实例:

未测试demo

https://www.jianshu.com/p/749cf4ef073a

1 获取视频信息
ffmpeg -i video.MP4
2.将图片序列合成视频
./ffmpeg -f image2 -i image%d.jpg test.mp4
3 将视频分解成图片序列
./ffmpeg -i test.mp4 image%d.jpg

#设置标题 备注
./ffmpeg -i test.mp4 -metadata title=我是标题 -y aaa.mp4
./ffmpeg -i test.mp4 -metadata comment=我是备注 -y aaa.mp4
#设置分辨率
./ffmpeg -i input.mp4 -vf scale=1080:1920 output.mp4

# 未完待续

5 srs 集群与转码

5.1 Forward小型集群

#官方参考
# https://github.com/ossrs/srs/wiki/v1_CN_Forward

5.1.1 簡介

srs定位为直播服务器,其中一项重要的功能是forward,即将服务器的流转发到其他服务器。

备注:SRS的边缘RTMP参考Edge,支持访问时回源,为大规模并发提供最佳解决方案。

注意:edge可以从源站拉流,也可以将流转发给源站。也就是说,播放edge上的流时,edge会回源拉流;推流到edge上时,edge会直接将流转发给源站。

注意:若只需要中转流给源站,不必用forward,直接使用edge模式即可。可以直接支持推流和拉流的中转,简单快捷。Forward应用于目标服务器是多个,譬如将一路流主动送给多路服务器;edge虽然配置了多台服务器,但是只用了一台,有故障时才切换。

#注意:优先使用edge,除非知道必须用forward,才使用forward。

forward本身是用做热备,即用户推一路流上来,可以被SRS转发(或者转码后转发)到多个slave源站,CDN边缘可以回多个slave源,实现故障热备的功能,构建强容错系统。

5.1.2 原理

 Forward适合搭建小型集群,为什么这么说呢?因为每个slave节点都和master节点有相同数量的直播流
 
  编码器推流给master,那么master就会Forward到每一个Slave。那么在slave节点上不论需不需要都会有master过来的流。试想一下,如果编码器的数量为10,那么master到slave之间的带宽就是:带宽=10 * slave的个数 *直播流码率,随着slave的增多,master的出口带宽会不断提高。而现实是,在某些slave节点其实根本没有人看……这样就造成了master到slave之间的带宽浪费
    -#所以说Forward适合与搭建小型集群。那么大集群怎么破?----使用edge功能
    
    
    为了和edge方式区分,forward定义一次词汇如下:

master:主服务器,编码器推流到这个服务器,或者用ingest流到服务器。总之,master就是主服务器,负责转发流给其他服务器。
slave:从服务器,主服务器转发流到这个服务器。
如果结合edge集群方式,一般而言master和slave都是origin(源站服务器),edge边缘服务器可以从master或者slave回源取流。

实际上master和slave也可以是edge,但是不推荐,这种组合方式太多了,测试没有办法覆盖到。因此,强烈建议简化服务器的结构,只有origin(源站服务器)才配置转发,edge(边缘服务器)只做边缘。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://gitee.com/kfd-bigdata/oss/blob/master/image/srs_forward.jpg

5.1.3 配置

  vhost __defaultVhost__ {
  	forward {
        enabled on;
        #slave ip 端口
        destination 172.17.236.196:1935;
    }
  }

5.2 Edge边缘服务器集群

5.2.1 edge简介

	SRS的Edge提供访问时回源机制,在CDN/VDN等流众多的应用场景中有重大意义, forward/ingest方案会造成大量带宽浪费。同时,SRS的Edge能对接所有的RTMP源站服务器, 不像FMS的Edge只能对接FMS源站(有私有协议);另外,SRS的Edge支持SRS源站的所有逻辑 (譬如转码,转发,HLS,DVR等等),也就是说可以选择在源站切片HLS,也可以直接在 边缘切片HLS。
#备注:Edge一般负载高,SRS支持的并发足够跑满千兆网带宽了。

	所谓边缘edge服务器,就是边缘直播缓存服务器,配置时指定为remote模式和origin(指定一 个或多个源站IP),这个边缘edge服务器就是源站的缓存了。

当用户推流到边缘服务器时,边缘直接将流转发给源站。譬如源站在北京BGP机房,湖南有个 电信ADSL用户要推流发布自己的直播流,要是直接推流到北京BGP可能效果不是很好,可以在 湖南电信机房部署一个边缘,用户推流到湖南边缘,边缘转发给北京源站BGP。

当用户播放边缘服务器的流时,边缘服务器看有没有缓存,若缓存了就直接将流发给客户端。 若没有缓存,则发起一路回源链接,从源站取数据源源不断放到自己的缓存队列。也就是说, 多个客户端连接到边缘时,只有一路回源。这种结构在CDN是最典型的部署结构。譬如北京源站, 在全国32个省每个省都部署了10台服务器,一共就有320台边缘,假设每个省1台边缘服务器都有 2000用户观看,那么就有64万用户,每秒钟集群发送640Gbps数据;而回源链接只有320个, 实现了大规模分发。

边缘edge服务器,实际上是解决大并发问题产生的分布式集群结构。SRS的边缘可以指定多个源站, 在源站出现故障时会自动切换到下一个源站,不影响用户观看,具有最佳的容错性,用户完全不会觉察。

5.2.2 Edge的主要应用场景:

CDN/VDN大规模集群,客户众多流众多需要按需回源。
小规模集群,但是流比较多,需要按需回源。
骨干带宽低,边缘服务器强悍,可以使用多层edge,降低上层BGP带宽。
注意:edge可以从源站拉流,也可以将流转发给源站。也就是说,播放edge上的流时,edge会 回源拉流;推流到edge上时,edge会直接将流转发给源站。

#注意:若只需要中转流给源站,不必用forward,直接使用edge模式即可。可以直接支持推流 和拉流的中转,简单快捷。Forward应用于目标服务器是多个,譬如将一路流主动送给多路服务 器;edge虽然配置了多台服务器,但是只用了一台,有故障时才切换。

注意:优先使用edge,除非知道必须用forward,才使用forward。

5.2.3 配置

vhost __defaultVhost__ {
    # the mode of vhost, local or remote.
    #       local: vhost is origin vhost, which provides stream source.
    #       remote: vhost is edge vhost, which pull/push to origin.
    # default: local
    mode            remote;
    # for edge(remote mode), user must specifies the origin server
    # format as: <server_name|ip>[:port]
    # @remark user can specifies multiple origin for error backup, by space,
    # for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935
    #可配置多个源站,在故障时会切换到下一个源站。
    origin          127.0.0.1:1935 localhost:1935;
    # for edge, whether open the token traverse mode,
    # if token traverse on, all connections of edge will forward to origin to check(auth),
    # it's very important for the edge to do the token auth.
    # the better way is use http callback to do the token auth by the edge,
    # but if user prefer origin check(auth), the token_traverse if better solution.
    # default: off
    token_traverse  off;
}


#注:在SRS中还有另外一种集群方式,edge方式。注意两种方式的用词不同。
    在Forward模式中,中心节点叫Master,边缘节点叫Slave;在edge模式中,中心节点叫origin(源站),边缘节点叫做edge。

5.3 ffmpeg转码

#官方参考:https://github.com/ossrs/srs/wiki/v3_CN_FFMPEG

5.3.1 应用场景

FFMPEG的重要应用场景包括:

  • 推送一路高码率,转多路输出。譬如:游戏直播中,推送一路1080p流到SRS,SRS可以转码输出1080p/720p/576p多路,低码率可以给移动设备观看。这样节省了推流带宽(一般源站为BGP带宽,很贵),也减轻了客户端压力(譬如客户端边玩游戏边直播)。

  • 支持多屏输出。譬如:网页推流(主播)编码为vp6/mp3或speex,推流到SRS后无法支持HLS(要求h264+aac),可以转码成h264+aac后切片成HLS或者推送到其他服务器再分发。

  • 加水印。适用于需要对流进行加水印的情况,譬如打上自己的logo。SRS支持文字水印和图片水印,也可以支持视频作为水印,或者将两路流叠加(参考ffmpeg的用法)。

  • 截图:参考使用Transcoder截图

  • 其他滤镜:SRS支持所有ffmpeg的滤镜。

5.3.2 SRS转码的主要流程包括

  1. 编码器推送RTMP流到SRS的vhost。
  2. SRS的vhost若配置了转码,则进行转码。
  3. 转码后,按照配置,推送到SRS本身或者其他RTMP服务器。

5.3.3 ffmpeg配置:

vhost kn.pcc58.com {
...
    transcode {
        enabled     on;
        ffmpeg      ./objs/ffmpeg/ffmpeg;
        engine ff {
            enabled         on;
            vcodec          libx264;
            acodec          aac;
            vfps            25;
            vwidth          300;
            # video height, must be even numbers.
            vheight         3320;
            vthreads        4;
            vprofile        main;
            vpreset         medium;
        #                                     vthreads        12;
            aparams {
            }
            output          rtmp://xxx.xxx.236.196:[port]/[app]?vhost=__defaultVhost__/[stream]_[engine];
        }
    }
}

RS的转码参数全是FFMPEG的参数,有些参数SRS做了自定义,见下表。

SRS参数 FFMPEG参数 实例 说明
vcodec vcodec ffmpeg … -vcodec libx264 … 指定视频编码器
vbitrate b:v ffmpeg … -b:v 500000 … 输出的视频码率
vfps r ffmpeg … -r 25 … 输出的视频帧率
vwidth/vheight s ffmpeg … -s 400x300 -aspect 400:300 … 输出的视频宽度x高度,以及宽高比
vthreads threads ffmpeg … -threads 8 … 编码线程数
vprofile profile:v ffmpeg … -profile:v high … 编码x264的profile
vpreset preset ffmpeg … -preset medium … 编码x264的preset
acodec acodec ffmpeg … -acodec libaacplus … 音频编码器
abitrate b:a ffmpeg … -b:a 70000 … 音频输出码率。libaacplus:16-72k
asample_rate ar ffmpeg … -ar 44100 … 音频采样率
achannels ac ffmpeg … -ac 2 … 音频声道

Other Transcode Config

conf/full.conf中有很多FFMPEG转码配置的实例,也可以参考ffmpeg的命令行。

  • mirror.transcode.srs.com 将视频流上半截,翻转到下半截,看起来像个镜子。
  • drawtext.transcode.srs.com 加文字水印。
  • crop.transcode.srs.com 剪裁视频。
  • logo.transcode.srs.com 添加图片logo。
  • audio.transcode.srs.com 只对音频转码。
  • copy.transcode.srs.com 不转码只转封装,类似于SRS的Forward。
  • all.transcode.srs.com 转码参数的详细说明。
  • ffempty.transcode.srs.com 一个ffmpeg的mock,不转码只打印参数。
  • app.transcode.srs.com 对指定的app的流转码。
  • stream.transcode.srs.com 对指定的流转码。
  • vn.transcode.srs.com 只输出音频,禁止视频输出。

6 终端设备播放

#hls 綫上演示地址
http://106.13.72.138/video_hls/index.html
#rtmp 綫上演示地址
http://106.13.72.138/video_rtmp/index.html
#flv 綫上演示地址
http://106.13.72.138/video_flv/index.html

#h5 demo百度云下載地址
链接:https://pan.baidu.com/s/1OIqvnacrAD9gyz2PyuWUnw 
提取码:s666 
复制这段内容后打开百度网盘手机App,操作更方便哦

7 调试相关工具

5.1 推流测试工具:OBS

#obs 百度云下載鏈接
链接:https://pan.baidu.com/s/1_NL7EL0BIIlrGikqlT3cdg 
提取码:n480 
复制这段内容后打开百度网盘手机App,操作更方便哦

5.2 拉流测试工具

1、SRS 在线调试:http://ossrs.net/srs.release/trunk/research/players/srs_player.html
2、VLC

5.3 h5开源:B站开源的flv.js ,vidio.js

5.4 音视频查看工具,MediaInfo_GUI_20

#官网下载地址
https://mediaarea.net/download/binary/mediainfo-gui/20.03/MediaInfo_GUI_20.03_Windows.exe
#百度云盘下载地址
链接:https://pan.baidu.com/s/1Zcq4fOkYY18nTwrOsi7RYQ 
提取码:5pmr

#硬件编码

https://www.cnblogs.com/qihangzj/p/11562350.html

rtmp://cshop.pbphkj.com:1935/live/wwww_ff

8 参考:官方

# 参考srs官方:https://github.com/ossrs/srs/wiki/v1_CN_Home
# 参考ffmpeg官方:http://ffmpeg.org/ffmpeg.html

#参考srs官方教程:https://github.com/ossrs/srs/wiki/v1_CN_Docs


https://recomm.cnblogs.com/blogpost/11970135

9 直播会议解决方案(未完待续)

、熟悉Janus、MediaSoup等开源服务;

了解学习重点用

本章将介绍几种多方通信的架构模型,以及比较有名的开源项目的优劣情况,并传授大家如何选择出最适自己或适合团队的开源项目。

  • 12-1 多人互动架构方案
  • 12-2 Mesh架构模型详解
  • 12-3 MCU架构模型详解
  • 12-4 SFU架构模型详解
  • 12-5 Licode流媒体服务器架构和特点
  • 12-6 Janus流媒体服务器的架构及特点
  • 12-7 Medooze流媒体服务器架构及特点
  • 12-8 Mediasoup流媒体服务器架构及特点

Janus:

#官网:
https://janus.conf.meetecho.com/
#github地址
https://github.com/meetecho/janus-gateway

安装:


#1 依赖安装
yum install -y libmicrohttpd-devel jansson-devel \
   openssl-devel sofia-sip-devel glib2-devel \
   opus-devel libogg-devel libcurl-devel pkgconfig gengetopt \
   libconfig-devel libtool autoconf automake
   
   #-- yum install  libsrtp-devel
   
#2 依赖安装
yum -y install python3 python3-pip ninja-build
yum -y install git
   
#3 meson安装 https://github.com/mesonbuild/meson
wget https://github.com/mesonbuild/meson/releases/download/0.55.0/meson-0.55.0.tar.gz
tar xvf meson-0.55.0.tar.gz
chmod -R 777 meson-0.55.0
cd meson-0.55.0/
./setup.py install
meson -v

#4 libnice安装
git  clone https://gitlab.freedesktop.org/libnice/libnice.git
meson --prefix=/usr build && ninja -C build && sudo ninja -C build install

#yum install -y libcurl  libcurl-devel apr-devel  cyrus-sasl*  apr-util-devel  zlib* python-devel libevent


 #libsrtp-2.2.0 
 4699  root 2020/07/22 09:10:04 wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
 4700  root 2020/07/22 09:10:23 tar xfv v2.2.0.tar.gz
 4701  root 2020/07/22 09:10:28 cd libsrtp-2.2.0
 4702  root 2020/07/22 09:10:34 ./configure --prefix=/usr --enable-openssl --libdir=/usr/lib64
 4703  root 2020/07/22 09:10:42 make shared_library && sudo make install



 python3 -m pip install meson
 python3 -m pip install ninja




 4688  root 2020/07/22 09:02:31 git  clone https://gitlab.freedesktop.org/libnice/libnice.git

meson --prefix=/usr build && ninja -C build && sudo ninja -C build install

#janus-gateway安装
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway
./autogen.sh
./configure --prefix=/opt/janus
make 
make install 
make configs


/opt/janus/bin/janus -F /opt/janus/etc/janus/