iOS开发iOS小记iOS视频开发

视频直播首帧速度优化

2016-11-23  本文已影响702人  倾剑飞血

直播在2016年是一个非常火热的领域,我也有幸在今年参与了新浪微博直播客户端的开发,在此分享一下关于直播开发的一些经验。

1.视频直播的基本原理

视频直播的过程大概由这么几个部分构成:

直播架构.jpg

整个直播流转的过程是:推流端将视频流推向源服务器,源服务器对视频流进行编码或者转存,CDN负责负载均衡与缓存,CDN节点从源服务器获取视频流,播放端再从CDN上把视频流拉下来。

2.不同的直播协议

#EXTM3U                     m3u文件头,必须放在第一行
#EXT-X-MEDIA-SEQUENCE       第一个TS分片的序列号
#EXT-X-TARGETDURATION       每个分片TS的最大的时长
#EXT-X-ALLOW-CACHE          是否允许cache
#EXT-X-ENDLIST              m3u8文件结束符
#EXTINF                     extra info,分片TS的信息,如时长,带宽等

里面保存了一个一个.ts格式的视频分片文件路径


m3u8.jpg

直播流会首先下载当前生成好的m3u8文件,再去一个一个下载里面的分片视频,所以对于源服务器来讲,生成好了一个m3u8文件之后,客户端才可能会拉到这个视频流,这也造成了HLS协议高延迟的问题。倘若一个m3u8文件里面所有的分片长度为10s,那么客户端拉到这个视频流的延迟至少为10s。

3.直播延迟问题

随着视频直播领域变得越来越火,直播的延迟问题也日趋收到开发者的关注,根据不同也业务需求,厂商对延迟的要求也有所不同,美女秀场直播2~5s之间可以忍受,对于在线教育来讲1s左右才能保证正常的教学需求。总体来看,目前影响直播延迟基本有这么几种原因:

4.H.264编码

H264logo.jpg

我们知道视频本身是由一张一张的图片构成,快速播放起来欺骗我们的眼睛,让我们觉得图片里面的场景是动态的。但是如果一个1080p的视频,以60帧的帧率来播放,在视频完全不压缩的情况下,将是一个庞然大物,单单其中的一帧图片就要好几M。所以大家发明了很多视频编码的来将视频进行压缩。压缩的基本思路就是将视频中一张一张完整的图片,有变化的部分存下来,一样的部分就只存一张就好了,去除了冗余的部分视频就会小得多。
我们让一部分帧保存了完整的图片,对于这种帧我们叫做I帧,如果I帧可以seek,我们将它叫做关键帧。两个I帧之间叫做一个GOP。
只保存了变化部分的帧,我们叫做参考帧,其中又分为前向参考帧(P帧)和双向参考帧(B帧)。参考帧的意思就是根据I帧或者P帧进行参考,决定自己保留图片中的哪部分内容。参考帧越多,尤其是B帧越多,这个视频就越小,因为图片保留的部分就越少。


H.264帧排布.jpg

可以看到,B帧需要前后都要参考,虽然更多的B帧可以更好的压缩视频的体积,但是对于编解码也变得更加的困难,因为当我收到一个B帧之后,我必须等到后面有一个P帧或者I帧出现我才能进行解码,这对于直播的流畅性来讲是有影响的。

5.对于直播首帧的优化

上一篇下一篇

猜你喜欢

热点阅读