关于做ppt的网站,那家网站建设好,海口发布微信公众号,竞价托管运营哪家好文章目录 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 分辨率的规范分辨率簡介#xff1a;1.5.2 分辨率單位 1.6 … 文章目录 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 针速率 FPS1.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命令使用通用选项视频选项高级选项音频选项音视频捕获选项高级选项实例 未测试demo5 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 推流测试工具OBS5.2 拉流测试工具5.3 h5开源B站开源的flv.js ,vidio.js5.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.同步的多重数据类型综合设计文件SWFreal flash和shockwavc flash动面文件RPM: HTMI。文件的插件[RAM](https://baike.baidu.com/item/RAM/144481):流媒体的源文件是包含RA、RM、SMIIJ文件地址URL地址的文本文件CSF:一种类似媒体容器的文件格式可以将非常多的媒体格式包含在其中而不仅仅限于音、视频。quicktimemovasf[wmv](https://baike.baidu.com/item/wmv/1195900)wmaavimpegmpgdatmts 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协议
RTMPReal Time Messaging Protocol是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。它有三种变种
1工作在TCP之上的明文协议使用端口1935
2RTMPT封装在HTTP请求之中可穿越防火墙
3RTMPS类似RTMPT但使用的是HTTPS连接。
RTMP视频播放的特点
1RTMP协议是采用实时的流式传输所以不会缓存文件到客户端这种特性说明用户想下载RTMP协议下的视频是比较难的
2视频流可以随便拖动既可以从任意时间点向服务器发送请求进行播放并不需要视频有关键帧。相比而言HTTP协议下视频需要有关键帧才可以随意拖动。
3RTMP协议支持点播/回放通俗点将就是支持把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协议
RTSPReal Time Streaming Protocol实时流传送协议是用来控制声音或影像的多媒体串流协议, 由RealNetworks和Netscape共同提出的1.3.4 视频流的对比
协议httpflvrtmphlsdash传输方式http流tcp流httphttp视频封装格式flvflv tagTs文件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 为代表的新一代编码器下面是一些常见的视频编码器
1H.264/AVC
2HEVC/H.265
3VP8
4VP9
5FFmpeg
注音频编码器有Mp3, AAC等。视频和音频都需要经过编码才能保存成文件。不同的编码格式CODEC有不同的压缩率会导致文件大小和清晰度的差异。
常用的视频编码格式如下。
H.262
H.264
H.265
#以上编码格式都是有版权的但是可以免费使用#还有几种无版权的视频编码格式。
VP8
VP9
AV1音频编码
常用的音频编码格式
MP3
AAC1.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×2psPprogressive意思是逐行扫描帧编码Iinterlace意思是隔行扫描场编码#两者是视频编码里的编码方式分辨率一样美国消费电子协会CEA将4K的分辨率正式命名为Ultra HDUltra 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 819Kbps1.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
电视PAL25fps
电视NTSC30fps
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 等格式的数据分发出去。常见的音频压缩格式有MP3AACHE-AACOpusFLACVorbis (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# 配置文件编辑
[rootiZ2zeagh7rzys1mcssbjm3Z 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 {#是否开启HLSon开启 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_DVR2、录制配置
# 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后缀
[rootiZ2zeagh7rzys1mcssbjm3Z live]# pwd
/data/srs-3.0release/trunk/objs/nginx/html/live
[rootiZ2zeagh7rzys1mcssbjm3Z 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
[rootiZ2zeagh7rzys1mcssbjm3Z 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表示成功其他错误码会断开客户端连接。
#开启srscallback 配置
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?keyxxx”, “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?token123213xxxxxtojkeString 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.html4.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.xz4.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 (defaultenabled) 2 FF_EC_DEBLOCK (defaultenabled)-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 scale1080: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源站的所有逻辑 譬如转码转发HLSDVR等等也就是说可以选择在源站切片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),# its 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_FFMPEG5.3.1 应用场景
FFMPEG的重要应用场景包括 推送一路高码率转多路输出。譬如游戏直播中推送一路1080p流到SRSSRS可以转码输出1080p/720p/576p多路低码率可以给移动设备观看。这样节省了推流带宽一般源站为BGP带宽很贵也减轻了客户端压力譬如客户端边玩游戏边直播。 支持多屏输出。譬如网页推流主播编码为vp6/mp3或speex推流到SRS后无法支持HLS要求h264aac可以转码成h264aac后切片成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参数实例说明vcodecvcodecffmpeg … -vcodec libx264 …指定视频编码器vbitrateb:vffmpeg … -b:v 500000 …输出的视频码率vfpsrffmpeg … -r 25 …输出的视频帧率vwidth/vheightsffmpeg … -s 400x300 -aspect 400:300 …输出的视频宽度x高度以及宽高比vthreadsthreadsffmpeg … -threads 8 …编码线程数vprofileprofile:vffmpeg … -profile:v high …编码x264的profilevpresetpresetffmpeg … -preset medium …编码x264的presetacodecacodecffmpeg … -acodec libaacplus …音频编码器abitrateb:affmpeg … -b:a 70000 …音频输出码率。libaacplus16-72kasample_ratearffmpeg … -ar 44100 …音频采样率achannelsacffmpeg … -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、VLC5.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/119701359 直播会议解决方案(未完待续)
、熟悉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/