一、怎么做到直播秒开优化?
- DNS 解析慢 为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析, 并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时。 如果要支持用 IP 地址播放,是需要修改底层 ffmpeg 源码的。
- 播放器缓冲 很多侧重点播的播放器,为了减少卡顿,会有一些缓冲策略,当缓冲足够多的数据之后 ,再送入解码播放。而为了加快首开效果,需要对播放的缓冲策略做一些调整,
- 播放参数设置。所有基于 ffmpeg 的播放器,都会遇到avformat_find_stream_info这个函数耗时比较久, 从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据, 来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长, 一个是 probesize,一个是 analyzeduration。减少 probesize 和 analyzeduration 可以有效地减少avformat_find_stream_info的函数耗时, 从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败, 或者出现只有音频没有视频,只有视频没有音频的问题。
- 服务器关键帧缓冲
优化服务器策略 播放器接入服务器请求数据的时间点的视频不一定是关键帧,那么需要等到下一个关键帧的到来,如果关键帧的周期是 2s 的话,那么等待的时间可能会在 0~2s 的范围内,这段等待的时间会影响首屏的加载时间。如果服务器有缓存,则播放端在接入的时候,服务器可以向前找最近的关键帧发给播放端,这样就可以省去等待的时间,可以大大的减少首屏的加载时间。
衡量图像重建的质量
- SNR(信噪比)
- PSNR(峰值信噪比)=10*log10((2^n-1)^2/MSE) (MSE是原图像与处理图像之间均方误差,所以计算PSNR需要2幅图像的数据!)
- SSIM (结构相似性,是一种衡量两幅图像相似度的指标,分别从亮度、对比度、结构3方面度量图像的相似性
QoE指标
视频质量
rebuffer的次数
平滑切换
FFmpeg库
- FFmpeg:是一个跨平台的开源视频框架,多媒体视频处理工具,能实现如视频编码、解码、转码、串流、播放、视频采集功能、截图、给视频加水印等丰富的功能。其支持的视频格式以及播放协议非常丰富,几乎包含了所有音视频编解码、封装格式以及播放协议。
- -Libswresample:可以对音频进行重采样,rematrixing 以及转换采样格式等操 作。
- -Libavcodec:提供了一个通用的编解码框架,包含了许多视频,音频,字幕流 等编码/解码器。
- -Libavformat:用于对视频进行封装/解封装。
- -Libavutil:包含一些共用的函数,如随机数生成,数据结构,数学运算等。
- -Libpostproc:用于进行视频的一些后期处理。
- -Libswscale:用于视频图像缩放,颜色空间转换等。
- -Libavfilter:提供滤镜功能。
帧率 码率 分辨率
- 码率:图片进行压缩后每秒显示的数据量。
- 帧率:每秒显示的图片数。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。
- 分辨率:是指显示的像素个数,通常表示形式为长宽,单位为像素(px),如640480,同样尺寸的显示器,其分辨率越高,图像越清晰。
I帧、P帧和B帧
- P帧:(差别帧)保留这一帧跟之前帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(P帧没有完整画面数据,只有与前一帧的画面差别的数据)
- B帧:(双向差别帧)保留的是本帧与前后帧的差别,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累
逐行扫描与隔行扫描
每一帧图像由电子束顺序地一行接着一行连续扫描而成,这种扫描方式称为逐行扫描。把每一帧图像通过两场扫描完成则是隔行扫描,两场扫描中,第一场(奇数场)只扫描奇数行,依次扫描1、3、5…行,而第二场(偶数场)只扫描偶数行,依次扫描2、4、6…行。隔行扫描技术在传送信号带宽不够的情况下起了很大作用,逐行扫描和隔行扫描的显示效果主要区别在稳定性上面,隔行扫描的行间闪烁比较明显,逐行扫描克服了隔行扫描的缺点,画面平滑自然无闪烁。在电视的标准显示模式中,i表示隔行扫描,p表示逐行扫描。
YUYV格式(YUV4:2:2)
YUV是指亮度参量和色度参量分开表示的像素格式,其中“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV码流的存储格式与其采样方式有密切的关系,主流的采样方式有三种:YUV4:4:4、YUV4:2:2、YUV4:2:0。
下面三个图比较直观的显示了三种采样方式。其中黑点表示采样像素点的Y分量,空心圆表示采样像素点的UV分量。
MJPEG
M-JPEG源于JPEG压缩技术,其中每一帧图像都分别使用JPEG编码,不考虑视频流中不同帧之间的变化,只单独对某一帧进行压缩。
1.就压缩率来说,H.264远远优于M-JPEG,H.264的压缩比一般能达到1:50甚至1:100以上,而M-JPEG压缩比一般小于1:20;同时由于高压缩率,经H.264压缩出的图像数据量远远小于M-JPEG,更利于实时传输,占用网络带宽更少。
2.图像质量:由于M-JPEG压缩率较小,所以能达到跟原图像接近的画质和清晰度。而H.264为了满足高压缩率,所以在图像质量上略有损失。
H.265又称为HEVC(全称High Efficiency Video Coding,高效率视频编码,本文统称为H.265),是ITU-T H.264/MPEG-4 AVC标准的继任者。H.265旨在在有限带宽下传输更高质量的网络视频,理论上H.265比H.264效率提高30-50%(尤其是在更高的分辨率情形下),H.265标准也同时支持4K(4096×2160)和8K(8192×4320)超高清视频。
ijkplayer
- ijkplayer:一个基于FFmpeg的开源Android/iOS平台的视频播放器,由B站开发
srs
是国人写的一款非常优秀的开源流媒体服务器,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群。
一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT
nginx
- nginx:免费开源web服务器,常用来配置流媒体服务器。nginx-rtmp-module,NGINX-based Media Streaming Server
websocket介绍
WebSocket(为了实现客户端、浏览器实时与服务器通信)
是HTML5的一种新的协议,Websocket是真正实现了全双工通信的服务器向客户端的互联网技术,是单个TCP连接上进行全双工通信协议
全双工通讯传输协议
允许数据在两个方向上同时传输 。双向传输的意思
半双工:可以双向传输,但是同一时刻只能一个方向传输
半工:单向传输数据
WebSocket与Socket的区别
WebSocket拥有完整的应用层协议,包含一套标准的API
Socket是一组接口,是应用层与TCP/IP协议通信的中间软件抽象层,
HTTP与WebSocket区别
http是短连接,请求之后会关闭连接。
WebSocket长连接,只需通过一次请求初始化连接,然后所有的请求和响应都是通过这个TCP连接进行通信。
WebSocket特点
与http协议有良好的兼容性
建立在TCP协议之上,与http同属于'应用层
数据量小、性能开销小、通信高效
可以发送文本和二进制
可以与任意服务器通信
握手阶段采用http协议,默认端口是80和443
协议标识字符ws、加密wss
服务器可以主动向客户端请求
simulcast和SVC
它们会在发送端增大码流的发送,将数据先传给服务端,然后由服务端根据接收端带宽的不同,选择合适的码流下发。对于网络较差的用户,传输清晰度低的码流,对于网络较好的用户,传输高清晰度的码流。所以这两种技术对于发送方的带宽和质量有非常高的要求。
Simulcast直译过来是多播的意思,其实就是一个客户端发送多条不同码率大小的流,为了达到这样的效果,客户端会对同一帧画面进行不同分辨率的编码来达到降低码率的目的。
可伸缩视频编码SVC(Scalable Video Coding)技术是H.264标准的一个扩展,最初由JVT在2004年开始制定。H.264 SVC是H.264标准的扩展部分,SVC扩展部分引入了一种传统H.264 AVC不存在的概念——编码流中的层。基本层编码最低层的时域、空域和质量流;增强层以基本层作为起始点,对附加信息进行,从而在解码过程中重构更高层的质量、分辨率和时域层。通过解码基本层和相邻增强层,解码器能生成特定层的视频流。
SVC与Simulcast最大的区别:SVC上传的是一路码流,但这一路码流是由多层构成的。服务端会按照不同接收端的带宽大小,选择传输不同的层。而Simulcast上传的是多路流,一般分为小、中、大三路。Simulcast的好处在于,每一路流都是独立的,所以可以对每一路流使用硬件编解码器,而 SVC的分层方式目前没有硬件支持,所以无法通过硬件加速。