自研直播系统-直播系统实战
文章目录
- 1 流媒体基础
- 本文教程下载地址
- 1.1 流媒体
- 1.2 流式传输方式
- 1.2.1 顺序流式传输
- 1.2.2 实时流式传输
- 1.3 流媒体传输协议
- 1.3.1 rtmp协议
- 1.3.2 HLS协议
- 1.3.3 RTSP协议
- 1.3.4 视频流的对比
- 1.4 视频编码(codec)
- 1.5 分辨率的规范
- 分辨率簡介:
- 1.5.2 分辨率單位
- 1.6 码率
- 1.7 针速率 FPS
- 1.7.1 常见媒体的FPS帧率
- 1.7 屏幕类型
- 2 视频点播解决方案
- 3 视频直播解决方案
- 3.1 视频直播流程
- 3.1.1 视频采集:
- 3.1.2 处理
- 3.2 推流拉流环境搭建
- 3.3 DVR录制
- 3.4 鉴权(HTTP回调和服务器定制)
- 3.5 http接口
- 4 ffmpeg集成
- 4.1 ffmpeg简介
- 4.2 ffmpeg 环境搭建
- 4.3 ffmpeg命令使用
- 通用选项
- 视频选项
- 高级选项
- 音频选项
- 音视频捕获选项
- 高级选项
- 实例:
- 未测试demo
- 5 srs 集群与转码
- 5.1 Forward小型集群
- 5.1.1 簡介
- 5.1.2 原理
- 5.1.3 配置
- 5.2 Edge边缘服务器集群
- 5.2.1 edge简介
- 5.2.2 Edge的主要应用场景:
- 5.2.3 配置
- 5.3 ffmpeg转码
- 5.3.1 应用场景
- 5.3.2 SRS转码的主要流程包括
- 5.3.3 ffmpeg配置:
- Other Transcode Config
- 6 终端设备播放
- 7 调试相关工具
- 5.1 推流测试工具:OBS
- 5.2 拉流测试工具
- 5.3 h5开源:B站开源的flv.js ,vidio.js
- 5.4 音视频查看工具,MediaInfo_GUI_20
- 8 参考:官方
- 9 直播会议解决方案(未完待续)
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/AC3HLS的工作方式是:将视频拆分成若干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,7680x43204K: 4K分辨率是1080p的4倍 3840×2160 = 1920×2×1080×28K: 8K分辨率是4K的4倍 7680×4320 = 3840×2×2160×2ps: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.conf和conf/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=123213xxxxxtojkeString 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: localmode 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: offtoken_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转码的主要流程包括
- 编码器推送RTMP流到SRS的vhost。
- SRS的vhost若配置了转码,则进行转码。
- 转码后,按照配置,推送到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_Docshttps://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.gz4700 root 2020/07/22 09:10:23 tar xfv v2.2.0.tar.gz4701 root 2020/07/22 09:10:28 cd libsrtp-2.2.04702 root 2020/07/22 09:10:34 ./configure --prefix=/usr --enable-openssl --libdir=/usr/lib644703 root 2020/07/22 09:10:42 make shared_library && sudo make installpython3 -m pip install mesonpython3 -m pip install ninja4688 root 2020/07/22 09:02:31 git clone https://gitlab.freedesktop.org/libnice/libnice.gitmeson --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/相关文章:
自研直播系统-直播系统实战
文章目录 1 流媒体基础本文教程下载地址1.1 流媒体1.2 流式传输方式1.2.1 顺序流式传输1.2.2 实时流式传输 1.3 流媒体传输协议1.3.1 rtmp协议1.3.2 HLS协议1.3.3 RTSP协议1.3.4 视频流的对比 1.4 视频编码(codec)1.5 分辨率的规范分辨率簡介:1.5.2 分辨率單位 1.6 …...
python数据分析入门学习笔记
目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它是编译过程中的一个阶段,它在编译器进行实际编译之前对源代码进行处理。预处理器提供了一系列的指令,用于条件编译、文件包含、宏定义等操作。以下是一些常见的预处理器指令: 宏定义ÿ…...
MySQL—创建查看删除备份恢复数据库
创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…...
1.4 ROS2集成开发环境搭建
1.4.1 安装VSCode VSCode全称Visual Studio Code,是微软推出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性,支持插件…...
数组和对象在内存中的区别
一、内存分配方式 数组在内存中是一段连续的存储空间,每个元素占据一个位置,这种连续存储方式使得数组的访问速度更快。对象在内存中是以键值对的形式存储的,每个键值对都需要单独的内存空间,这种非连续的存储方式可能会导致访问…...
智能胎教仪,科技与教育的融合-N9301胎教仪语音方案
随着科学技术的不断进步,人们对婴幼儿教育的认知也日趋成熟和全面。其中,胎教作为一种重要的早期教育方式,近年来备受瞩目。而胎教仪语音芯片的研发,正是为了满足这一需求,为胎儿的健康成长提供更加便捷的胎教方案。 一…...
代码随想录2链表
2 移除元素 Leetcode203 设置虚拟头节点 dummyHead...
Java8新特性常见用法
Java8新特性 示例类Stream API 使用示例forEach:遍历Stream:创建流map:转换元素filter:过滤元素collect(收集元素) 和 Collectors(分组、连接)sorted 和 comparing(搭配排序)toMap:转换Map元素collectingAndThen:过滤掉相同数据toUpperCase:转大写distinct:去重c…...
Web3 前端攻击:原因、影响及经验教训
DeFi的崛起引领了一个创新和金融自由的新时代。然而,这种快速增长也吸引了恶意行为者的注意,他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上,但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…...
C++ 如何解决回调地狱问题
“地狱回调”(Callback Hell)是指在编程中使用过多嵌套回调函数,导致代码难以阅读和维护。C 提供了多种方法来解决这个问题,包括以下几种常见的方法: 使用 Lambda 表达式和标准库的 std::function使用 std::future 和…...
普利姆最小生成树算法 c++
普里姆(Prim)算法是一种用于在加权连通无向图中查找最小生成树(MST, Minimum Spanning Tree)的贪心算法。最小生成树是一个子图,它包括图中的所有顶点,并且边的总权重最小。该算法的基本思想是从一个顶点开始,逐步扩展生成树,直到包括所有顶点。 算法步骤 初始化: 从…...
Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
一、前言 线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。 本文从“术”层面&#…...
ubuntu 23 连接正点imx6ull的uboot网络设置(nfs和tftp)
由于使用ubuntu23,无法连接正点的imx6ull的uboot,因为这个uboot里面的nfs是v2,ubuntu23内核是6.5不支持uboot v2。配置/etc/default/nfs-kernel-server sudo vim /etc/default/nfs-kernel-server 更改以下参数: RPCNFSDCOUNT"…...
CC6利用链分析
CC1的两条利用链,在JDK 8u71之后已修复,不可利用。 学一下不受版本限制的CC6利用链 分析版本 Commons Collections 3.2.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 我的Github主页Java反序列化学习同步更新,有简单…...
多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步和并发问题。
多线程编程在现代计算机系统中非常重要,因为它能够使程序同时执行多个操作,提高计算效率。以下是多线程编程的基本概念及如何在C标准库中使用std::thread和std::async进行多线程编程,同时处理线程同步和并发问题。 多线程编程的基本概念 线程…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
