ffmpeg推拉流优化方案
文章目录
- ffmpeg推拉流优化方案
- 一、卡顿优化
- 设备老旧
- 视频流音视频不同步
- 网络
- 二、延时优化
- 三、传输协议优化
- 四、首屏秒开优化
- 服务器做优化
- 客户端优化
- 五、弱网优化
- 六、DNS劫持优化
- 七、服务端cdn优化
主要从以下几点来优化
- 卡顿优化
- 延时优化
- 传输协议优化
- 首屏秒开优化
- 弱网优化
- DNS劫持优化
- 服务端cdn优化
一、卡顿优化
视频播放端卡顿主要有以下几点原因:
设备老旧
设备太老,CPU和GPU处理性能过低,计算解码时间过长,导致音视频卡顿
视频流音视频不同步
- 服务端编码视频流参数配置有问题
- 拉取的视频流音画不同步。例声音连续播放,但是画面卡住
上述需要优化的点有:
- 设置合理的配置参数,合理的帧率、码率、分辨率和I帧(关键帧)的间隔。
- 调整编解码算法,如按照视频编码H.264/H.265规范,编码完整的视频数据
网络
当网络状况不好时,可以监听网络变化,切换低码率的视频流拉取,减少卡顿的出现
二、延时优化
低延时是直播播放的主要要求之一。实现低延时需要需要根据响应的阶段执行不同的优化方案
1.采集处理数据阶段 – 处理数据的延时-美颜、滤镜等
在采集到音视频数据后,需要增加一些视频效果,如美颜、水印、滤镜等效果,这些操作会耗费大量的CPU资源,可以将这部分交由GPU处理,可以大大减少处理数据的延时
2.编码阶段 – 编码耗时的帧,设置了不合理的参数值
- 编码前丢帧,减少编码的耗时。例如丢掉B帧,B帧解码时需要依赖前后视频帧(I或P帧),会增加延时。所以在编码前丢弃B帧,不仅能降低编解码耗时,同时也能降低带宽开销。
- ffmpeg有两个参数
probesize:获得文件内容的大小,适当的大小可以减少延迟,太大会增加延时,太小会造成卡顿的现象
analyzeduration:解析媒体所需要花销的时间,这里设置的值越高,解析的越准确,如果在直播中为了降低延迟,这个可以设置得低一些
三、传输协议优化
应用层传输协议采用HTTP-FLV协议或者RTMP协议,这两个协议延时低,可以再网络请求和响应时快速传输数据,减少延时
RTMP(Real Time Message Protocol、实时信息传输协议)是应用层协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。
四、首屏秒开优化
在直播中,往往需要快速的显示首屏画面,防止黑屏带来的用户体验差,这个时候需要做首屏秒开优化
服务器做优化
GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。
所以在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。
- 服务器缓存GOP,GOP的第一帧是关键帧(I帧),所以无需下载整个GOP,只需下载收个关键帧解码播放,就能达到首帧秒开
客户端优化
- 为了加快渲染速度,在做首帧渲染时,不做音视频同步,后面再进行同步
由于人们对音频的变化比较明显,音视频同步通常采用视频追音频的方案进行同步,所以在首帧不做音视频同步,可以快速的渲染出图像,而不必等待音频解码,做同步再渲染
- 当网络比较差时,对带宽进行监测,根据带宽切换合适的码率播放视频,缩短首帧的渲染时间
- 在首帧渲染之前,做预加载或者延迟加载。减少同时带宽和CPU的暂用,达到首屏快速加载渲染
五、弱网优化
- 前面提到的根据带宽,拉取合适的码率、帧率和分辨率来播放
- 推流端使用H.265协议,可以节约40%带宽,但是并不是所有的手机都支持H.265协议,所以需要做额外的控制层。
- 播放端可以通过缓存一定的数据之后再进行播放,减少卡顿次数。但是这种不减少卡顿时间
六、DNS劫持优化
运营商被劫持会向包中加入一些广告和其他无用的东西。需要屏蔽这些无用数据。可以采取以下措施:
- 使用HTTPS通讯
HTTPS在应用层增加了SSL协议,不同于TCP/IP三次握手,它需要其次握手,在连接阶段,采用非对称加密,来防止中间人攻击,但是相对的也会增加性能损耗。
- 数据安全校验-MD5、SHA校验
匹配数据的md5值,防止被篡改 - 使用HttpDNS技术
使用自建的httpDNS服务器或者阿里云DNS服务器,防止运营商解析DNS被劫持
七、服务端cdn优化
在分发的时候使用cdn服务,通过DNS重定向技术访问用户最近的CDN节点,同时用户和这个节点做交互。